diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a9e2d5..789a27d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,7 +80,7 @@ jobs: ~/.cache/esphome ~/.platformio .esphome/check - key: firmware-${{ runner.os }}-esphome-${{ steps.esphome.outputs.version }}-${{ hashFiles('home-like-2432s028.yaml', 'guition-4848s040.yaml', 'packages/**', 'components/**') }} + key: firmware-${{ runner.os }}-esphome-${{ steps.esphome.outputs.version }}-${{ hashFiles('home-like-2432s028.yaml', 'guition-4848s040.yaml', 'elecrow-crowpanel7.yaml', 'packages/**', 'components/**') }} restore-keys: | firmware-${{ runner.os }}-esphome-${{ steps.esphome.outputs.version }}- - name: tools/check.sh --firmware diff --git a/AGENTS.md b/AGENTS.md index ae4246c..982c70f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,11 +3,11 @@ The preferred route for new users is docs/EASY_SETUP.md: ESP Screen Manager plus remote ESPHome packages. No token or blueprint needed. Tiles live in the persistent add-on data; Wi-Fi/API/OTA stay in the device's own ESPHome YAML. Read -docs/RELEASING.md before publishing updates. Main distributes both boards. +docs/RELEASING.md before publishing updates. Main distributes every board. Every push to GitHub is a release: always also bump the add-on version in screen_manager/config.yaml (with a CHANGELOG line), otherwise HA won't see an update. A screen's YAML is packages/core.yaml (shared by every board) plus one file under packages/boards/; -packages/.yaml and the two profiles in the root only include them. Read docs/PROFILES.md before +packages/.yaml and the profiles in the root only include them. Read docs/PROFILES.md before touching them: a board-dependent number is a `${NAME}` in the board file, board-only code inside a shared lambda is a hook substitution there, and `tools/check_packages.py` (run by tools/check.sh) keeps the boards complete. @@ -26,10 +26,18 @@ docs/GUITION.md. Don't carry over the CYD layout or the XPT2046 calibration. Verify touch with tools/verify_gt911.py and keep the CYD regressions green. Don't configure wallbox relays as part of display support. +## Elecrow board + +The Elecrow CrowPanel 7.0" (DIS08070H, ESP32-S3-WROOM-1-N4R8) has `packages/boards/elecrow-crowpanel7.yaml`: +800×480 through `mipi_rgb`, GT911 on the ESP32-S3's USB pins (`elecrow_usb_phy.h` frees them; no interrupt pin, no +PCA9557 writes, `scan: false`), the Guition's vertical sizes across a wider page, no rotation. It has 4 MB of flash: the +CYD's budget applies (`tools/check.sh --firmware`), and the board file's partition table, icon fonts at 2 bits a pixel +and the notes in docs/ELECROW.md are what keep it inside. Read docs/ELECROW.md before touching it. + # Working instructions for LLMs and developers -This project drives two boards: the CYD ESP32-2432S028 with ILI9341 + XPT2046 (320×240, -LVGL 90°) and the Guition above. Read README.md, README_EXTENDED.md and docs/ before installing. The owner can +This project drives three boards: the CYD ESP32-2432S028 with ILI9341 + XPT2046 (320×240, +LVGL 90°), the Guition above and the Elecrow above. Read README.md, README_EXTENDED.md and docs/ before installing. The owner can physically tap; an agent cannot replace that with software coordinates. ## Installing a new screen @@ -44,7 +52,7 @@ physically tap; an agent cannot replace that with software coordinates. crosshairs. `tools/calibrate.py` with docs/CALIBRATING.md is the USB route for a panel that needs measuring; ask for physical taps per target, and wait for confirmation that the measurement screen is visible. A successful build is not a flash. - Guition: GT911 reports pixels; verify with tools/verify_gt911.py, no ADC calibration. + Guition and Elecrow: GT911 reports pixels; verify with tools/verify_gt911.py, no ADC calibration. 3. Pair with the owner's own Home Assistant through the ESPHome integration. Read real entity IDs and supported attributes; don't make up entities. 4. Choose the tiles in ESP Screens. Don't test real device actions without the @@ -83,15 +91,15 @@ and screens for lookups and tests. If that file is missing you are not on his ma and LVGL 90°. A changed orientation also requires a new projection/tests. - Run `tools/check.sh` on code changes (the Python tests, every C++ test, the package check, the icon generator's check, the editor's tests, types and build); on a firmware change also `tools/check.sh --firmware`, which - compiles both boards and applies the CYD's flash budget (docs/RELEASING.md step 2). CI runs the + compiles every board and applies the flash budget to the 4 MB boards, the CYD and the Elecrow (docs/RELEASING.md step 2). CI runs the same script. Firmware tests and hardware acceptance are different checks. - `diagnostics/run_ui_test.py` renders without HA actions; don't touch the screen during that test. Use `--name` for the expected device identity. `diagnostics/send_layout.py` pushes a demo layout with every card type to a screen via the API inbox (no HA actions); the manager restores the real - layout within ~25 s. Guition: `capture_ui.py` saves the LVGL render as a PNG. - Without a screen: `tools/render_topbar.py` renders the real top-bar code for both - boards via the ESPHome host + SDL2 to `.esphome/render-topbar/out/sheet.png`. + layout within ~25 s. Guition and Elecrow: `capture_ui.py` saves the LVGL render as a PNG. + Without a screen: `tools/render_topbar.py` renders the real top-bar code for every + board via the ESPHome host + SDL2 to `.esphome/render-topbar/out/sheet.png`. - Share through Git. Don't stage secrets, measurements, binaries, logs, build caches, or local device profiles. - No automatic firmware upload to an arbitrary connected port. diff --git a/README.md b/README.md index 47ca8a3..1d46000 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Thank you! I work on this project with a lot of love, and every bit of support h panel costs a fraction of that, sits on a table or in a wall box, and is always at hand for the lights, the heating or the vacuum. -**What.** Firmware for two affordable panels, the 2.8-inch CYD and the 4-inch Guition, with up to +**What.** Firmware for three affordable panels, the 2.8-inch CYD, the 4-inch Guition and the 7-inch Elecrow CrowPanel, with up to 48 tiles over eight pages: lights, climate, blinds and curtains, the vacuum, media, the weather, history graphs, clocks and timers, and on a Guition your cameras. A tile can take the whole page, one big switch you push without looking, and a tile can go to another page. An automation can put an alert on every screen when someone rings @@ -227,7 +227,7 @@ For Home Assistant OS with Apps/Add-ons on **aarch64 or amd64**: 2. Install **ESP Screen Manager**, start the app, and open **ESP Screens**. ESPHome Device Builder is optional: the ESPHome CLI is already in this app. 3. Connect the screen with a USB data cable to the **Home Assistant machine** - and choose **New screen** in the sidebar: CYD or Guition, a name, the USB port, and + and choose **New screen** in the sidebar: CYD, Guition or Elecrow CrowPanel 7.0", a name, the USB port, and **Install**. If Wi-Fi is missing from the ESPHome `secrets.yaml`, the window asks for it once and ESP Screens only adds the missing lines. The profile with unique API and OTA keys goes into the ESPHome folder; the build @@ -237,7 +237,7 @@ For Home Assistant OS with Apps/Add-ons on **aarch64 or amd64**: Choose **Download** under **Install via**: ESP Screens builds the firmware, and you put it on the screen from your own computer with [ESPHome Web](https://web.esphome.io) in Chrome or Edge. After that, updates go over Wi-Fi as usual. -4. **CYD:** go through the calibration on the screen. **Guition:** uses GT911 +4. **CYD:** go through the calibration on the screen. **Guition and Elecrow:** use GT911 without resistive calibration. Then pair the discovered ESPHome device in **Settings → Devices & services** using the API key the window shows after installation (copy button). Grant the device permission to diff --git a/README_EXTENDED.md b/README_EXTENDED.md index f67eaa6..8d04978 100644 --- a/README_EXTENDED.md +++ b/README_EXTENDED.md @@ -550,6 +550,7 @@ take it from, and the same `FIRMWARE_VERSION` in `screen_manager/app/core.py`. - [Complete installation from ESP Screens](docs/EASY_SETUP.md) - [ESP Screens with Home Assistant Container (Docker)](docs/DOCKER.md) - [Guition hardware, mounting, and rotation](docs/GUITION.md) +- [Elecrow CrowPanel 7.0" hardware, touch and flash](docs/ELECROW.md) - [CYD calibration and USB diagnostics](docs/CALIBRATING.md) - [Camera images and album covers](docs/CAMERA.md) - [Troubleshooting](docs/TROUBLESHOOTING.md) diff --git a/components/smart_display/__init__.py b/components/smart_display/__init__.py index 497d5f0..6eef24d 100644 --- a/components/smart_display/__init__.py +++ b/components/smart_display/__init__.py @@ -4,19 +4,26 @@ screen_manager/translations/nl.json, with English for any key it lacks, becomes one table in main.cpp (screen_text_gen.py, screen_text.h). The shared core sets it from the LANGUAGE substitution, which ESP Screens writes into a screen's YAML. + +`smart_display: partitions: 4mb_wide_slots` (firmware 0.2.79) builds with one of the partition tables of partitions.py +instead of ESPHome's own: two update slots of 1,984 KB on a 4 MB ESP32-S3, which the Elecrow CrowPanel 7.0" needs. """ import logging import esphome.codegen as cg +from esphome.components import esp32 import esphome.config_validation as cv +from esphome.core import CORE +from esphome.helpers import write_file_if_changed -from . import screen_text_gen +from . import partitions, screen_text_gen CODEOWNERS = [] AUTO_LOAD = ["json"] _LOGGER = logging.getLogger(__name__) CONF_LANGUAGE = "language" +CONF_PARTITIONS = "partitions" def _language(value): @@ -26,7 +33,10 @@ def _language(value): return value -CONFIG_SCHEMA = cv.Schema({cv.Optional(CONF_LANGUAGE, default="en"): _language}) +CONFIG_SCHEMA = cv.Schema({ + cv.Optional(CONF_LANGUAGE, default="en"): _language, + cv.Optional(CONF_PARTITIONS): cv.one_of(*partitions.TABLES, lower=True), +}) async def to_code(config): @@ -36,3 +46,8 @@ async def to_code(config): # ESP Screens only writes languages it has; a hand-written one it lacks builds in the nearest it does have. _LOGGER.warning("No translation for %s yet; the screen's texts are in %s", wanted, language) cg.add_global(cg.RawStatement(code)) + if CONF_PARTITIONS in config: + # ESPHome writes no partitions.csv of its own when one is among the extra build files (esp32.copy_files). + table = CORE.relative_build_path("smart_display_partitions.csv") + write_file_if_changed(table, partitions.TABLES[config[CONF_PARTITIONS]]) + esp32.add_extra_build_file("partitions.csv", table) diff --git a/components/smart_display/elecrow_usb_phy.h b/components/smart_display/elecrow_usb_phy.h new file mode 100644 index 0000000..3bc5cd2 --- /dev/null +++ b/components/smart_display/elecrow_usb_phy.h @@ -0,0 +1,30 @@ +#pragma once +// The Elecrow CrowPanel 7.0" wires its GT911 touch I2C to GPIO19 and GPIO20, the ESP32-S3's USB D- and D+. The ROM +// leaves the USB_SERIAL_JTAG PHY on those pads, and ESP-IDF's I2C driver cannot take them back: the bus reads as +// "I2C software timeout" and the touch never answers (esphome/esphome#15356, ESPHome 2026.3+). This runs before any +// ESPHome component (a static constructor at priority 101): the PHY lets the pads go, and both become plain GPIOs +// with their pull-ups, as the I2C driver expects to find them. The board's USB-C port is a CH340 on UART0, so nothing +// is lost. +// +// ESPHome includes every header of the component in every build, so the code is behind a flag only the Elecrow's board +// file sets (`-DESP_SCREENS_FREE_USB_PADS=1`, packages/boards/elecrow-crowpanel7.yaml): the CYD has no such peripheral, +// and the Guition, an ESP32-S3 too, keeps its USB. +#if defined(ESP_SCREENS_FREE_USB_PADS) && ESP_SCREENS_FREE_USB_PADS +#include "hal/usb_serial_jtag_ll.h" +#include "soc/io_mux_reg.h" +#include "soc/usb_serial_jtag_reg.h" + +namespace elecrow { +static __attribute__((constructor(101))) void release_usb_pads() { + usb_serial_jtag_ll_phy_enable_pad(false); + CLEAR_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_USB_PAD_ENABLE); + CLEAR_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_DP_PULLUP); + for (uint32_t reg : {IO_MUX_GPIO19_REG, IO_MUX_GPIO20_REG}) { + PIN_FUNC_SELECT(reg, PIN_FUNC_GPIO); + PIN_INPUT_ENABLE(reg); + REG_SET_BIT(reg, FUN_PU); + REG_CLR_BIT(reg, FUN_PD); + } +} +} // namespace elecrow +#endif diff --git a/components/smart_display/guition_diagnostics.h b/components/smart_display/guition_diagnostics.h index 9d4b273..a9b1231 100644 --- a/components/smart_display/guition_diagnostics.h +++ b/components/smart_display/guition_diagnostics.h @@ -1,18 +1,22 @@ #pragma once +#include + #include "lvgl.h" #include "esphome/core/log.h" -// On-demand 240x240 diagnostic image of LVGL's rendered screen. Nothing is -// allocated or streamed during normal use. The RGB display signal itself -// still needs a physical visual check. +// On-demand diagnostic image of LVGL's rendered screen at half its resolution (240x240 on the Guition, 400x240 on +// the Elecrow): every second pixel of every second row. Nothing is allocated or streamed during normal use. The RGB +// display signal itself still needs a physical visual check. The geometry check takes the panel's own size. namespace guition { +inline int screen_w() { return lv_display_get_horizontal_resolution(lv_display_get_default()); } +inline int screen_h() { return lv_display_get_vertical_resolution(lv_display_get_default()); } inline bool check_geometry(lv_obj_t *obj) { if (lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return true; bool ok = true; lv_area_t area; lv_obj_get_coords(obj, &area); if (lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE) && - (area.x1 < 0 || area.y1 < 0 || area.x2 >= 480 || area.y2 >= 480)) { + (area.x1 < 0 || area.y1 < 0 || area.x2 >= screen_w() || area.y2 >= screen_h())) { ESP_LOGE("ui_test", "GEOMETRY FAIL clickable=(%d,%d)-(%d,%d)", area.x1, area.y1, area.x2, area.y2); ok = false; @@ -32,7 +36,7 @@ inline void snapshot_begin() { overlay = nullptr; snapshot = lv_snapshot_take(lv_screen_active(), LV_COLOR_FORMAT_RGB565); snapshot_row = 0; - if (!snapshot || snapshot->header.w != 480 || snapshot->header.h != 480) { + if (!snapshot || (int) snapshot->header.w != screen_w() || (int) snapshot->header.h != screen_h()) { if (snapshot) lv_draw_buf_destroy(snapshot); snapshot = nullptr; ESP_LOGE("ui_image", "IMAGE FAIL allocation/dimensions"); @@ -41,10 +45,10 @@ inline void snapshot_begin() { for (uint32_t i = 0; i < lv_obj_get_child_count(lv_layer_top()); ++i) if (!lv_obj_has_flag(lv_obj_get_child(lv_layer_top(), i), LV_OBJ_FLAG_HIDDEN)) { overlay = lv_snapshot_take(lv_layer_top(), LV_COLOR_FORMAT_ARGB8888); - if (overlay && (overlay->header.w != 480 || overlay->header.h != 480)) { lv_draw_buf_destroy(overlay); overlay = nullptr; } + if (overlay && ((int) overlay->header.w != screen_w() || (int) overlay->header.h != screen_h())) { lv_draw_buf_destroy(overlay); overlay = nullptr; } break; } - ESP_LOGI("ui_image", "IMAGE BEGIN 240 240%s", overlay ? " with top layer" : ""); + ESP_LOGI("ui_image", "IMAGE BEGIN %d %d%s", screen_w() / 2, screen_h() / 2, overlay ? " with top layer" : ""); } // The top layer's pixel over the page's, as the panel shows them. inline uint16_t layered(uint16_t pixel, int x, int y) { @@ -62,15 +66,17 @@ inline void snapshot_next_row() { const auto *row = reinterpret_cast( snapshot->data + snapshot_row * 2 * snapshot->header.stride); static constexpr char hex[] = "0123456789abcdef"; - char line[961]; - for (int x = 0; x < 240; ++x) { + // Four hex digits a pixel; the widest panel is 800 px, 400 in the image. + static char line[1601]; + const int columns = std::min(screen_w() / 2, 400); + for (int x = 0; x < columns; ++x) { uint16_t pixel = layered(row[x * 2], x * 2, snapshot_row * 2); for (int digit = 0; digit < 4; ++digit) line[x * 4 + digit] = hex[(pixel >> (12 - digit * 4)) & 15]; } - line[960] = 0; + line[columns * 4] = 0; ESP_LOGI("ui_image", "ROW %03d %s", snapshot_row, line); - if (++snapshot_row == 240) { + if (++snapshot_row == screen_h() / 2) { lv_draw_buf_destroy(snapshot); snapshot = nullptr; if (overlay) lv_draw_buf_destroy(overlay); diff --git a/components/smart_display/partitions.py b/components/smart_display/partitions.py new file mode 100644 index 0000000..b6c7a04 --- /dev/null +++ b/components/smart_display/partitions.py @@ -0,0 +1,23 @@ +"""Partition tables a board file can ask for with `smart_display: partitions:` (firmware 0.2.79). + +ESPHome's own table for 4 MB of flash keeps 448 KB for NVS and gives the two update slots 1,792 KB each. The screen's +preferences take a few KB of NVS (ESP-IDF's own two-slot example keeps 16 KB), and the Elecrow CrowPanel 7.0" needs +the room: its firmware is the Guition's, which does not fit 1,792 KB. The tables live here, as text, because a board +file over GitHub cannot carry a file of its own; __init__.py hands the chosen one to ESPHome as the build's +partitions.csv. A table never changes once a screen is flashed with it: an update over Wi-Fi writes into the other slot +of the table the screen has, and only a USB install lays the flash out anew. +""" + +# 4 MB as two update slots of 0x1F0000 bytes, the largest 64 KB-aligned pair that fits, and 64 KB of NVS at the end; +# otadata and phy_init where ESPHome puts them. Offsets are explicit so the table is the same on every build. +TABLES = { + '4mb_wide_slots': """\ +# ESP Screens: 4 MB ESP32-S3 with two update slots of 1,984 KB (components/smart_display/partitions.py). +# Name, Type, SubType, Offset, Size +otadata, data, ota, 0x9000, 0x2000 +phy_init, data, phy, 0xB000, 0x1000 +app0, app, ota_0, 0x10000, 0x1F0000 +app1, app, ota_1, 0x200000, 0x1F0000 +nvs, data, nvs, 0x3F0000, 0x10000 +""", +} diff --git a/diagnostics/capture_ui.py b/diagnostics/capture_ui.py index 6a44263..39b3e37 100644 --- a/diagnostics/capture_ui.py +++ b/diagnostics/capture_ui.py @@ -1,4 +1,4 @@ -"""Save a Guition LVGL diagnostic snapshot as PNG through its encrypted API.""" +"""Save a Guition or Elecrow LVGL diagnostic snapshot as PNG through its encrypted API (half the panel's size).""" import argparse import asyncio from pathlib import Path @@ -9,16 +9,16 @@ import yaml from aioesphomeapi import APIClient, LogLevel -def png(rows): +def png(rows,width,height): pixels=bytearray() - for y in range(240): + for y in range(height): pixels.append(0) - for x in range(240): + for x in range(width): p=int(rows[y][x*4:x*4+4],16) pixels.extend((((p>>11)&31)*255//31,((p>>5)&63)*255//63,(p&31)*255//31)) def chunk(name,data): return struct.pack('>I',len(data))+name+data+struct.pack('>I',zlib.crc32(name+data)&0xffffffff) - return b'\x89PNG\r\n\x1a\n'+chunk(b'IHDR',struct.pack('>2I5B',240,240,8,2,0,0,0))+chunk(b'IDAT',zlib.compress(pixels))+chunk(b'IEND',b'') + return b'\x89PNG\r\n\x1a\n'+chunk(b'IHDR',struct.pack('>2I5B',width,height,8,2,0,0,0))+chunk(b'IDAT',zlib.compress(pixels))+chunk(b'IEND',b'') async def main(): @@ -33,18 +33,21 @@ async def main(): await client.connect(login=True) try: _,services=await client.list_entities_services() - done=asyncio.Event();rows={};errors=[] + done=asyncio.Event();rows={};errors=[];size=[240,240] def log(msg): text=msg.message.decode(errors='replace') if isinstance(msg.message,bytes) else msg.message - m=re.search(r'ROW (\d{3}) ([0-9a-f]{960})',text) - if m:rows[int(m[1])]=m[2] + # The firmware says the image's size first: 240x240 on a Guition, 400x240 on an Elecrow. + b=re.search(r'IMAGE BEGIN (\d+) (\d+)',text) + if b:size[:]=[int(b[1]),int(b[2])] + m=re.search(r'ROW (\d{3}) ([0-9a-f]{960,1600})',text) + if m and len(m[2])==size[0]*4:rows[int(m[1])]=m[2] if 'IMAGE FAIL' in text:errors.append(text);done.set() if 'IMAGE COMPLETE' in text:done.set() client.subscribe_logs(log,log_level=LogLevel.LOG_LEVEL_INFO,dump_config=False) await client.execute_service(next(s for s in services if s.name=='ui_snapshot'),{}) await asyncio.wait_for(done.wait(),timeout=60) - if errors or set(rows)!=set(range(240)):raise ValueError(f'Incomplete image: {len(rows)}/240 rows; {errors}') - with args.output.open('xb') as f:f.write(png(rows)) + if errors or set(rows)!=set(range(size[1])):raise ValueError(f'Incomplete image: {len(rows)}/{size[1]} rows; {errors}') + with args.output.open('xb') as f:f.write(png(rows,*size)) print(f'PASS: LVGL render saved to {args.output}') finally:await client.disconnect() diff --git a/docs/CAMERA.md b/docs/CAMERA.md index 66fa286..1b47d8a 100644 --- a/docs/CAMERA.md +++ b/docs/CAMERA.md @@ -1,6 +1,7 @@ # Camera images on a Guition -App 0.2.66 with firmware 0.2.57 shows camera images on a Guition 4848S040: +App 0.2.66 with firmware 0.2.57 shows camera images on a Guition 4848S040 (and, from app 0.2.93 with firmware +0.2.79, on an Elecrow CrowPanel 7.0" at its own 800×480 size, docs/ELECROW.md; "Guition" below reads for both): - **A camera tile.** Add a `camera.*` or `image.*` entity as a tile. A tap opens the image full screen, with the round back key at the top left like every card, and a spinner until the first diff --git a/docs/EASY_SETUP.md b/docs/EASY_SETUP.md index 25f5eba..7a1cea8 100644 --- a/docs/EASY_SETUP.md +++ b/docs/EASY_SETUP.md @@ -15,6 +15,7 @@ ESPHome Device Builder is optional: | --- | --- | | CYD | ESP32-2432S028, 320×240, ILI9341 and XPT2046 | | Guition | ESP32-S3-4848S040, 480×480, ST7701S and GT911 | +| Elecrow CrowPanel 7.0" | DIS08070H, ESP32-S3-WROOM-1-N4R8, 800×480 RGB and GT911 ([ELECROW.md](ELECROW.md)) | Other screens with roughly the same name can have different pins. Use the board profile that matches the hardware. Use a USB cable that supports data. @@ -38,8 +39,8 @@ Use the GitHub version for updates; a local test add-on is a separate app. 1. Connect the screen with a **USB data cable** to the machine running Home Assistant. With multiple boards: connect them one at a time for the first installation, or check which port belongs to this screen. -2. Click **New screen** in the sidebar of ESP Screens, under your screens. Choose CYD - or Guition and give the screen a name, for example `Kitchen`. The device name +2. Click **New screen** in the sidebar of ESP Screens, under your screens. Choose CYD, + Guition or Elecrow CrowPanel and give the screen a name, for example `Kitchen`. The device name (`kitchen`) follows from that; use **customize** to choose a different one. 3. Wi-Fi: if `wifi_ssid` and `wifi_password` are already in the ESPHome `secrets.yaml`, the screen uses them automatically. If they're missing, or the file doesn't @@ -88,7 +89,7 @@ and survives OTA updates. Use the HA device button **Calibrate touch** to measure again later. For a panel that stays off, or for a measurement report over USB, see [CALIBRATING.md](CALIBRATING.md). -**Guition:** the GT911 touch mapping is baked into the board profile; there's no ADC calibration. +**Guition and Elecrow:** the GT911 touch mapping is baked into the board profile; there's no ADC calibration. ## 3. Pair the screen with Home Assistant diff --git a/docs/ELECROW.md b/docs/ELECROW.md new file mode 100644 index 0000000..4cf55d6 --- /dev/null +++ b/docs/ELECROW.md @@ -0,0 +1,107 @@ +# Elecrow CrowPanel 7.0" — 800 × 480 + +The **Elecrow CrowPanel ESP32 HMI 7.0-inch** (product code **DIS08070H**, hardware V2.0 and V3.0) has a board file of +its own, next to the CYD's and the Guition's: an 800 × 480 IPS panel on the ESP32-S3's own RGB bus, **GT911 +capacitive touch**, an **ESP32-S3-WROOM-1-N4R8** with 4 MB of flash and 8 MB of octal PSRAM, and a backlight on +GPIO 2. It is the Guition's kind of screen, a big RGB panel with capacitive touch, in a wider, landscape form: every +card, the camera images and album covers, the page swipe from the glass edge, the settings on the screen. Two things +differ in kind, and both are below: the **4 MB of flash** (the CYD's budget, not the Guition's 16 MB) and a panel +that is not square, so it **does not turn** (no Rotation entity). + +Hardware source: [Elecrow's wiki](https://www.elecrow.com/wiki/esp32-display-702727-intelligent-touch-screen-wi-fi26ble-800480-hmi-display.html) +and the [ESPHome devices page for the CrowPanel 7.0"](https://github.com/esphome/esphome-devices/pull/1494), whose +panel timings, pins and pitfalls this board file follows. The **CrowPanel *Advance* 7.0"** is a different board with +other pins (ESPHome's `CROWPANEL-ADVANCE-7` model); this file is for the plain CrowPanel 7.0". + +## Files + +- `packages/boards/elecrow-crowpanel7.yaml`: the board file (hardware, the 800 × 480 sizes, the flash measures); the + interface itself is `packages/core.yaml`, shared with both other boards (docs/PROFILES.md). +- `packages/elecrow.yaml`: what a screen builds from over GitHub; `elecrow-crowpanel7.yaml` in the root is the same for + a build from a checkout; `installers/elecrow.yaml` the block for a hand-written ESPHome configuration. +- `components/smart_display/elecrow_usb_phy.h`: frees the USB pins for the touch I2C (below). +- `components/smart_display/partitions.py`: the partition table that makes the firmware fit (below). +- `tools/verify_gt911.py`: physical pixel check, as on the Guition; no resistive calibration. + +Choose **Elecrow CrowPanel · 7 inch** under **New screen** in ESP Screens (app 0.2.93+). The Guition's own parts (the +Rotation choice) stay off for it; everything the Guition can show, it shows. + +## Interface + +Six tiles of **378 × 108 pixels** per page in two columns, the Guition's rows and fonts across a wider page: the +vertical sizes are the Guition's to the pixel, the tiles and the cards take the extra width. The top bar, the tile +labels, the alert card (560 wide, its camera picture 532 × 220), the colour and climate titles and the page keys are +sized for 800 px; the cards that are a share of the page (the setpoint card, the mode keys) simply widen. A camera +opens full screen at 800 × 480; ESP Screens serves the picture in that box (`camera_feed.BOXES['elecrow']`). + +At 133 pixels an inch the Guition's 42 px icons are a shade larger on this panel than on the 4-inch (170 ppi), which +suits a screen that stands further away. + +### Touch + +The GT911 is polled every 20 ms over I2C at 400 kHz, with no interrupt pin and no reset: the **V3.0** has a PCA9557 +I/O expander (I2C 0x18) on the GT911's reset and interrupt lines, and writing it during boot is what breaks the touch +on that revision. It powers up with every pin as an input, a pull-up brings the GT911 out of reset before the firmware +starts, and the driver finds it ready. A bus scan at boot upsets the GT911 too, so `scan: false`. + +The GT911 takes I2C address **0x5D** when GPIO 38 reads low at power-on and **0x14** when it reads high; on this +board it is 0x5D on most units, and a unit that never reports a touch may be a 0x14. Give that screen an Override YAML +in ESP Screens (Screen settings → Override YAML) with: + +```yaml +touchscreen: + address: 0x14 +``` + +**GPIO 19 and 20, the touch I2C, are the ESP32-S3's USB D- and D+.** The ROM leaves the USB PHY on those pads and +ESP-IDF's I2C driver cannot take them back: the bus reads as `I2C software timeout` and the touch never answers +(esphome/esphome#15356, ESPHome 2026.3+). `elecrow_usb_phy.h` runs before any component, as a static constructor, +and lets the pads go; it is behind the build flag `ESP_SCREENS_FREE_USB_PADS`, which only this board file sets, because +ESPHome includes every header of the component in every build and the Guition, an ESP32-S3 too, keeps its USB. The board's USB-C port is a CH340 on UART0, so flashing and the log are unaffected; the +`GPIO19 is used by the USB-Serial-JTAG interface` warnings at build time are expected. + +### Rotation + +A landscape panel with a layout 800 px wide: it does not turn. `ROTATION_SUPPORTED` is `false`, the settings page +shows no rotation row, and the app offers none for this board. + +## Flash + +The ESP32-S3-WROOM-1-**N4**R8 has **4 MB** of flash (the N4; 16 MB in the YAML boot-loops with no log). The firmware +is the Guition's, with camera images; with the Guition's fonts it is **2,028 KB**, and ESPHome's own partition table for +4 MB, two update slots of 1,792 KB with 448 KB kept for NVS, does not hold it. Three measures make it fit with room for +updates, all in the board file, measured with ESPHome 2026.9.0 (the add-on's): + +| Measure | Saves | Where | +|---|---|---| +| Two update slots of **1,984 KB** and 64 KB of NVS instead of 448 KB (the preferences take a few KB; ESP-IDF's own two-slot example keeps 16 KB) | 192 KB more room a slot | `smart_display: partitions: 4mb_wide_slots`, `components/smart_display/partitions.py` | +| The four icon fonts (the 314 tile icons at 42, 26 and 18 px, the 31 big icons at 64 px) at **2 bits a pixel** instead of 4; the text fonts keep their 4 | 156 KB | `font:` in the board file (`!extend` on the core's fonts) | +| The TLS client only; nothing serves TLS | 7 KB | `sdkconfig_options` in the board file | + +That is **1,865,456 bytes, 91.8 %** of a slot: within the CYD's rules (docs/RELEASING.md step 2), in the *tight* band, +and `tools/check.sh --firmware` applies the same budget to this board. Without camera images it is about 1,754 KB, +86 %: drop the `online_image`, `http_request` and `preview_camera` sections, the alert's picture frame and the +`camera_image_seed` image, and empty the camera hooks (`BOOT_CAMERA_HOOKS`, `BOARD_PAINT_FILL`, `CLOSE_CARDS_HOOK`, +`MAY_OPEN_EXTRA`, `TICK_HOOK`, `AWAY_EXTRA`, `ALERT_SHOW_HOOK`) as the CYD's board file has them. The icons at 4 bits +a pixel are the Guition's 156 KB back; they fit only without the camera images, and then at 94 %. + +The partition table is part of the firmware and **never changes once a screen is flashed**: an update over Wi-Fi +writes into the other slot of the table the screen has, and only a USB install (ESP Screens' New screen, or ESPHome +Web with the factory image) lays the flash out anew. A screen flashed with this table keeps it through every update. + +## Panel + +ESPHome's `mipi_rgb` driver with the `RPI` model: the panel takes the pixels straight from the ESP32-S3's LCD +peripheral and needs no initialisation, so the timings are the whole configuration: 15 MHz pixel clock, inverted +(`pclk_inverted: true`, without it the picture tears), horizontal porches 40/48/13 and vertical 1/31/13, the 16 data +pins of Elecrow's schematic. The frame buffer is in PSRAM; LVGL draws in a buffer of 15 % of the screen, the same +number of pixels as the Guition's 25 % of 480 × 480. + +## Checks + +- `python3 tools/check_packages.py`, `esphome config elecrow-crowpanel7.yaml`, `tools/check.sh --firmware`. +- The touch test page and `tools/verify_gt911.py` for the corners; the ghost-touch filter at (0, 0) of the Guition's + GT911 applies here too. +- `diagnostics/capture_ui.py` saves the LVGL render at 400 × 240 (half the panel) as a PNG; `ui_self_test` renders + every card without touching a device. +- A build is not a flash, and a render is not a touch: the owner checks the picture and taps the corners. diff --git a/docs/PROFILES.md b/docs/PROFILES.md index 9af521b..081491a 100644 --- a/docs/PROFILES.md +++ b/docs/PROFILES.md @@ -10,8 +10,9 @@ already drifted apart in small ways. | `packages/core.yaml` | Everything every board shares: the LVGL tree (tiles, cards, overlays, the touch test page), the scripts, the API actions, the entities, the fonts, the globals, and Wi-Fi that never dozes (`power_save_mode: none`, firmware 0.2.74+; the network itself stays in the screen's own YAML). It contains no number that depends on the board: every such value is a `${NAME}` the board file defines. | | `packages/boards/cyd-2432s028.yaml` | The CYD: its hardware (ILI9341 over SPI, XPT2046 resistive touch, backlight, LED), its sizes and font sizes, the code the shared lambdas take from it (the *hooks*, below), and what only a CYD has: the calibration wizard, a page swipe by LVGL's gesture, `ui_self_test`, the two scripts that drive the backlight as a light action, its climate card layout. | | `packages/boards/guition-4848s040.yaml` | The Guition: its hardware (ST7701S RGB, GT911, PSRAM), its sizes, its hooks, and what only a Guition has: camera images (`online_image`, the alert's picture frame), the Rotation entity, the page swipe from the glass edge, the snapshot diagnostics, the climate card with its fan and swing card, the wider tile labels (`!extend` on each tile). | -| `packages/cyd.yaml`, `packages/guition.yaml` | What a screen installed from ESP Screens builds from over GitHub, unchanged in name and place: ESP Screen Manager writes every screen's YAML with `files: [packages/.yaml]`. Each is a few lines: where the fonts are, the components from GitHub, and `packages: {core: !include core.yaml, board: !include boards/.yaml}`. | -| `home-like-2432s028.yaml`, `guition-4848s040.yaml` | The same two files for a build from a checkout (the bench, the manual route of README_EXTENDED.md): the components of the checkout, the fonts from `fonts/`, and the secrets from `secrets.yaml`. | +| `packages/boards/elecrow-crowpanel7.yaml` | The Elecrow CrowPanel 7.0" (app 0.2.93): the Guition's kind at 800×480 on 4 MB of flash. Its hardware (the RGB panel through `mipi_rgb`, GT911, the USB pins freed for the touch I2C), the Guition's vertical sizes across a wider page, the same hooks and sections as the Guition's file except the Rotation (a landscape panel does not turn), and what the flash asks for: a partition table of the component's (`smart_display: partitions`), the icon fonts at 2 bits a pixel (`font:` with `!extend`). docs/ELECROW.md has the numbers. | +| `packages/cyd.yaml`, `packages/guition.yaml`, `packages/elecrow.yaml` | What a screen installed from ESP Screens builds from over GitHub, unchanged in name and place: ESP Screen Manager writes every screen's YAML with `files: [packages/.yaml]`. Each is a few lines: where the fonts are, the components from GitHub, and `packages: {core: !include core.yaml, board: !include boards/.yaml}`. | +| `home-like-2432s028.yaml`, `guition-4848s040.yaml`, `elecrow-crowpanel7.yaml` | The same files for a build from a checkout (the bench, the manual route of README_EXTENDED.md): the components of the checkout, the fonts from `fonts/`, and the secrets from `secrets.yaml`. | ESPHome merges them in this order: the core, then the board file on top of it, then the entry file on top of both. A mapping merges key by key, a list of components with ids merges by id (`!extend` adds to an existing widget or @@ -41,11 +42,14 @@ the board file replaces the core's. `esphome config home-like-2432s028.yaml` sho `assertion_level: SILENT` in its `esp32:` block (firmware 0.2.75+): every board builds its firmware the same way, and `tests/test_easy_package.py` checks it. 2. Fill the sizes table for the new resolution, and go through the hooks: keep, change or empty each one. -3. Add `packages/.yaml` and `.yaml` after the existing entries, `` to `ENTRIES` in +3. Add `packages/.yaml` and `.yaml` after the existing entries, `` to `BOARDS` and `ENTRIES` in `tools/profiles.py` and to `REFS` in `screen_manager/app/core.py` (the boards `installation_yaml()` writes a - profile for), and a `BANDS` entry to `tools/render_topbar.py`. The add-on and the editor still know two boards, - a Guition or not: the board a screen is (`core.py`), `ALERT_LIMITS`, the camera sizes in `camera_feed.py`, and - the editor's New screen choices and `BAR_METRICS` (`web/src`) need the new board too. + profile for), and a `BANDS` entry to `tools/render_topbar.py`. The add-on and the editor know a board as small (the + CYD) or large (`LARGE_BOARDS` in `core.py` and `web/src/store.ts`: a Guition or an Elecrow, the ones that draw + images and take the large cards); a large board reports its name in the value of the "Guition screen type" sensor + (`discover_screens`). `ALERT_LIMITS`, the camera sizes in `camera_feed.py`, the editor's New screen choices + (`InstallerView.vue` and `board_` in every translation) and `BAR_METRICS` need the new board too, and + `tools/check.sh` builds it (with the flash budget when it has 4 MB). The Elecrow (app 0.2.93) is the worked example. 4. `python3 tools/check_packages.py`, `esphome config .yaml`, `tools/check.sh --firmware`. The tiles per page (two columns of three) are still fixed in the firmware, the add-on and the editor diff --git a/elecrow-crowpanel7.yaml b/elecrow-crowpanel7.yaml new file mode 100644 index 0000000..a6a1d61 --- /dev/null +++ b/elecrow-crowpanel7.yaml @@ -0,0 +1,40 @@ +# ESP Screens - an Elecrow CrowPanel 7.0" (DIS08070H, 7-inch 800x480) built from this checkout: the bench and the +# manual route (README_EXTENDED.md, docs/ELECROW.md). +# +# The screen is two packages: packages/core.yaml, which every board shares (the LVGL tree, the cards, the +# scripts, the entities), and packages/boards/elecrow-crowpanel7.yaml with this board's hardware and sizes. +# docs/PROFILES.md says how the files fit together. A screen installed from ESP Screens builds the same two +# files over GitHub through packages/elecrow.yaml; this file only adds what a build from a checkout needs: +# the secrets (api_encryption_key, ota_password, Wi-Fi) from secrets.yaml and the components of this checkout. +substitutions: + FONT_DIR: "fonts" # the fonts next to this file + +packages: + core: !include packages/core.yaml + board: !include packages/boards/elecrow-crowpanel7.yaml + +# The components of this checkout; packages/elecrow.yaml takes them from GitHub. +external_components: + - source: + type: local + path: components + components: [smart_display] + +api: + encryption: + key: !secret api_encryption_key + +ota: + - platform: esphome + password: !secret ota_password + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + # Mains-powered panel: no modem sleep, so HA updates and OTA arrive without beacon latency. + power_save_mode: none + ap: + ssid: "Smartdisplay Fallback Hotspot" + password: !secret ap_password + +captive_portal: diff --git a/installers/cyd.yaml b/installers/cyd.yaml index 86c6c80..57114d5 100644 --- a/installers/cyd.yaml +++ b/installers/cyd.yaml @@ -3,7 +3,7 @@ # The easy route generates a complete file of its own: ESP Screen Manager. packages: screen: - url: https://github.com/MaxGramser/homeassistant_espscreen + url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen ref: main files: [packages/cyd.yaml] refresh: 0s diff --git a/installers/elecrow.yaml b/installers/elecrow.yaml new file mode 100644 index 0000000..13209f5 --- /dev/null +++ b/installers/elecrow.yaml @@ -0,0 +1,9 @@ +# Manual alternative: add this block to the ESPHome wizard configuration. +# Remove the old esp32: block; keep your own esphome:, api:, ota: and wifi:. +# The easy route generates a complete file of its own: ESP Screen Manager. +packages: + screen: + url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen + ref: main + files: [packages/elecrow.yaml] + refresh: 0s diff --git a/installers/guition.yaml b/installers/guition.yaml index 35347b7..a52f426 100644 --- a/installers/guition.yaml +++ b/installers/guition.yaml @@ -3,7 +3,7 @@ # The easy route generates a complete file of its own: ESP Screen Manager. packages: screen: - url: https://github.com/MaxGramser/homeassistant_espscreen + url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen ref: main files: [packages/guition.yaml] refresh: 0s diff --git a/packages/boards/elecrow-crowpanel7.yaml b/packages/boards/elecrow-crowpanel7.yaml new file mode 100644 index 0000000..99b0ae3 --- /dev/null +++ b/packages/boards/elecrow-crowpanel7.yaml @@ -0,0 +1,1049 @@ +# ESP Screens - Elecrow CrowPanel 7.0" board (DIS08070H): 7-inch 800x480 IPS + GT911 capacitive touch, ESP32-S3-WROOM-1-N4R8. +# +# What is in here: the hardware (the RGB panel, touch, backlight, PSRAM), the sizes the shared tree takes from +# this board, the code the shared lambdas take from this board (hooks), and what a big panel has: camera +# images, a page swipe from the glass edge, a climate card with a fan and swing card, and the snapshot +# diagnostics. Everything else (the LVGL tree, the cards, the scripts, the entities) is packages/core.yaml, +# which every board shares; docs/PROFILES.md says how the files fit together, docs/ELECROW.md what this board +# needs. The board is the Guition's kind (a big RGB panel with capacitive touch) in a wider, landscape form: +# the vertical sizes are the Guition's, the tiles and cards take the extra width. Two things differ in kind: +# the ESP32-S3-WROOM-1-N4R8 has 4 MB of flash (the CYD's budget, not the Guition's 16 MB), and the panel is not +# square, so it does not turn a quarter (no Rotation entity). +# +# Two entry files include this: elecrow-crowpanel7.yaml (a build on this computer) and packages/elecrow.yaml +# (the package a screen builds from over GitHub). +substitutions: + + # 0: no drift limit. A press that drifts is still a tap as long as the finger lets go on the tile + # (runtime_tiles::event checks where it let go: LVGL keeps the press on the tile and would click it + # anywhere), and a quick flick is LVGL's gesture, never a tap (the home_page gesture handler in on_boot). + # The CYD keeps a limit because its resistive panel jumps. + TOUCH_MOVE_LIMIT_PX: "0" + # Shortest contact that counts as a tap; a resistive panel bounces, a capacitive one does not. + TOUCH_MIN_PRESS_MS: "20" + # Page swipe starts in this band along the left or right edge (about 5 mm) and needs + # this much travel inward (about 6 mm); a swipe from the middle of the screen does nothing. + EDGE_SWIPE_BAND_PX: "32" + EDGE_SWIPE_TRAVEL_PX: "40" + # A slider let go this close to the left or right edge of the glass (about 1 cm) meant its end when + # that end lies in the band: the panel loses a finger swiped off the glass 30-50 px before the edge. + SLIDER_EDGE_SNAP_PX: "67" + DEVICE_NAME: "elecrow-new" + DEVICE_FRIENDLY_NAME: "My CrowPanel" + + DISPLAY_W: "800" + DISPLAY_H: "480" + LVGL_ROTATION: "0" + TOUCH_SWAP_XY: "false" + TOUCH_MIRROR_X: "false" + TOUCH_MIRROR_Y: "false" + GRID_COL1_X: "16" + GRID_COL2_X: "406" + GRID_ROW1_Y: "0" + GRID_ROW2_Y: "120" + GRID_ROW3_Y: "240" + GRID_ROW4_Y: "360" + GRID_ROW5_Y: "480" + SCROLL_Y: "72" + SCROLL_H: "348" + TILE_W: "378" + TILE_H: "108" + HEADER_Y: "22" + # Holding the top bar opens the settings page (0.2.44+). The two edge bands stay clear: a swipe + # that starts up there still changes the page. + SETTINGS_HOLD_X: "${EDGE_SWIPE_BAND_PX}" + SETTINGS_HOLD_W: "736" + SETTINGS_HOLD_DRIFT_PX: "32" + + # Alert overlay (HA action show_alert), 800x480: one card centred on LVGL's top layer, the Guition's rows in a wider card. + ALERT_CARD_W: "560" + ALERT_CARD_H: "320" + ALERT_ICON_X: "26" + ALERT_ICON_Y: "22" + ALERT_TEXT_X: "90" + ALERT_TEXT_W: "444" + ALERT_TITLE_Y: "26" + ALERT_TITLE_H: "32" # one line of headline; a DOT label only ends in an ellipsis with a height + ALERT_SUBTITLE_Y: "68" + ALERT_SUBTITLE_H: "150" + ALERT_BUTTON_W: "150" + ALERT_BUTTON_H: "60" + ALERT_BUTTON_INSET: "22" + ALERT_TITLE_MAX: "64" # bytes; the label ends one line with an ellipsis + ALERT_BUTTON_MAX: "16" # bytes on the OK button + ALERT_SUBTITLE_MAX: "240" # bytes; wraps over the rows the card has + # An alert with a camera image (firmware 0.2.57+): the image across the top of a taller card, the words under it. + ALERT_CARD_H_IMAGE: "452" + ALERT_IMAGE_INSET: "14" + ALERT_IMAGE_SHIFT: "236" # the icon, title and subtitle move down by the image and a gap + ALERT_SUBTITLE_H_IMAGE: "62" # two lines between the title and the button + # Camera images (firmware 0.2.57+): the boxes ESP Screen Manager sizes a snapshot for (camera_feed.BOXES). + CAMERA_FULL_W: "800" + CAMERA_FULL_H: "480" + CAMERA_THUMB_W: "532" + CAMERA_THUMB_H: "220" + OVERLAY_SLIDER_W: "144" + OVERLAY_SLIDER_H: "300" + OVERLAY_ICON_Y: "148" + TILE_ICON_X: "0" + TILE_ICON_Y: "12" + TILE_TITLE_X: "64" + TILE_TITLE_Y: "17" + TILE_VALUE_X: "64" + TILE_VALUE_Y: "45" + + # Fonts: one size per role, the same files on every board + FONT_TIME_SIZE: "27" # the clock in the top bar + FONT_HEADLINE_SIZE: "27" # card titles + FONT_WATCH_VALUE_SIZE: "38" + FONT_CLOCK_DIGITS_SIZE: "48" + FONT_SETPOINT_SIZE: "64" # the climate card's setpoint + FONT_LABEL_SIZE: "18" # tile titles + FONT_SUBLABEL_SIZE: "16" # tile values and small text + FONT_SUBLABEL_BIG_SIZE: "21" # the top bar and settings rows + FONT_ICON_SIZE: "42" # tile icons + FONT_ICON_MINI_SIZE: "26" # the top bar and card keys + FONT_ICON_BIG_SIZE: "64" # full-page tiles + FONT_WATCH_ICON_SIZE: "18" + + # Tiles and the top bar + TILE_RADIUS: "22" # corner of a tile + TILE_PAD: "12" # inside a tile + TILE_ICON_SIZE: "54" # the icon circle + HEADER_INSET: "16" # the room name and the clock from the glass edge + + # The page bar under the tiles + PAGE_KEY_W: "400" # the previous/next keys under the tiles, each half of the band + PAGE_BAR_H: "60" # the page bar + PAGE_NUMBER_W: "160" # the dots in the middle + PAGE_CHEVRON_INSET: "24" # the chevrons from the outer edge + + # Cards: the round keys and the brightness card + CARD_KEY_X: "16" # a card's round key from the side + CARD_KEY_Y: "16" # from the top + CARD_KEY_SIZE: "60" # its diameter + OVERLAY_TITLE_Y: "30" # the brightness card's title + OVERLAY_VALUE_Y: "70" # its percentage + OVERLAY_SLIDER_Y: "36" # its slider below the centre + OVERLAY_SLIDER_RADIUS: "42" # the slider's corners + OVERLAY_KNOB_PAD: "15" # the knob + COLOR_KEY_X: "-20" # the colour wheel key from the bottom right corner + COLOR_KEY_Y: "-26" + COLOR_KEY_SIZE: "66" # its diameter + COLOR_ARC_SIZE: "60" # the eight arcs in it + COLOR_ARC_W: "15" + COLOR_TITLE_W: "520" # the colour card's title + COLOR_TITLE_Y: "35" + + # The climate card + CLIMATE_TITLE_Y: "30" # the title + CLIMATE_TITLE_W: "520" + CLIMATE_STATUS_Y: "92" # the status line + CLIMATE_CARD_Y: "136" # the setpoint card + CLIMATE_CARD_H: "200" + CLIMATE_CARD_RADIUS: "24" + CLIMATE_KEY_INSET: "18" # the -/+ keys from the card edge + CLIMATE_KEY_SIZE: "116" # their diameter + CLIMATE_KEY_RADIUS: "58" + CLIMATE_NUMBER_Y: "-14" # the setpoint number + CLIMATE_CAPTION_Y: "46" # the word under it + CLIMATE_MODES_Y: "364" # the row of mode keys + CLIMATE_MODES_H: "76" + CLIMATE_MODES_GAP: "10" + CLIMATE_MODE_RADIUS: "38" + + # The mode picker + PICKER_TITLE_Y: "35" # the "Mode" title + PICKER_LIST_Y: "92" # the list of choices + PICKER_LIST_H: "372" + PICKER_PAD: "4" + PICKER_ROW_GAP: "6" + PICKER_COL_GAP: "6" + PICKER_MODE_W: "136" # a mode chip + PICKER_MODE_H: "58" + PICKER_MODE_RADIUS: "22" + PICKER_TITLE_H: "24" # the Fan and Swing captions + PICKER_CHIP_W: "98" # a fan or swing chip + PICKER_CHIP_H: "48" + PICKER_CHIP_RADIUS: "18" + PICKER_CHIP_FONT: "sublabel_big" # the words on them + + # The touch test page + TOUCH_TEST_PAGE_PAINT: "paint_page_soft" # the page + TOUCH_TEST_TITLE: "calibration_touch_check" # the words at the top + TOUCH_TEST_TITLE_FONT: "headline" + TOUCH_TEST_TITLE_Y: "110" + TOUCH_TEST_INSET: "12" # the corner crosses from the edge + TOUCH_TEST_FAR_X: "763" # the right crosses: width - inset - size - 1 + TOUCH_TEST_FAR_Y: "443" # the bottom crosses + TOUCH_TEST_MID_X: "388" # the middle cross + TOUCH_TEST_MID_Y: "228" + TOUCH_TEST_SIZE: "24" # a cross + TOUCH_TEST_PAINT: "paint_ink" # the crosses + + # What the shared scripts do differently on this board + LVGL_DEFAULT_FONT: "sublabel" # LVGL's default font: every label names its own, so this only keeps Montserrat out of the build + LVGL_BUFFER_SIZE: "15%" # LVGL's draw buffer as a share of the screen: the Guition's 25 % of 480x480 in pixels + PAGE_DOTS_LARGE: "true" # bigger page dots + EFFECTS_ROW_FONT: "sublabel" # the effects page's rows + ROTATION_SUPPORTED: "false" # a landscape panel: the layout is 800 wide and does not turn + STANDBY_DIM_MS: "1500" # how long the backlight takes to dim into standby (waking takes 300) + ALERT_FLASH_FADE_MS: "60" # an alert's flash: the fade of each step + ALERT_FLASH_DARK_MS: "140" # how long it stays dark + ALERT_FLASH_LIT_MS: "180" # how long it stays lit + + # Code the shared lambdas of packages/core.yaml take from this board, at the place named ${...}: the + # exact lines the old profile had there. Empty when this board adds nothing at that place; every board + # must name every hook, or ESPHome stops at the undefined one. + # the first boot step: the touch guard, and what this board's panel needs + BOOT_TOUCH: |- + cyd::touch_guard.configure(${TOUCH_MOVE_LIMIT_PX}, ${TOUCH_MIN_PRESS_MS}); + cyd::edge_swipe.configure(${DISPLAY_W}, ${DISPLAY_H}, ${EDGE_SWIPE_BAND_PX}, ${EDGE_SWIPE_TRAVEL_PX}); + cyd::edge_snap_band = ${SLIDER_EDGE_SNAP_PX}; + // The page and the tile container take no presses: the theme's pressed style would + // otherwise repaint nearly the whole screen twice per touch in the empty edge band, + // starving the touch polling for the whole length of a quick swipe. + lv_obj_remove_flag(id(home_page)->obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_remove_flag(id(tile_scroll), LV_OBJ_FLAG_CLICKABLE); + // A stray GT911 contact at exactly (0, 0) never reaches LVGL (cyd::GhostTouch): as the last + // sample of a drag it sent a slider to its end on release. LVGL still reads ESPHome's callback. + if (auto *indev = lv_indev_get_next(nullptr)) { + static lv_indev_read_cb_t esphome_read = nullptr; + static const lv_indev_read_cb_t filtered = [](lv_indev_t *input, lv_indev_data_t *data) { + esphome_read(input, data); + int32_t ghost_x = 0, ghost_y = 0; + id(screen_lvgl).rotate_coordinates(ghost_x, ghost_y); + const unsigned dropped = cyd::ghost_touch.dropped(); + const auto read = cyd::ghost_touch.filter({data->state == LV_INDEV_STATE_PRESSED, (int) data->point.x, (int) data->point.y}, ghost_x, ghost_y); + if (cyd::ghost_touch.dropped() != dropped) ESP_LOGI("touch", "GT911 stray contact at (0,0) ignored"); + data->state = read.pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->point.x = read.x; + data->point.y = read.y; + }; + if (lv_indev_get_read_cb(indev) != filtered) { + esphome_read = lv_indev_get_read_cb(indev); + lv_indev_set_read_cb(indev, filtered); + } + } + id(last_touch_ms) = millis(); + id(last_use_ms) = millis(); + id(display_dimmed) = false; + # right after runtime_tiles::enabled = true, before the settings load + BOOT_ENABLED_HOOK: "" + # the paint style only this board has (theme::paints) + BOARD_PAINT_FILL: "theme::fill(id(paint_camera), Paint::camera);" + # in runtime_tiles::dismiss, after the detail card closes + CLOSE_CARDS_HOOK: "runtime_tiles::camera_close();" + # what LVGL's gesture over the tiles does on this board + BOOT_PAGE_GESTURE: |- + // A quick flick or wipe over the tiles is never a tap (firmware 0.2.65+). LVGL reports it as a gesture that + // bubbles up to this page (a tile's slider keeps its own, runtime_tiles::bind): the tap under the finger is + // consumed and LVGL waits for the release. No page flip: pages change with the edge swipe (on_update). LVGL + // wants speed as well as 50 px of travel, so a firm press that drifts slowly is still a tap. Cards and the + // settings page keep their drags; in standby the push still wakes the screen, it only switches nothing. + lv_obj_add_event_cb(id(home_page)->obj, [](lv_event_t *) { + if (!runtime_tiles::enabled || id(calibration_active) || !id(active_entity).empty() || settings_screen::visible() || + (runtime_tiles::detail_root && !lv_obj_has_flag(runtime_tiles::detail_root, LV_OBJ_FLAG_HIDDEN))) return; + // A quick drag on a slider is that slider's: the press stays with it (firmware 0.2.68+). + if (runtime_tiles::captured_slider) return; + cyd::touch_guard.consume(); + ESP_LOGI("touch", "flick: no tap"); + if (id(display_dimmed)) return; + if (auto *input = lv_indev_active()) lv_indev_wait_release(input); + }, LV_EVENT_GESTURE, nullptr); + # after the gesture: the camera images of a board that shows them + BOOT_CAMERA_HOOKS: |- + // Camera images (firmware 0.2.57+): the two online_images and the alert's frame. + // set_url() forgets the ETag, so it is only called for a new link: an unchanged picture then answers 304. + runtime_tiles::camera_full.load = [](const std::string &url) { + static std::string current; + if (url != current) { id(camera_image).set_url(url); current = url; } + id(camera_image).update(); + }; + runtime_tiles::camera_full.release = []() { id(camera_image).release(); }; + runtime_tiles::camera_full.source = []() { return id(camera_image).get_lv_image_dsc(); }; + runtime_tiles::camera_thumb.load = [](const std::string &url) { + static std::string current; + if (url != current) { id(alert_image).set_url(url); current = url; } + id(alert_image).update(); + }; + runtime_tiles::camera_thumb.release = []() { id(alert_image).release(); }; + runtime_tiles::camera_thumb.source = []() { return id(alert_image).get_lv_image_dsc(); }; + // The live pictures of a page's camera tiles (firmware 0.2.77+): one strip in the third online_image. + runtime_tiles::camera_live.load = [](const std::string &url) { + static std::string current; + if (url != current) { id(tile_image).set_url(url); current = url; } + id(tile_image).update(); + }; + runtime_tiles::camera_live.release = []() { id(tile_image).release(); }; + runtime_tiles::camera_live.source = []() { return id(tile_image).get_lv_image_dsc(); }; + runtime_tiles::alert_frame = id(alert_image_frame); + runtime_tiles::alert_frame_icon = id(alert_image_icon); + runtime_tiles::alert_room = [](bool image) { + const int shift = image ? ${ALERT_IMAGE_SHIFT} : 0; + lv_obj_set_height(id(alert_card), image ? ${ALERT_CARD_H_IMAGE} : ${ALERT_CARD_H}); + lv_obj_set_y(id(alert_icon), ${ALERT_ICON_Y} + shift); + lv_obj_set_y(id(alert_title), ${ALERT_TITLE_Y} + shift); + lv_obj_set_y(id(alert_subtitle), ${ALERT_SUBTITLE_Y} + shift); + lv_obj_set_height(id(alert_subtitle), image ? ${ALERT_SUBTITLE_H_IMAGE} : ${ALERT_SUBTITLE_H}); + }; + # after the cards' hooks, before the settings page's: the calibration wizard of a resistive panel, the fan and swing card of a big one + BOOT_CARDS_TAIL: |- + climate_card::look.card = id(climate_settings_card); + climate_card::look.font = id(label)->get_lv_font(); + climate_card::look.icon_font = id(materialdesign_icons_mini)->get_lv_font(); + climate_card::choose = [](char kind, int index) { + if (kind == 'f') id(set_climate_fan_mode).execute(index); + else id(set_climate_swing_mode).execute(index); + }; + # what else keeps the settings page closed (inline, in the condition) + MAY_OPEN_EXTRA: " && !runtime_tiles::camera_visible()" + # the log line of a boot onto the touch test page + TOUCH_TEST_READY_LOG: "GT911 touch test ready; no tile actions" + # one more line of the ui_state diagnostics + UI_STATE_HOOK: "" + # every 250 ms after runtime_tiles::tick() + TICK_HOOK: "runtime_tiles::camera_tick();" + # apply_screen_settings: turning the screen, before the standby logic (this panel does not turn) + APPLY_ROTATION: "" + # apply_screen_settings: how the backlight takes its level + APPLY_BACKLIGHT: |- + // Standby dims slowly (ESPHome's transition); waking is quick. + id(set_backlight).execute(level, id(display_dimmed) ? 1500 : 300); + # apply_screen_settings: the Rotation entity in Home Assistant follows (none on this board) + APPLY_ROTATION_ENTITY: "" + # back_to_page_1_when_due: what else counts as away from page 1 (inline) + AWAY_EXTRA: " runtime_tiles::camera_visible() ||" + # alert_show: after the settings page closed, before the card is made + ALERT_SHOW_HOOK: |- + // An open camera closes; the card makes room for an image the app announced for this alert. + runtime_tiles::alert_prepare(); + # set_climate_fan_mode and set_climate_swing_mode: after the choice is stored + CLIMATE_MODE_CHOSEN_HOOK: "id(climate_card_refresh).execute();" + # open_value_overlay: the climate card of a panel in portrait, before its refresh + OPEN_VALUE_OVERLAY_TAIL: "" + + +# ============================================================ +# No need to edit below this line. +# ============================================================ + +esphome: + platformio_options: # not `build_flags:` yet, see packages/core.yaml + build_flags: + - -DLV_USE_SNAPSHOT=1 + # GPIO19 and GPIO20, the touch I2C, are the ESP32-S3's USB pins: the ROM leaves the USB PHY on them and the I2C + # driver cannot take them back ("I2C software timeout", no touch). The flag turns on elecrow_usb_phy.h, which + # lets the pins go before ESPHome starts (docs/ELECROW.md; esphome/esphome#15356). Only this board sets it. + - -DESP_SCREENS_FREE_USB_PADS=1 + includes: + - + - + +esp32: + board: esp32-s3-devkitc-1 + variant: esp32s3 + # The ESP32-S3-WROOM-1-N4R8: 4 MB of flash (16 MB boot-loops with no log) and 8 MB of octal PSRAM. Two update slots + # of 1,835,008 bytes, like the CYD: tools/check.sh --firmware measures this board against the same budget. + flash_size: 4MB + cpu_frequency: 240MHz + framework: + type: esp-idf + version: recommended + advanced: + # ESP-IDF's assert texts (file, line and condition of every check) stay out of the firmware (0.2.75+), 49 KB on + # the CYD: a failed assert still stops and restarts the screen, and its backtrace still points at the line. + # Every board sets it (tests/test_easy_package.py). ESP-IDF's error names stay: without them ESPHome's own + # error lines only say "UNKNOWN ERROR". + assertion_level: SILENT + execute_from_psram: true + sdkconfig_options: + # The camera images' HTTP client links mbedTLS; nothing on the screen serves TLS (7 KB of flash). + CONFIG_MBEDTLS_TLS_CLIENT_ONLY: y + +psram: + mode: octal + speed: 80MHz + +# Flash (docs/ELECROW.md). The firmware is the Guition's with camera images, which ESPHome's own partition table for +# 4 MB (two slots of 1,792 KB, 448 KB of NVS) does not hold: with the Guition's fonts it is 2,028 KB. Three things +# make it fit with room for updates, measured with ESPHome 2026.9.0 (tools/check.sh --firmware applies the CYD's +# budget to this board too): +# - two update slots of 1,984 KB and 64 KB of NVS (smart_display: partitions, components/smart_display/__init__.py); +# - the icon fonts at 2 bits a pixel (font: below), 156 KB less; +# - the TLS client only (sdkconfig_options above), 7 KB less. +# That is 1,865 KB, 91.8 % of a slot. Without camera images (the online_image, http_request and preview_camera +# sections, the alert frame and the seed image below, and the camera hooks BOOT_CAMERA_HOOKS, BOARD_PAINT_FILL, +# CLOSE_CARDS_HOOK, MAY_OPEN_EXTRA, TICK_HOOK, AWAY_EXTRA and ALERT_SHOW_HOOK emptied) it is 1,754 KB, 86.4 %. +smart_display: + partitions: 4mb_wide_slots + +# The icon fonts at 2 bits a pixel (four levels of edge smoothing instead of sixteen) where the text keeps its four: +# the three sizes of the 314 tile icons are 312 KB at 4 bits, half that at 2. The text fonts are the sharper for it. +font: + - id: !extend materialdesign_icons + bpp: 2 + - id: !extend materialdesign_icons_mini + bpp: 2 + - id: !extend materialdesign_icons_big + bpp: 2 + - id: !extend watch_icon + bpp: 2 + +logger: + tx_buffer_size: 2048 + # The USB-C port is a CH340 on UART0; the S3's own USB pins carry the touch I2C (elecrow_usb_phy.h). + hardware_uart: UART0 + +api: + actions: + - action: ui_snapshot + then: + - script.execute: capture_ui_snapshot + # A camera full screen from Home Assistant (firmware 0.2.57+), as a tap on its tile opens it; an empty entity closes + # it. Only a camera on the screen's tiles or in a recent alert gets an image from ESP Screens. + - action: preview_camera + variables: + entity: string + then: + - lambda: |- + if (entity.empty()) { runtime_tiles::camera_close(); return; } + id(last_use_ms) = millis(); + id(wake_display).execute(); + std::string name = entity; + for (size_t i = 0; i < runtime_tiles::model.count; ++i) + if (runtime_tiles::model.tiles[i].entity == entity) { name = runtime_tiles::model.tiles[i].name; break; } + runtime_tiles::camera_open(entity, name); + +# Camera images (firmware 0.2.57+): ESP Screen Manager serves each image already sized for this screen, as an uncompressed +# BMP on its own port on the LAN (screen_manager/app/camera_feed.py). ESPHome decodes a BMP piece by piece as it arrives, +# one `buffer_size` per loop, where a JPEG of the full screen held the loop for 0.6 s; touch and drawing keep their turn. +# 16 KB a loop (firmware 0.2.73+): the full picture came in 1.8 s instead of 2.8 s with 4 KB. A loop waited over 50 ms +# for it in one of eleven opens with Wi-Fi awake (0.1 s), in five of twelve with power save; 32 KB saved 0.3 s more but +# held a loop 0.1 s more often (docs/TEST_RESULTS_0287.md, 0288). One image full screen and one in an alert's +# frame, and one strip with the live pictures of a page's camera tiles (firmware 0.2.77+); runtime_tiles.h decides when +# they load and frees them when they close. Plain HTTP on the LAN, no certificates. +http_request: + timeout: 4s + verify_ssl: false + +# The top-level online_image form that ESPHome 2026.6.2 (min_version) knows; 2026.7+ still reads it and suggests +# `image: - platform: online_image`, and 2027.1 drops it: move with the min_version raise (docs/RELEASING.md, 0.2.89). +online_image: + - id: camera_image + url: "http://127.0.0.1/camera.bmp" # set when a camera opens + format: BMP + type: RGB565 + buffer_size: 16384 + on_download_finished: + - lambda: 'runtime_tiles::camera_loaded(false, cached);' + on_error: + - lambda: 'runtime_tiles::camera_failed(false);' + - id: alert_image + url: "http://127.0.0.1/camera.bmp" # set when an alert brings an image + format: BMP + type: RGB565 + buffer_size: 16384 + on_download_finished: + - lambda: 'runtime_tiles::camera_loaded(true, cached);' + on_error: + - lambda: 'runtime_tiles::camera_failed(true);' + # The live pictures of a page's camera tiles (firmware 0.2.77+): one strip of small squares, at most ~70 KB. + - id: tile_image + url: "http://127.0.0.1/camera.bmp" # set when a page with live camera tiles is on screen + format: BMP + type: RGB565 + buffer_size: 16384 + on_download_finished: + - lambda: 'runtime_tiles::live_loaded(cached);' + on_error: + - lambda: 'runtime_tiles::live_failed();' + + +text_sensor: + # The sensor every large board has; ESP Screens 0.2.93+ reads the board from its value ("elecrow": a big panel that + # draws images and does not turn), so it publishes like the core's diagnostics. An older app only looks for the sensor + # and takes any screen that has it for a Guition, the nearest thing. + - platform: template + name: "Guition screen type" + entity_category: diagnostic + update_interval: 60s + lambda: 'return {"elecrow"};' + +# Pinout of the CrowPanel 7.0" (DIS08070H, V2.0 and V3.0): Elecrow's wiki and the ESPHome devices page. The V3.0 has a +# PCA9557 I/O expander at I2C 0x18 on the GT911's reset and interrupt lines; it is left alone on purpose: it powers up +# with every pin as an input, a pull-up brings the GT911 out of reset before the firmware starts, and writing it during +# boot is what breaks the touch. No interrupt pin either: the GT911 is polled. +i2c: + id: touch_bus + sda: GPIO19 + scl: GPIO20 + frequency: 400kHz + # A bus scan at boot upsets the GT911; the touchscreen names its address instead. + scan: false + +output: + - platform: ledc + pin: GPIO2 + id: gpio_backlight_pwm + frequency: 20000Hz + +light: + # The firmware owns the backlight: brightness, standby, night and alerts set it, and the minute tick + # restores it. Home Assistant uses the brightness numbers and the Wake and Sleep buttons (0.2.46+). + - platform: monochromatic + output: gpio_backlight_pwm + name: "Display Backlight" + id: back_light + internal: true + restore_mode: ALWAYS_ON + default_transition_length: 150ms + +touchscreen: + platform: gt911 + id: ts_touch + i2c_id: touch_bus + # The GT911 takes 0x5D when GPIO38 reads low at power-on, 0x14 when high; on this board it is 0x5D on most units. + # A unit that never reports a touch may be a 0x14: the Override YAML of that screen changes it (docs/ELECROW.md). + address: 0x5D + display: my_display + update_interval: 20ms + transform: + swap_xy: ${TOUCH_SWAP_XY} + mirror_x: ${TOUCH_MIRROR_X} + mirror_y: ${TOUCH_MIRROR_Y} + on_touch: + - lambda: |- + id(last_touch_ms) = millis(); + id(last_use_ms) = millis(); + id(touch_down) = true; + cyd::touch_guard.begin(millis(), touch.x, touch.y, touch.id); + cyd::edge_swipe.begin(touch.x, touch.y, static_cast(id(screen_lvgl).get_rotation())); + ESP_LOGI("touch", "GT911 press x=%u y=%u id=%u test=%d", touch.x, touch.y, (unsigned) touch.id, id(calibration_active)); + on_update: + - lambda: |- + id(last_touch_ms) = millis(); + id(last_use_ms) = millis(); + // Only the contact that started the touch counts; the guard ignores other ids. + for (const auto &point : touches) { + // Trace every sample of an edge touch: the log then shows how often the panel delivers. + if (cyd::edge_swipe.armed()) + ESP_LOGI("touch", "swipe id=%u st=%u x=%u y=%u", (unsigned) point.id, (unsigned) point.state, point.x, point.y); + // The stray (0, 0) contact (cyd::GhostTouch) is not where the finger went. + if (point.x == 0 && point.y == 0) continue; + cyd::touch_guard.update(point.x, point.y, point.id); + if (point.id != cyd::touch_guard.contact()) continue; + // Swiping in from a side edge flips the page ("Swiping between pages"); the tap + // under the finger is consumed and LVGL waits for the release. LVGL 9.5 sends no + // PRESSING to the input device, hence the touchscreen trigger. + const int step = cyd::edge_swipe.update(point.x, point.y); + if (!step) continue; + const char *blocked = !runtime_tiles::enabled ? "no runtime tiles" : !runtime_tiles::swipe_pages ? "setting off" + : id(display_dimmed) ? "screen dimmed" : id(calibration_active) ? "calibration" : !id(active_entity).empty() ? "card open" + : (runtime_tiles::detail_root && !lv_obj_has_flag(runtime_tiles::detail_root, LV_OBJ_FLAG_HIDDEN)) ? "detail card open" + : runtime_tiles::camera_visible() ? "camera open" : nullptr; + if (blocked) { ESP_LOGI("touch", "edge swipe ignored: %s", blocked); continue; } + cyd::touch_guard.consume(); + for (auto *indev = lv_indev_get_next(nullptr); indev; indev = lv_indev_get_next(indev)) lv_indev_wait_release(indev); + ESP_LOGI("touch", "edge swipe: page %d -> %d", id(tile_page), id(tile_page) + step); + id(tile_page) += step; + id(show_tile_page).execute(); + } + on_release: + - lambda: |- + id(last_touch_ms) = millis(); + id(last_use_ms) = millis(); + id(touch_down) = false; + if (cyd::edge_swipe.armed() && cyd::edge_swipe.inward() > 0) + ESP_LOGI("touch", "edge swipe not fired: %d px inward, %d px vertical", cyd::edge_swipe.inward(), cyd::edge_swipe.sideways()); + cyd::edge_swipe.end(); + + +# Native ESPHome driver with the working manufacturer's LVGL demo timings. +# See docs/GUITION_FACTORY_REFERENCE.md; no custom RGB component is required. + +# ESPHome's own RGB driver (mipi_rgb): the panel takes the pixels straight from the ESP32-S3's LCD peripheral, with no +# controller to initialise (the RPI model), so the timings are the whole configuration. They are the ones the +# ESPHome devices page measured for this panel; pclk_inverted is required, or the picture tears. +display: + - platform: mipi_rgb + model: RPI + id: my_display + dimensions: {width: 800, height: 480} + color_order: RGB + de_pin: 41 + hsync_pin: 39 + vsync_pin: 40 + pclk_pin: 0 + pclk_frequency: 15MHz + pclk_inverted: true + hsync_front_porch: 40 + hsync_pulse_width: 48 + hsync_back_porch: 13 + vsync_front_porch: 1 + vsync_pulse_width: 31 + vsync_back_porch: 13 + data_pins: + red: [14, 21, 47, 48, 45] + green: [9, 46, 3, 8, 16, 1] + blue: [15, 7, 6, 5, 4] + update_interval: never + auto_clear_enabled: false + +lvgl: + id: screen_lvgl + style_definitions: + # The alert's camera frame (theme::paints fills it: BOARD_PAINT_FILL). + - id: paint_camera + top_layer: + widgets: + - obj: + id: !extend alert_overlay + widgets: + - obj: + id: !extend alert_card + widgets: + # The alert's camera image (firmware 0.2.57+) across the top of the card, shown when the app announced + # one; a tap opens the camera full screen over the alert. runtime_tiles.h puts the image in it. + # Rounded like the alert card itself (firmware 0.2.73+); the image takes this radius (camera_loaded). + - obj: + id: alert_image_frame + x: ${ALERT_IMAGE_INSET} + y: ${ALERT_IMAGE_INSET} + width: ${CAMERA_THUMB_W} + height: ${CAMERA_THUMB_H} + hidden: true + styles: paint_camera + bg_opa: COVER + radius: 18 + border_width: 0 + shadow_width: 0 + pad_all: 0 + clickable: true + scrollable: false + scrollbar_mode: 'OFF' + pressed: + bg_opa: COVER + on_click: + - if: + condition: + lambda: 'return cyd::touch_guard.accept(millis(), 14) && !runtime_tiles::alert_camera.empty();' + then: + - lambda: 'runtime_tiles::camera_open(runtime_tiles::alert_camera, id(alert_title_text));' + widgets: + - label: + id: alert_image_icon + align: CENTER + text: "\U000F07AE" + text_font: materialdesign_icons + clickable: false + pages: + - id: !extend home_page + widgets: + # Never shown either: it makes ESPHome compile LVGL's image widget, which a camera image is drawn with. + - image: + id: camera_image_seed + hidden: true + src: alert_image + # The tile labels get a width and an ellipsis on this board, the width of a 378 px tile (the small panel keeps LVGL's content width). + - obj: + id: !extend tile_scroll + widgets: + - obj: + id: !extend tile1 + widgets: + - label: + id: !extend t1_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t1_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile2 + widgets: + - label: + id: !extend t2_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t2_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile3 + widgets: + - label: + id: !extend t3_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t3_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile4 + widgets: + - label: + id: !extend t4_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t4_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile5 + widgets: + - label: + id: !extend t5_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t5_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile6 + widgets: + - label: + id: !extend t6_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t6_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile7 + widgets: + - label: + id: !extend t7_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t7_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile8 + widgets: + - label: + id: !extend t8_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t8_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile9 + widgets: + - label: + id: !extend t9_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t9_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend tile10 + widgets: + - label: + id: !extend t10_title + height: 24 + width: 290 + long_mode: DOT + - label: + id: !extend t10_value + height: 22 + width: 290 + long_mode: DOT + - obj: + id: !extend climate_detail_overlay + widgets: + # Fan and swing, each a row of choices behind its icon (climate_card.h fills the card). + - obj: + id: climate_settings_card + align: TOP_MID + y: 340 + width: 94% + height: 116 + radius: 24 + styles: paint_card + bg_opa: COVER + border_width: 1 + pad_all: 0 + hidden: true + clickable: false + scrollable: false + +script: + - id: capture_ui_snapshot + mode: single + then: + - lambda: guition::snapshot_begin(); + - repeat: + count: 240 + then: + - lambda: guition::snapshot_next_row(); + - delay: 100ms + # Render every overlay and both pages repeatedly without controlling devices. + - id: ui_self_test + mode: single + then: + - logger.log: + format: "UI_TEST START: page/overlay render stress, no HA actions" + level: INFO # the core logs from INFO; logger.log is DEBUG by default + - lambda: 'ESP_LOGI("ui_test", "Light sliders: %s", light_controls::self_test() ? "PASS" : "FAIL");' + - lambda: 'id(calibration_active) = false;' + - lvgl.page.show: home_page + - script.execute: wake_display + - repeat: + count: 10 + then: + - lambda: |- + id(last_touch_ms) = millis(); + id(last_use_ms) = millis(); + static unsigned test_page=0; + id(tile_page) = runtime_tiles::enabled ? test_page++ % runtime_tiles::page_count() : 1; + - script.execute: show_tile_page + - delay: 300ms + - lambda: |- + lv_obj_update_layout(id(tile_scroll)); + const int count = runtime_tiles::model.count; + // Wide cards take two slots, so visibility follows the runtime packing. + const bool paginated = runtime_tiles::enabled ? runtime_tiles::page_count() > 1 : count > 6; + lv_obj_t* tiles[] = {id(tile1), id(tile2), id(tile3), id(tile4), id(tile5), + id(tile6), id(tile7), id(tile8), id(tile9), id(tile10)}; + bool ok = guition::check_geometry(id(home_page)->obj); + for (int i = 0; i < 10; ++i) { + bool visible = runtime_tiles::enabled ? i<6 && runtime_tiles::widgets[i].index= 6 : i < 6); + ok = ok && (lv_obj_has_flag(tiles[i], LV_OBJ_FLAG_HIDDEN) != visible); + } + // The bar shows with more than one page, unless the Page buttons setting is off (firmware 0.2.69+). + const bool bar = paginated && (!runtime_tiles::enabled || settings_screen::page_buttons); + for (lv_obj_t* control : {id(page_prev), id(page_next), id(page_number)}) + ok = ok && (lv_obj_has_flag(control, LV_OBJ_FLAG_HIDDEN) != bar); + lv_area_t nav, grid; + lv_obj_get_coords(id(page_next), &nav); + lv_obj_get_coords(id(tile_scroll), &grid); + ok = ok && (!bar || grid.y2 < nav.y1); + if(runtime_tiles::enabled)ok = runtime_tiles::check_tile_geometry() && ok; + ESP_LOGI("ui_test", "page_check=%s count=%d heap=%u frames=%u grid_bottom=%d nav_top=%d", ok ? "PASS" : "FAIL", count, (unsigned) esp_get_free_heap_size(), (unsigned) id(rendered_frames), grid.y2, nav.y1); + id(tile_page) = 0; + - script.execute: show_tile_page + - delay: 150ms + - lvgl.widget.show: brightness_overlay + - delay: 150ms + - lambda: guition::check_geometry(id(brightness_overlay)); + - lvgl.widget.hide: brightness_overlay + - lvgl.widget.show: color_detail_overlay + - delay: 150ms + - lambda: guition::check_geometry(id(color_detail_overlay)); + - lvgl.widget.hide: color_detail_overlay + - lvgl.widget.show: climate_detail_overlay + - delay: 150ms + - lambda: guition::check_geometry(id(climate_detail_overlay)); + - lvgl.widget.hide: climate_detail_overlay + - lvgl.widget.show: climate_mode_overlay + - delay: 150ms + - lambda: guition::check_geometry(id(climate_mode_overlay)); + - lvgl.widget.hide: climate_mode_overlay + - lvgl.widget.show: alert_overlay + - delay: 150ms + - lvgl.widget.hide: alert_overlay + - lambda: 'if (!id(ui_refresh).is_running()) id(ui_refresh).execute();' + - logger.log: + format: "UI_TEST COMPLETE" + level: INFO + + # The two scripts that drive the backlight through set_backlight; the CYD drives it as a light action. + - id: alert_dismiss + parameters: + reason: string + then: + - if: + condition: + lambda: 'return id(alert_active);' + then: + - lambda: |- + id(alert_active) = false; + id(last_touch_ms) = millis(); + runtime_tiles::alert_clear(); + ESP_LOGI("alert", "dismissed: %s", reason.c_str()); + - lvgl.widget.hide: alert_overlay + - script.stop: alert_timeout + - script.stop: alert_flash + - lambda: 'id(set_backlight).execute(screen_settings::current.brightness, 80);' + - script.execute: + id: alert_report + action: !lambda 'return reason;' + + # Four backlight blinks when the alert arrives; the screen then stays on as usual. + - id: alert_flash + mode: restart + then: + - repeat: + count: 4 + then: + - lambda: 'id(set_backlight).execute(0, 60);' + - delay: 140ms + - lambda: 'id(set_backlight).execute(screen_settings::current.brightness, 60);' + - delay: 180ms + + - id: wake_display + mode: restart + then: + - lambda: |- + id(last_touch_ms) = millis(); + id(display_dimmed) = false; + id(sleep_requested) = false; + // Almost instant brightness-up. ESPHome's default is 1s, and that feels sluggish + // when you touch the screen and are waiting on light. + id(set_backlight).execute(screen_settings::current.brightness, 80); + - lvgl.widget.hide: dim_wake_overlay + - script.execute: close_cards + + # One owner for the backlight level, through ESPHome's own light transition (firmware 0.2.57+). Firmware 0.2.13-0.2.56 + # stepped the duty with the LEDC hardware fader by reaching into ESPHome's LEDC output, which ESPHome 2026.8 made final; + # a new call interrupts the running transition from where it is, as ESPHome does for any light. + - id: set_backlight + mode: restart + parameters: + level: int + ms: int + then: + - lambda: id(back_light).turn_on().set_transition_length(ms).set_brightness(level / 100.0f).perform(); + + # The climate card at this size, with the fan and swing card (the CYD has its own copy). + - id: climate_card_refresh + then: + - lambda: |- + auto lower = [](std::string v) { + for (char &c : v) { if (c >= 'A' && c <= 'Z') c = (char)(c - 'A' + 'a'); } + return v; + }; + std::string mode = lower(id(active_climate_mode)); + bool off = mode == "off" || mode.empty() || mode == "unknown" || mode == "unavailable"; + // What the device does (Heating), else its mode (Heat); then the room. + std::string status = off ? std::string(screen_text::tr(screen_text::txt::ha_off)) : std::string(tile_controls::climate_action_text(lower(id(active_climate_action)))); + if (status.empty()) status = tile_controls::climate_mode_text(mode); + if (std::isfinite(id(active_climate_current))) status += " · " + screen_text::fill(screen_text::txt::climate_now, "value", screen_text::decimal(id(active_climate_current), 1) + "°"); + if (id(active_climate_humidity) >= 0) status += " · " + screen_text::percent(id(active_climate_humidity)); + lv_label_set_text(id(climate_current_label), status.c_str()); + + int target = id(active_climate_target_x10); + std::string value = id(active_climate_target_known) + ? tile_controls::format_value(target / 10.0f, id(active_climate_step_x10) / 10.0f, "°") : std::string("--"); + lv_label_set_text(id(climate_target_label), value.c_str()); + lv_obj_set_style_text_color(id(climate_target_label), theme::color(off ? theme::OFF : theme::INK), LV_PART_MAIN); + auto enable = [](lv_obj_t *key, bool on) { + if (on) lv_obj_remove_state(key, LV_STATE_DISABLED); else lv_obj_add_state(key, LV_STATE_DISABLED); + }; + enable(id(climate_minus_button), !id(active_climate_target_known) || target > id(active_climate_min_x10)); + enable(id(climate_plus_button), !id(active_climate_target_known) || target < id(active_climate_max_x10)); + + // One key per supported mode, in Home Assistant's order. Fan and swing add "more"; with it + // five mode keys fit, and when a sixth mode is in use it takes the last place. + std::string supported = lower(id(active_climate_supported_modes)); + auto has = [&](const char *m) { + return supported.find(std::string("\"") + m + "\"") != std::string::npos || + supported.find(std::string("'") + m + "'") != std::string::npos; + }; + struct Key { lv_obj_t *obj; const char *mode; }; + const Key keys[] = {{id(cmkey_auto), "auto"}, {id(cmkey_heat_cool), "heat_cool"}, {id(cmkey_heat), "heat"}, + {id(cmkey_cool), "cool"}, {id(cmkey_dry), "dry"}, {id(cmkey_fan_only), "fan_only"}}; + // The Guition shows fan and swing on their own card below, so no "more" key. + bool more = false; + const Key *visible[6]; + unsigned count = 0, room = more ? 5 : 6; + for (const auto &k : keys) if (has(k.mode)) visible[count++] = &k; + if (count > room) { + for (unsigned i = room; i < count; ++i) if (mode == visible[i]->mode) visible[room - 1] = visible[i]; + count = room; + } + for (const auto &k : keys) { + bool show = false; + for (unsigned i = 0; i < count; ++i) show = show || visible[i] == &k; + if (show) lv_obj_remove_flag(k.obj, LV_OBJ_FLAG_HIDDEN); else lv_obj_add_flag(k.obj, LV_OBJ_FLAG_HIDDEN); + bool selected = show && !off && mode == k.mode; + uint32_t color = tile_controls::mode_color(k.mode); + lv_obj_set_style_bg_color(k.obj, selected ? lv_color_hex(color) : theme::color(theme::CARD), LV_PART_MAIN); + lv_obj_set_style_border_color(k.obj, selected ? lv_color_hex(color) : theme::color(theme::LINE), LV_PART_MAIN); + lv_obj_set_style_text_color(lv_obj_get_child(k.obj, 0), theme::color(selected ? theme::ON_ACCENT : theme::SLATE), LV_PART_MAIN); + } + if (more) lv_obj_remove_flag(id(cmkey_more), LV_OBJ_FLAG_HIDDEN); else lv_obj_add_flag(id(cmkey_more), LV_OBJ_FLAG_HIDDEN); + // One mode is no choice: the power key already turns it on and off. + const bool show_keys = count > 1 || more; + if (show_keys) lv_obj_remove_flag(id(climate_mode_keys), LV_OBJ_FLAG_HIDDEN); + else lv_obj_add_flag(id(climate_mode_keys), LV_OBJ_FLAG_HIDDEN); + + // Fan and swing rows, in the entity's own names and order. + climate_card::Row settings[2]; + int rows = 0; + if (!cyd::list_item(id(active_climate_fan_modes), 0).empty()) + settings[rows++] = {'f', "\U000F0210", id(active_climate_fan_modes), id(active_climate_fan_mode)}; + if (!cyd::list_item(id(active_climate_swing_modes), 0).empty()) + settings[rows++] = {'s', "\U000F1C91", id(active_climate_swing_modes), id(active_climate_swing_mode)}; + // One layout per card: the setpoint gives room to the mode keys and the settings below it, + // and a card with nothing below keeps the setpoint centred. + static int laid_out = -1; + if (laid_out != rows * 2 + show_keys) { + laid_out = rows * 2 + show_keys; + struct Layout { int status, card_y, card_h, key, number_y, caption_y, modes_y, modes_h, settings_y, edge, row_h, gap; }; + static const Layout layouts[6] = { + // no mode keys: 0, 1, 2 rows + {92, 180, 200, 116, -14, 46, 0, 0, 0, 14, 48, 10}, + {92, 140, 200, 116, -14, 46, 0, 0, 364, 14, 48, 10}, + {90, 130, 180, 108, -12, 42, 0, 0, 330, 14, 46, 10}, + // mode keys: 0, 1, 2 rows + {92, 136, 200, 116, -14, 46, 364, 76, 0, 14, 48, 10}, + {90, 126, 170, 108, -12, 42, 312, 68, 394, 12, 44, 8}, + {86, 118, 140, 96, -10, 36, 270, 60, 342, 12, 42, 8}, + }; + const Layout &l = layouts[(show_keys ? 3 : 0) + rows]; + lv_obj_set_y(id(climate_current_label), l.status); + lv_obj_set_y(id(climate_setpoint_card), l.card_y); + lv_obj_set_height(id(climate_setpoint_card), l.card_h); + for (lv_obj_t *button : {id(climate_minus_button), id(climate_plus_button)}) { + lv_obj_set_size(button, l.key, l.key); + lv_obj_set_style_radius(button, l.key / 2, LV_PART_MAIN); + } + lv_obj_set_y(id(climate_target_label), l.number_y); + lv_obj_set_y(id(climate_set_label), l.caption_y); + if (show_keys) { + lv_obj_set_y(id(climate_mode_keys), l.modes_y); + lv_obj_set_height(id(climate_mode_keys), l.modes_h); + for (lv_obj_t *mode_key : {id(cmkey_auto), id(cmkey_heat_cool), id(cmkey_heat), id(cmkey_cool), id(cmkey_dry), id(cmkey_fan_only), id(cmkey_more)}) { + lv_obj_set_height(mode_key, l.modes_h); + lv_obj_set_style_radius(mode_key, l.modes_h / 2, LV_PART_MAIN); + } + } + lv_obj_set_y(id(climate_settings_card), l.settings_y); + climate_card::look.edge = l.edge; + climate_card::look.row_h = l.row_h; + climate_card::look.gap = l.gap; + } + climate_card::show(settings, rows); + id(climate_power_refresh).execute(); diff --git a/packages/core.yaml b/packages/core.yaml index a3b8d4a..f3421ba 100644 --- a/packages/core.yaml +++ b/packages/core.yaml @@ -14,7 +14,7 @@ # fonts/materialdesignicons-webfont.ttf (Apache 2.0, github.com/Templarian/MaterialDesign-Webfont). ############################################################ substitutions: - SCREEN_FIRMWARE_VERSION: "0.2.78" + SCREEN_FIRMWARE_VERSION: "0.2.79" DASHBOARD_INBOX_INTERNAL: "false" CALIBRATION_ON_BOOT: "false" # a bench build: start on the touch test page ROOM_NAME: "" # top left until ESP Screens sends the screen name diff --git a/packages/cyd.yaml b/packages/cyd.yaml index 0a7c758..dfa8ed8 100644 --- a/packages/cyd.yaml +++ b/packages/cyd.yaml @@ -6,7 +6,7 @@ # entities), and boards/cyd-2432s028.yaml with this board's hardware and sizes. docs/PROFILES.md says how the # files fit together. home-like-2432s028.yaml builds the same two files from a checkout. substitutions: - FONT_DIR: "https://raw.githubusercontent.com/MaxGramser/homeassistant_espscreen/main/fonts" + FONT_DIR: "https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen/raw/branch/main/fonts" packages: core: !include core.yaml @@ -15,7 +15,7 @@ packages: external_components: - source: type: git - url: https://github.com/MaxGramser/homeassistant_espscreen.git + url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen.git ref: main path: components refresh: 0s diff --git a/packages/elecrow.yaml b/packages/elecrow.yaml new file mode 100644 index 0000000..d11fcc6 --- /dev/null +++ b/packages/elecrow.yaml @@ -0,0 +1,22 @@ +# ESP Screens - the package an Elecrow CrowPanel 7.0" builds from over GitHub. ESP Screen Manager writes every +# screen's own YAML with `packages: display: {url: , files: [packages/elecrow.yaml]}` and adds +# the name, the Wi-Fi reference and the unique keys (docs/EASY_SETUP.md); nothing of that lives here. +# +# The screen is two packages: core.yaml, which every board shares (the LVGL tree, the cards, the scripts, the +# entities), and boards/elecrow-crowpanel7.yaml with this board's hardware and sizes. docs/PROFILES.md says how +# the files fit together. elecrow-crowpanel7.yaml builds the same two files from a checkout. +substitutions: + FONT_DIR: "https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen/raw/branch/main/fonts" + +packages: + core: !include core.yaml + board: !include boards/elecrow-crowpanel7.yaml + +external_components: + - source: + type: git + url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen.git + ref: main + path: components + refresh: 0s + components: [smart_display] diff --git a/packages/guition.yaml b/packages/guition.yaml index b71c9ad..670861d 100644 --- a/packages/guition.yaml +++ b/packages/guition.yaml @@ -6,7 +6,7 @@ # entities), and boards/guition-4848s040.yaml with this board's hardware and sizes. docs/PROFILES.md says how # the files fit together. guition-4848s040.yaml builds the same two files from a checkout. substitutions: - FONT_DIR: "https://raw.githubusercontent.com/MaxGramser/homeassistant_espscreen/main/fonts" + FONT_DIR: "https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen/raw/branch/main/fonts" packages: core: !include core.yaml @@ -15,7 +15,7 @@ packages: external_components: - source: type: git - url: https://github.com/MaxGramser/homeassistant_espscreen.git + url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen.git ref: main path: components refresh: 0s diff --git a/repository.yaml b/repository.yaml index 2997945..4b4b440 100644 --- a/repository.yaml +++ b/repository.yaml @@ -1,3 +1,3 @@ name: Home Assistant ESP Screens -url: https://github.com/MaxGramser/homeassistant_espscreen -maintainer: MaxGramser +url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen +maintainer: Xandrossian (fork of MaxGramser/homeassistant_espscreen with the Elecrow CrowPanel 7.0") diff --git a/screen_manager/CHANGELOG.md b/screen_manager/CHANGELOG.md index d80782f..42b3705 100644 --- a/screen_manager/CHANGELOG.md +++ b/screen_manager/CHANGELOG.md @@ -1,3 +1,12 @@ +## 0.2.93 (firmware 0.2.79) + +A third screen: the 7-inch Elecrow CrowPanel, with everything the Guition shows across a wider page. + +- **Elecrow CrowPanel 7.0" (DIS08070H).** Choose **Elecrow CrowPanel · 7 inch** under **New screen**. An 800 × 480 panel with GT911 touch on an ESP32-S3-WROOM-1-N4R8: every card, the camera images and album covers, the live pictures on camera tiles, the page swipe from the glass edge and the settings on the screen, the Guition's rows and fonts across six tiles of 378 × 108. It does not turn (a landscape panel), so it has no Rotation. docs/ELECROW.md has the hardware, the touch notes (the GT911 sits on the ESP32-S3's USB pins, which the firmware frees; a unit at I2C 0x14 gets one line of Override YAML) and the flash. +- **4 MB of flash, like the CYD.** The firmware is the Guition's, which does not fit ESPHome's own partition table for 4 MB. Three measures in the board file make it fit with room for updates: two update slots of 1,984 KB instead of 1,792 (a partition table of the component's, `smart_display: partitions`), the icon fonts at 2 bits a pixel where the text keeps its 4, and the TLS client only. Elecrow firmware: 1,865,456 bytes, 91.8 % of its update slot (without camera images it would be 86 %; the trade is in docs/ELECROW.md). `tools/check.sh --firmware` applies the CYD's budget to this board too. +- The app reads a large board's name from its "Guition screen type" sensor (an older Guition, which never publishes a value, stays a Guition); the editor's preview takes the panel's shape. The snapshot diagnostics (`ui_snapshot`, `capture_ui.py`) take the panel's own size, half of it, 400 × 240 on the Elecrow. +- Needs firmware 0.2.79 for the Elecrow; a CYD or Guition on 0.2.78 loses nothing by waiting. Includes everything from 0.2.92. + ## 0.2.92 (firmware 0.2.78) The album cover on a media tile, the way Home Assistant's own tile shows it. diff --git a/screen_manager/README.md b/screen_manager/README.md index 7ddbc08..a51e063 100644 --- a/screen_manager/README.md +++ b/screen_manager/README.md @@ -5,7 +5,7 @@ Thank you! I work on this project with a lot of love, and every bit of support h Buy me a coffee Find your Home Assistant entities, arrange up to 48 tiles, and push changes -to a CYD or Guition screen without reflashing. Includes installation help, +to a CYD, Guition or Elecrow CrowPanel screen without reflashing. Includes installation help, a unique per-device YAML, and support for multiple screens.

diff --git a/screen_manager/app/camera_feed.py b/screen_manager/app/camera_feed.py index dbf038b..b48b8cb 100644 --- a/screen_manager/app/camera_feed.py +++ b/screen_manager/app/camera_feed.py @@ -1,4 +1,4 @@ -"""Camera images on a Guition screen (app 0.2.66, firmware 0.2.57). +"""Camera images on a Guition screen (app 0.2.66, firmware 0.2.57), and on an Elecrow CrowPanel 7.0" (app 0.2.93). A screen never asks Home Assistant for a camera itself. This app fetches the snapshot with its own token (a camera's access token changes every five minutes), makes it exactly as large as the screen shows it and serves @@ -62,8 +62,8 @@ MAX_LINKS = 64 # What the screens load (online_image `format: BMP`). CONTENT_TYPE = 'image/bmp' # The pixel box per board and view; the image keeps its proportions inside it. Equal to the CAMERA_* -# substitutions of packages/guition.yaml (tests/test_camera.py). -BOXES = {'guition': {'full': (480, 480), 'thumb': (392, 220)}} +# substitutions of the board's file under packages/boards/ (tests/test_camera.py). +BOXES = {'guition': {'full': (480, 480), 'thumb': (392, 220)}, 'elecrow': {'full': (800, 480), 'thumb': (532, 220)}} def supported(entity): diff --git a/screen_manager/app/claude_skill.py b/screen_manager/app/claude_skill.py index 5b37eab..f53b6e7 100644 --- a/screen_manager/app/claude_skill.py +++ b/screen_manager/app/claude_skill.py @@ -27,7 +27,7 @@ PAGE_TILE_REPEAT_VERSION = '.'.join(str(part) for part in PAGE_TILE_REPEAT_MIN_F NAME = 'esp-screens' # claude.ai accepts at most 200 characters; Claude Code picks the skill by this sentence. -DESCRIPTION = ('ESP Screens (CYD and Guition touchscreens run from Home Assistant): put a tile on a screen, move or ' +DESCRIPTION = ('ESP Screens (CYD, Guition and Elecrow screens run from Home Assistant): put a tile on a screen, move or ' 'order tiles, show an alert on one screen or all of them, and wake, sleep or keep a screen awake.') TYPES = {'string': 'text', 'int': 'number', 'bool': 'on/off'} diff --git a/screen_manager/app/core.py b/screen_manager/app/core.py index a5dd133..7b076e4 100644 --- a/screen_manager/app/core.py +++ b/screen_manager/app/core.py @@ -48,10 +48,13 @@ FULL_PAGE_MIN_FIRMWARE = (0, 2, 62) # Twenty tiles from firmware 0.2.7, ten before. TWENTY_TILES_MIN_FIRMWARE = (0, 2, 7) FIRST_MAX_TILES = 10 -REPO = 'https://github.com/MaxGramser/homeassistant_espscreen' -REFS = {'cyd': 'main', 'guition': 'main'} +REPO = 'https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen' +REFS = {'cyd': 'main', 'guition': 'main', 'elecrow': 'main'} +# The boards that draw camera images and album covers and take the large layouts (a big RGB panel with PSRAM); the CYD +# is the small one. The Elecrow CrowPanel 7.0" (app 0.2.93) is the Guition's kind at 800x480, without the Rotation. +LARGE_BOARDS = ('guition', 'elecrow') # Firmware shipped with this app release; screens below it get an update offer. -FIRMWARE_VERSION = '0.2.78' +FIRMWARE_VERSION = '0.2.79' # The Auto standby switch a screen offers Home Assistant automations. AUTO_STANDBY_MIN_FIRMWARE = '0.2.41' # The settings page the screen opens itself, and the screen.settings tile that opens it. @@ -202,6 +205,8 @@ def resolve_controls(tile): # forms are recognised until every board has been reflashed with an English `name:`. NAME_TILE_SETTINGS = ('Tile settings', 'Tegelinstellingen') NAME_SCREEN_FIRMWARE = ('Screen firmware', 'Schermfirmware') +# Only the large boards have this sensor; its value names the board ("guition", or "elecrow" from firmware 0.2.79), +# an older Guition never publishes one. NAME_GUITION_TYPE = ('Guition screen type', 'Guition schermtype') NAME_DEVICE_NAME = ('Device name', 'Apparaatnaam') NAME_IP_ADDRESS = ('IP address', 'IP-adres') @@ -1408,7 +1413,8 @@ ALERT_FIELDS = ( # is a value to type as it is. ALERT_TEXT_EXAMPLES = frozenset(('title', 'subtitle', 'button_text')) # Bytes per field the firmware keeps (the profiles' ALERT_*_MAX); an accented letter takes two. -ALERT_LIMITS = {'cyd': {'title': 48, 'subtitle': 160, 'button_text': 12}, 'guition': {'title': 64, 'subtitle': 240, 'button_text': 16}} +ALERT_LIMITS = {'cyd': {'title': 48, 'subtitle': 160, 'button_text': 12}, 'guition': {'title': 64, 'subtitle': 240, 'button_text': 16}, + 'elecrow': {'title': 64, 'subtitle': 240, 'button_text': 16}} ALERT_SUGGESTED_ICONS = ('doorbell', 'bell', 'bell-ring', 'alert-outline', 'alarm-light', 'lock', 'lock-open-variant', 'door-open', 'window-closed-variant', 'motion-sensor', 'cctv', 'smoke-detector', 'water-alert', 'fire', 'mailbox', 'car', 'account', 'account-group', 'washing-machine', 'robot-vacuum', 'timer-outline', 'check') @@ -1559,8 +1565,13 @@ def discover_screens(registry, states, devices, areas): area_map = {a['area_id']: a['name'] for a in areas} versions = {item.get('device_id'): states.get(item['entity_id'], {}).get('state', 'unknown') for item in registry if item.get('platform') == 'esphome' and item.get('original_name') in NAME_SCREEN_FIRMWARE} - boards = {item.get("device_id"): "guition" for item in registry - if item.get("platform") == "esphome" and item.get("original_name") in NAME_GUITION_TYPE} + # A screen with the type sensor is a large board: the one its value names, a Guition when the value is not a board + # (older firmware never publishes one, and a screen that is restarting reports "unavailable"). + boards = {} + for item in registry: + if item.get("platform") == "esphome" and item.get("original_name") in NAME_GUITION_TYPE: + value = states.get(item['entity_id'], {}).get('state') + boards[item.get("device_id")] = value if value in LARGE_BOARDS else "guition" def diagnostic(names, pattern): found = {} for item in registry: diff --git a/screen_manager/app/ha_catalogue.py b/screen_manager/app/ha_catalogue.py index d673bd9..c27605e 100644 --- a/screen_manager/app/ha_catalogue.py +++ b/screen_manager/app/ha_catalogue.py @@ -171,10 +171,10 @@ def capabilities(entity_id, actions, state, services): elif domain == 'sun': displays.append('sunpath') elif domain in ('camera', 'image'): - # A live picture on the tile (app 0.2.91): the editor offers it on a Guition, the only board that draws images. + # A live picture on the tile (app 0.2.91): the editor offers it on a large board (a Guition, an Elecrow), the ones that draw images. displays.append('live') elif domain == 'media_player': - # The album cover in the icon's place (app 0.2.92), a Guition again. + # The album cover in the icon's place (app 0.2.92), a large board again. displays.append('cover') return { 'toggle': TOGGLE.format(domain=domain) in actions, diff --git a/screen_manager/app/static/assets/de-B91bzzJv.js b/screen_manager/app/static/assets/de-CMx0ATkh.js similarity index 56% rename from screen_manager/app/static/assets/de-B91bzzJv.js rename to screen_manager/app/static/assets/de-CMx0ATkh.js index debebfb..2f82ae0 100644 --- a/screen_manager/app/static/assets/de-B91bzzJv.js +++ b/screen_manager/app/static/assets/de-CMx0ATkh.js @@ -1 +1 @@ -const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Rückgängig"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"unbekannt"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Nicht gespeicherte Änderungen"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Abbrechen"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Geräte & Dienste öffnen"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Speichern & senden"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Wird gespeichert…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Aktuelle Daten abrufen"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 Ergebnis. Tippe weiter, um die Suche einzugrenzen."},{t:2,i:[{t:4,k:"n"},{t:3,v:" Ergebnisse. Tippe weiter, um die Suche einzugrenzen."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Schließen"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Entfernen"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Ändern"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Wird geladen…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Zurück"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Kopieren"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Neuer Bildschirm"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware & USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Meldungen"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Verbinden und installieren"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Das hat nicht geklappt. Lade die Seite neu und versuche es noch einmal."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"API-Schlüssel kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"API-Schlüssel ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Layout-JSON kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Layout-JSON ist markiert. Kopiere es mit Ctrl+C oder Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Aktionsname kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Aktionsname ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"YAML ist markiert. Kopiere es mit Ctrl+C oder Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Symbolname kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Symbolname ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Leerer Farbwert kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Leerer Farbwert ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Farbname kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Farbname ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Verwaltungsseite nicht erreichbar · neuer Versuch…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant verbunden"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Verbinde erneut mit Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Suchen"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirme"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Mehr"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Neu laden"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Update"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aktualisieren"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"Für das Update vorgemerkt"}},available:{t:0,b:{t:2,i:[{t:3,v:"Update "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Kein ESPHome-Profil mit diesem Gerätenamen gefunden."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Was ist neu"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Ganzes Protokoll"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"Gib einmal die IP-Adresse ein; neue Firmware meldet sie selbst."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"IP-Adresse, z. B. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"IP-Adresse"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Starten"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Installiert, aber noch nicht in Home Assistant. Füge das entdeckte ESPHome-Gerät unter Einstellungen → Geräte & Dienste hinzu, gib dort den API-Schlüssel ein und aktiviere unter „Konfigurieren“ die Option „Dem Gerät erlauben, Home Assistant-Aktionen auszuführen“."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware heruntergeladen, noch nicht in Home Assistant. Spiele sie mit ESPHome Web auf den Bildschirm, füge dann das entdeckte ESPHome-Gerät unter Einstellungen → Geräte & Dienste hinzu, gib dort den API-Schlüssel ein und erlaube unter „Konfigurieren“ die Home Assistant-Aktionen."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Noch nicht in Home Assistant. Schon geflasht? Füge das ESPHome-Gerät unter Einstellungen → Geräte & Dienste hinzu und erlaube dann unter „Konfigurieren“ die Home Assistant-Aktionen. Noch nicht geflasht? Firmware & USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"API-Schlüssel kopieren"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirme"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Aktionen"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Zu diesem Bildschirm hinzufügen"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Spickzettel und eine Testmeldung"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Updates, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nichts zu speichern"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Diesen Bildschirm identifizieren"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Lässt die Hintergrundbeleuchtung blinken und zeigt eine Karte"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Braucht eine neuere Firmware"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Layout exportieren"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Als JSON herunterladen und kopieren"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirme, Entitäten, Aktionen suchen…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Nichts gefunden. Gib einen Teil eines Bildschirm-, Entitäts- oder Aktionsnamens ein."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wähle einen Bildschirm"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Wähle links einen deiner Bildschirme, um seine Kacheln, Kopfleiste und Einstellungen zu ändern."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Starte mit einem Bildschirm"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Schließe ein CYD oder Guition per USB an deinen Home Assistant-Rechner an. Profil, Firmware und das erste Flashen laufen in einem Rutsch."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Neuen Bildschirm installieren"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Du hast nicht gespeicherte Änderungen. Trotzdem einen anderen Bildschirm öffnen?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Das nicht gespeicherte Layout durch eine Kopie vom anderen Bildschirm ersetzen?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Das nicht gespeicherte Layout durch das importierte ersetzen?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Dein Bildschirm wird aktualisiert."}},other:{t:0,b:{t:2,i:[{t:3,v:"Gespeichert. "},{t:4,k:"name"},{t:3,v:" wird aktualisiert."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Der Bildschirm wird aktualisiert."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Deine neueste Änderung ist noch nicht gesendet: Drücke noch einmal auf „Speichern & senden“."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" blinkt und zeigt ein paar Sekunden lang eine Karte."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · Änderungen werden gespeichert"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Layout"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirmeinstellungen"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert · gesendet"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Alles gespeichert"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Mehr"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifizieren"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm blinken lassen"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Braucht Firmware 0.2.31 oder neuer"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"aus Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Layout kopieren von…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Bildschirm"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Bildschirme"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"kein anderer Bildschirm"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Kachel"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Kacheln"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Layout exportieren"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Layout importieren…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML-Anpassung"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"erweitert"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Kein ESPHome-Profil für diesen Bildschirm gefunden"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Firmware aktualisieren"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" entfernt"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Auf Seite "},{t:4,k:"page"},{t:3,v:" ist kein Platz für diese Kachel."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Keine Seite ist frei für eine ganzseitige Kachel. Mach zuerst eine Seite frei."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Dieser Bildschirm hat schon eine Kachel, die zu Seite "},{t:4,k:"page"},{t:3,v:" führt."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Layout von "},{t:4,k:"name"},{t:3,v:" kopiert. Drücke „Speichern & senden“, wenn alles passt."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Layout von "},{t:4,k:"name"},{t:3,v:" kopiert: "},{t:4,k:"kept"},{t:3,v:" von "},{t:4,k:"total"},{t:3,v:" Kacheln passen zur Firmware dieses Bildschirms. Drücke „Speichern & senden“, wenn alles passt."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Layout importiert. Drücke „Speichern & senden“, wenn alles passt."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Layout importiert: "},{t:4,k:"kept"},{t:3,v:" von "},{t:4,k:"total"},{t:3,v:" Kacheln passen zur Firmware dieses Bildschirms. Drücke „Speichern & senden“, wenn alles passt."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Das ist kein JSON. Exportiere zuerst ein Layout oder füge eines aus einer anderen ESP Screens-Installation ein."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Keine Kacheln in dieser Datei. Erwartet wird ein aus ESP Screens exportiertes Layout."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Seite · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" Kacheln"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Seiten · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" Kacheln"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Füge aus der Bibliothek deine erste Leuchte, Szene oder dein erstes Gerät hinzu."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Tippe auf die Kopfleiste oder eine Kachel, um sie zu ändern. Ziehen verschiebt; Ablegen auf der nächsten Seite legt eine neue an."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Freie Plätze und feste Positionen funktionieren ab Firmware 0.2.26. Bis zu diesem Update rückt dieser Bildschirm (Firmware "},{t:4,k:"firmware"},{t:3,v:") die Kacheln auf den ersten freien Platz vor."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm-Layout"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Seite hinzufügen"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Höchstens 1 Seite"},{t:2,i:[{t:3,v:"Höchstens "},{t:4,k:"n"},{t:3,v:" Seiten"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Seite "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Seite entfernen"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Die folgenden Seiten rücken um eine Stelle nach vorn"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Kopfleiste bearbeiten"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Freier Platz. Klicke, um hier eine Kachel hinzuzufügen, oder ziehe eine hierher."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Freier Platz "},{t:4,k:"slot"},{t:3,v:" auf Seite "},{t:4,k:"page"},{t:3,v:": nächste Kachel hier hinzufügen"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Nächste Kachel kommt hierhin"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Leer"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bibliothek"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Entität"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Entitäten"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Nach Name, Gerät oder Bereich suchen…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Entität hinzufügen"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Alle"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Leuchten"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klima"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Schalter"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aktionen"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Skripte"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatoren"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Abdeckungen"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Szenen"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Staubsauger"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensoren"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Medien"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Wetter"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Werte"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Auswahl"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personen"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Bereich"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Alle Bereiche"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Platzierte ausblenden"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Ausblenden, was schon auf diesem Bildschirm ist"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Alles hier ist schon auf diesem Bildschirm."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Keine Entitäten gefunden. Versuche einen anderen Namen, Bereich oder Filter."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Dieser Bildschirm fasst 1 Kachel."},{t:2,i:[{t:3,v:"Dieser Bildschirm fasst "},{t:4,k:"n"},{t:3,v:" Kacheln."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Dieser Bildschirm fasst 1 Kachel; mit einem Firmware-Update sind es 48."},{t:2,i:[{t:3,v:"Dieser Bildschirm fasst "},{t:4,k:"n"},{t:3,v:" Kacheln; mit einem Firmware-Update sind es 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Ziehe eine Entität auf eine Seite oder tippe auf +, um sie auf den ersten freien Platz zu setzen. ⌘K durchsucht alles."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Leuchte"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klima"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Staubsauger"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilator"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Abdeckung"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Medien"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Schalter"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Schalter"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Szene"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Skript"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Wetter"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Wert"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Wert"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Auswahl"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Auswahl"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aktion"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Aktion"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sonne"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Person"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Kamera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Bild"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entität"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"Standard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"großer Wert"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Wettervorhersage"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Diagramm"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Digitaluhr"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Analoguhr"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Sonnenbahn"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Livebild"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Albumcover"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"doppelt"}},full:{t:0,b:{t:2,i:[{t:3}],s:"ganze Seite"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Name auf dem Bildschirm"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (aus Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (Standard)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ein gewähltes Symbol zeigt der Bildschirm ab Firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Führt zu Seite"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (leer)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Navigationskacheln brauchen Firmware 0.2.62: Drücke zuerst beim Bildschirm auf „Aktualisieren“."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Dieser Bildschirm hat keine Seite "},{t:4,k:"page"},{t:3,v:", daher öffnet ein Tippen seine letzte Seite. Wähle eine andere Seite."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Ein Tippen auf die Kachel öffnet diese Seite."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Anzeige"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Digitaluhr"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Analoguhr"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Name und Status"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Großer Wert"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Wettervorhersage"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Diagramm"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Sonnenbahn"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Livebild"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Ein kleines Bild der Kamera anstelle des Symbols, im Takt unten aufgefrischt, solange die Seite zu sehen ist. Ein Tipp öffnet sie weiterhin bildschirmfüllend."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ein Livebild braucht Firmware 0.2.77 oder neuer: Nach dem Speichern beim Bildschirm auf Aktualisieren drücken."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Albumcover"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"Das Albumcover des laufenden Titels anstelle des Symbols, wie auf der eigenen Kachel von Home Assistant; ein Player ohne Bild behält sein Symbol. Ein Tipp öffnet weiterhin die Karte."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Das Albumcover auf der Kachel braucht Firmware 0.2.78 oder neuer: Nach dem Speichern beim Bildschirm auf Aktualisieren drücken."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant hat für diese Entität keine Zahlen, daher bleibt das Diagramm leer. Wähle eine andere Anzeige."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Dieser Wetterdienst hat in Home Assistant keine Tagesvorhersage. Wähle eine andere Anzeige."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Auffrischen"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Alle "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Größe"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Doppelt breit"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Ganze Seite"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Ganze Seite: eine große Taste in der eigenen Farbe der Kachel; am unteren Rand sitzen ein Schieberegler, Bedienelemente oder ein Diagramm."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Eine ganzseitige Kachel braucht Firmware 0.2.62: Drücke zuerst beim Bildschirm auf „Aktualisieren“."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Seite"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Neue Seite"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Direkte Steuerung auf der Kachel"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant bietet diese Steuerung für diese Entität nicht an, daher bleibt sie auf dem Bildschirm leer. Wähle eine andere."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Am unteren Rand der ganzseitigen Kachel; ein Tippen woanders wirkt wie unten eingestellt."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"Rechts auf der doppelt breiten Kachel, wie die Zeilen in Home Assistant. Ein Tippen auf den Namen wirkt wie unten eingestellt."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Der Bildschirm zeigt die direkte Steuerung ab Firmware 0.2.19; bis dahin bleibt die Kachel, wie sie war."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Beim Tippen"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Steuerung öffnen"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nur anzeigen"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Ein / Aus"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Aktion ausführen"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant kann dies nicht ein- und ausschalten, daher bewirkt ein Tippen nichts. Wähle eine andere Option."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ab Firmware 0.2.58 schaltet der Bildschirm das ein und aus: Drücke beim Bildschirm auf „Aktualisieren“. Bis dahin öffnet ein Tippen die Karte."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Halte die Kachel gedrückt, um ihre Karte zu öffnen."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Kleiner Schieberegler auf der Kachel"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Nein"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Ja, direkt steuern"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant hat für diese Entität nichts, was ein Schieberegler ändern kann. Wähle „Nein“."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Verlauf"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Stunde"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Stunden"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pastellhintergrund"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Hintergrund: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", Platz "},{t:4,k:"slot"},{t:3,v:" auf Seite "},{t:4,k:"page"},{t:3,v:". Enter: einstellen, Pfeiltasten: verschieben"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Kachel entfernen"}},remove_named:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" entfernen"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Aktion"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Frage Home Assistant, welche Aktionen diese Entität hat…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant antwortet gerade nicht. Versuche es gleich noch einmal."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Wähle eine Aktion"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Suchen, z. B. umschalten, Position oder wiedergeben"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Aktion suchen"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Keine Aktion gefunden."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant bietet diese Aktion für diese Entität nicht mehr an, daher bewirkt ein Tippen nichts. Wähle eine andere."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (optional)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Nicht gesetzt"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant braucht "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Der Bildschirm führt Aktionen ab Firmware 0.2.58 aus: Drücke beim Bildschirm auf „Aktualisieren“. Bis dahin wirkt ein Tippen wie „Automatisch“."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Symbol"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Kein Symbol"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Suchen, z. B. Lampe, Musik oder Tür"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Symbol suchen"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Kein Symbol, nur Text"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Symbol: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Kein Symbol gefunden."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Aktuelle Daten"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Verbindung, Status und unterstützte Eigenschaften"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Wird abgerufen…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Aktueller HA-Status wird abgerufen…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Status: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Kleiner Schieberegler: "},{t:4,k:"slider"},{t:3,v:" · Anzeige: "},{t:4,k:"display"},{t:3,v:" · Größe: "},{t:4,k:"size"},{t:3,v:" · Steuerung: "},{t:4,k:"control"},{t:3,v:" · Hintergrund: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"ja"}},no:{t:0,b:{t:2,i:[{t:3}],s:"nein"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"keine"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Standard"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Erneut abrufen"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" aus der Kopfleiste entfernt"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In der Kopfleiste ist Platz für 1 Element."},{t:2,i:[{t:3,v:"In der Kopfleiste ist Platz für "},{t:4,k:"n"},{t:3,v:" Elemente."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"Das ist schon in der Kopfleiste."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Kopfleiste"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Kopfleiste: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Vom Bildschirm selbst, funktioniert auch ohne Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" von "},{t:4,k:"n"},{t:3,v:" Element"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" von "},{t:4,k:"n"},{t:3,v:" Elementen"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Links: Name"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Zum Beispiel: Wohnzimmer"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Rechts: Uhrzeit, Sensoren oder eine Uhr"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", Platz "},{t:4,k:"slot"},{t:3,v:". Enter: einstellen, Pfeile: verschieben"}]}},remove_named:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" aus der Kopfleiste entfernen"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Höchstens 1 Element"},{t:2,i:[{t:3,v:"Höchstens "},{t:4,k:"n"},{t:3,v:" Elemente"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Uhrzeit, Datum, Analoguhr oder eine Entität hinzufügen"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Uhrzeit, Datum oder Entität hinzufügen"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Nicht alles passt neben den Namen: Der Bildschirm lässt die gestrichelten Elemente weg. Entferne eines oder wähle einen kürzeren Namen."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Zum Umsortieren ziehen; zum Einstellen auf ein Element tippen."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensoren, Datum und Analoguhr erscheinen ab Firmware "},{t:4,k:"version"},{t:3,v:"; bis zu diesem Update zeigt dieser Bildschirm den Namen und, falls die Uhrzeit in der Leiste ist, die Uhr."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Ausgeblendet: gerade nicht aktiv"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Passt nicht neben den Namen"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Zifferblatt"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Gerade ausgeblendet: nicht aktiv"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Passt gerade nicht neben den Namen"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"So sieht es auf dem Bildschirm aus"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Kleines Zifferblatt mit der Uhrzeit"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Inhalt"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"„Zuletzt geändert“ zählt auf dem Bildschirm selbst weiter: „Gerade eben“, „Vor 5 Min.“, „Gestern“."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (wie Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Anzeigen"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"„Nur wenn aktiv“ blendet das Element aus, solange es aus, geschlossen, abwesend oder 0 ist. Praktisch für eine offene Tür, eine laufende Waschmaschine oder wer zu Hause ist."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"24-Stunden-Uhr · ändern unter "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"12-Stunden-Uhr · ändern unter "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen → Sprache & Region"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Heute: "},{t:4,k:"date"},{t:3,v:". Das Datum folgt der eigenen Uhr des Bildschirms."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Nach oben"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Nach unten"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Zur Kopfleiste hinzufügen"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" von "},{t:4,k:"n"},{t:3,v:" Platz belegt"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" von "},{t:4,k:"n"},{t:3,v:" Plätzen belegt"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Vom Bildschirm selbst"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Schon hinzugefügt"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Vorschläge aus Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Eine Entität"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Nach Name, Bereich oder Entität suchen, z. B. Temperatur oder Tür"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Entität für die Kopfleiste suchen"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Keine Entitäten gefunden."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helligkeit"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Nacht"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helligkeit"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Dunkler Modus"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Auto-Standby"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Standby nach"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helligkeit Standby"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Nachtmodus"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Beginnt"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Endet"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helligkeit nachts"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Zurück zu Seite 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Nach"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Auch im Standby"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Zwischen Seiten wischen"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Seitentasten"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Drehung"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" Sek."}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" Min."}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" Std."}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" Std. "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Die Einstellungen des anderen Bildschirms werden noch gespeichert. Versuche es gleich noch einmal."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Seitentasten und Wischen sind aus, daher wechseln nur Navigationskacheln die Seite."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Seite "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"den Seiten "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskachel zu "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskacheln zu "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskachel zu "},{t:4,k:"targets"},{t:3,v:", aber keine zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]},{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskacheln zu "},{t:4,k:"targets"},{t:3,v:", aber keine zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskachel zu "},{t:4,k:"targets"},{t:3,v:", aber keine zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]},{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskacheln zu "},{t:4,k:"targets"},{t:3,v:", aber keine zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Du hast keine Navigationskacheln."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Du hast keine Navigationskacheln zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Du hast keine Navigationskacheln zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Die Kacheln zu "},{t:4,k:"pages"},{t:3,v:" liegen nur auf Seiten, die du nicht erreichst."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Von "},{t:4,k:"pages"},{t:3,v:" führt keine Kachel zurück zu Seite 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Dieser Bildschirm ist offline. Seine Einstellungen lassen sich ändern, sobald er wieder da ist."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Änderungen gelten sofort auf dem Bildschirm und erscheinen hier, wenn sie dort geändert werden."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Änderungen gelten sofort. Ab Firmware 0.2.49 speichert der Bildschirm sie selbst."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Diese Entität ist in Home Assistant deaktiviert, oder der Bildschirm startet neu."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verringern"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" erhöhen"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Update wird gestartet…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Firmware wird erstellt…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Firmware wird per Wi-Fi übertragen…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Wird erstellt und installiert…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Warte, bis der Bildschirm wieder da ist…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Prüfe, ob er stabil bleibt…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Neue Sprache: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Die Bildschirme aktualisieren sich jetzt nachts automatisch."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Automatische Updates sind aus."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Firmware-Updates"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Aktualisiere auf Firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Noch kein Bildschirm gekoppelt. Neue Bildschirme bekommen Firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" ist für "},{t:4,k:"n"},{t:3,v:" Bildschirm verfügbar."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" ist für "},{t:4,k:"n"},{t:3,v:" Bildschirme verfügbar."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Alle Bildschirme haben Firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 Bildschirm aktualisieren"},{t:2,i:[{t:3,v:"Alle "},{t:4,k:"n"},{t:3,v:" Bildschirme aktualisieren"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Neu in Firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Jede Nacht automatisch aktualisieren"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Zwischen 03:00 und 06:00 Uhr, ein Bildschirm nach dem anderen. Stoppt bei einem Fehler und meldet ihn in Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Skill installiert. Claude Code nutzt ihn sofort."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Skill installiert. Starte Claude Code einmal neu, damit es den neuen Skills-Ordner findet."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Bring Claude ESP Screens bei und frag dann: „Zeig eine Meldung auf allen meinen Bildschirmen, wenn der Briefkasten voll ist.“ Claude kennt die Meldungs-Ereignisse und jedes Feld, jede Farbe und jedes Symbol."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Für Claude Code installieren"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Erneut installieren"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Skill aktualisieren"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Nicht installiert"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Installiert"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Installiert · eine neuere Version ist bereit"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Für Claude Code in Home Assistant. Schreibt eine Datei nach "},{t:4,k:"path"},{t:3,v:"; erneutes Installieren ersetzt sie."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Für claude.ai herunterladen"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Lade die ZIP-Datei in Claude unter Anpassen → Skills hoch."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Alles rund um deine Bildschirme."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Meine Bildschirme"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirme"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Füge einen Bildschirm hinzu oder erstelle und installiere die Firmware eines vorhandenen neu."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Per USB oder Wi-Fi erstellen und installieren"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Sprache & Region"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirmsprache"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Sprache von Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Sprache von Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Die Bildschirme zeigen Englisch, bis die Sprache von Home Assistant verfügbar ist."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · noch nicht geprüft, Hilfe willkommen"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" ist noch nicht geprüft, Hilfe ist willkommen: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"Anleitung zum Übersetzen"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Nach einer Änderung braucht jeder Bildschirm ein eigenes Firmware-Update: über seine Schaltfläche „Aktualisieren“ oder mit den nächtlichen Updates."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Uhrzeitformat"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatisch, folgt der Sprache ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 Stunden"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 Stunden"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Zahlenformat"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatisch, folgt der Sprache ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Dein Home Assistant-Profil: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Diese verwenden"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"Der Editor selbst folgt der Sprache deines Home Assistant-Profils."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Jeder Bildschirm übernimmt die neue Sprache mit seinem nächsten Update."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Eine Karte über den ganzen Bildschirm, ausgelöst von einer Automation, auf einem Bildschirm oder auf allen. Der Spickzettel enthält die Aktionsnamen, Felder, Symbole und Farben und ein Formular zum Ausprobieren."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Vollbild-Benachrichtigungen aus einer Automation"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm-Firmware erstellen und installieren"}},intro:{t:0,b:{t:2,i:[{t:3,v:"Die eingebaute ESPHome CLI nutzt dein eigenes Profil (YAML mit Schlüsseln) und deine Secrets. Wähle das Profil des Bildschirms, dann einen USB-Port (Bildschirm am Home Assistant-Rechner angeschlossen), "},{t:4,k:"ota"},{t:3,v:" mit dem Hostnamen oder "},{t:4,k:"download"},{t:3,v:", um die Firmware von deinem eigenen Computer aus auf den Bildschirm zu spielen. "},{t:4,k:"check"},{t:3,v:" validiert nur, "},{t:4,k:"build"},{t:3,v:" kompiliert, "},{t:4,k:"install"},{t:3,v:" spielt die Firmware auf den Bildschirm. Deine Kacheln bleiben in ESP Screens, wie sie sind. Das erste Erstellen dauert ein paar Minuten."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Prüfen"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Nur erstellen"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Erstellen & installieren"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Erstellen & herunterladen"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Die ESPHome CLI fehlt. Aktualisiere die App auf 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Wähle das gewünschte Profil, dann einen USB-Port, eine IP-Adresse oder „Download“."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome-Profil"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Installieren auf"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · noch kein Board am Home Assistant-Rechner gefunden"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Download · von deinem eigenen Computer flashen"}},host:{t:0,b:{t:2,i:[{t:3}],s:"IP-Adresse oder Hostname"}},download_file:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" herunterladen"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Spiele sie mit "},{t:4,k:"esphome_web"},{t:3,v:" in Chrome oder Edge auf den Bildschirm: „Connect“ klicken, den USB-Port des Bildschirms wählen, „Install“ klicken und diese Datei auswählen. Sie enthält dein Wi-Fi-Passwort und die Schlüssel des Bildschirms: Behalte sie für dich."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Verbinden und installieren."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profil gespeichert."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Einen Moment…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Bereit zum Herunterladen."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Fertig."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Das hat nicht geklappt."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens legt das eigene Profil des Bildschirms mit eindeutigen Schlüsseln an und erstellt die Firmware. Schließe den Bildschirm mit einem USB-Datenkabel an den Rechner an, auf dem Home Assistant läuft, oder lade die Firmware herunter und spiele sie von deinem eigenen Computer aus auf den Bildschirm."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Welchen Bildschirm hast du?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 Zoll"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 Zoll"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Name"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm Wohnzimmer"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Gerätename"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"anpassen"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Jeder Bildschirm bekommt ein eigenes Profil mit eigenen Schlüsseln. Vier Bildschirme? Dann das Ganze viermal, mit je einem anderen Namen."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Kleinbuchstaben, Ziffern und Bindestriche. Für jeden Bildschirm ein anderer Name."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi-Name (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi-Passwort"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Einmal ausfüllen: ESP Screens speichert das in der secrets.yaml von ESPHome, weitere Bildschirme nutzen es automatisch."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"In deiner secrets.yaml von ESPHome fehlen noch Wi-Fi-Angaben. ESP Screens ergänzt nur die fehlenden Zeilen."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Die Wi-Fi-Daten kommen aus deiner secrets.yaml von ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Die secrets.yaml im ESPHome-Ordner ist kein gültiges YAML. Korrigiere zuerst die Datei; sie wird nicht überschrieben."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Installieren über"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Später · nur Profil speichern"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Schließe den Bildschirm mit einem USB-Datenkabel an den Home Assistant-Rechner an; die Liste aktualisiert sich von selbst. Oder wähle „Download“, um deinen eigenen Computer zu nutzen."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Lade die Firmware herunter und spiele sie in Chrome oder Edge von deinem eigenen Computer aus auf den Bildschirm. Danach laufen Updates über Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Das Profil kommt in den ESPHome-Ordner. Installieren kannst du später über Firmware & USB oder im ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Mehr als ein Board angeschlossen: Wähle den Port dieses Bildschirms."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Einmal per USB; danach läuft alles drahtlos."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installieren"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Profil speichern"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Es wird schon eine Firmware erstellt oder installiert ("},{t:4,k:"file"},{t:3,v:"). Warte, bis das fertig ist."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"In dieser Installation fehlt die ESPHome CLI; nur das Speichern des Profils ist möglich."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" liegt im ESPHome-Ordner"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Firmware wird auf "},{t:4,k:"name"},{t:3,v:" geschrieben…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Firmware wird erstellt…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Firmware für "},{t:4,k:"name"},{t:3,v:" ist fertig"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Firmware ist auf "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Erstellen fehlgeschlagen"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Installation fehlgeschlagen"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Installiere es später über Firmware & USB: Wähle dieses Profil, dann den USB-Port des Home Assistant-Rechners oder „Download“, um die Firmware von deinem eigenen Computer aus auf den Bildschirm zu spielen. Speichere den API-Schlüssel für die Kopplung:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Zieh das USB-Kabel noch nicht ab."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Das erste Erstellen dauert auf einem Raspberry Pi ein paar Minuten. Du kannst diese Seite verlassen: Die Installation läuft weiter, und du findest sie unter „Neuer Bildschirm“ wieder."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Das erste Erstellen dauert auf einem Raspberry Pi ein paar Minuten. Du kannst diese Seite verlassen: Die Firmware wird weiter erstellt, und du findest sie unter „Neuer Bildschirm“ wieder."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Spiele sie von deinem eigenen Computer aus auf den Bildschirm und kopple den Bildschirm dann mit Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"Der Bildschirm startet und verbindet sich mit deinem Wi-Fi. Kopple ihn jetzt mit Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"Der Bildschirm startet und verbindet sich mit deinem Wi-Fi. Das CYD fragt zuerst nach einer Touch-Kalibrierung: Tippe auf die Kreuze. Kopple ihn jetzt mit Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Siehe das Protokoll unten."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" – mit einem USB-Datenkabel."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Schließe den Bildschirm an deinen Computer an"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" in Chrome oder Edge, klicke auf „Connect“ und wähle den USB-Port des Bildschirms."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Öffne "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" und wähle "},{t:4,k:"file"},{t:3,v:". Der Bildschirm startet neu und verbindet sich mit deinem Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" und wähle "},{t:4,k:"file"},{t:3,v:". Der Bildschirm startet neu und verbindet sich mit deinem Wi-Fi. Das CYD fragt zuerst nach einer Touch-Kalibrierung: Tippe auf die Kreuze."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Klicke auf „Install“"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Die Datei enthält dein Wi-Fi-Passwort und die Schlüssel des Bildschirms: Behalte sie für dich."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"API-Schlüssel"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Das passiert außerhalb von ESP Screens. Home Assistant entdeckt "},{t:4,k:"name"},{t:3,v:" als ESPHome-Gerät; klicke auf „Hinzufügen“. Nicht entdeckt? Füge ESPHome manuell mit der IP-Adresse des Bildschirms hinzu."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Öffne in Home Assistant Einstellungen → Geräte & Dienste."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:", wenn Home Assistant nach einem Verschlüsselungscode fragt."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Füge den API-Schlüssel von oben ein"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ESPHome-Integration → Konfigurieren → „Dem Gerät erlauben, Home Assistant-Aktionen auszuführen“. Ohne das sieht der Bildschirm alles, steuert aber nichts."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"HA-Aktionen erlauben:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Zurück in ESP Screens erscheint der Bildschirm innerhalb von etwa dreißig Sekunden links in der Liste; bis dahin steht er dort als „noch nicht in Home Assistant“."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wähle deine Kacheln."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome-Protokoll"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Erneut versuchen"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Weiteren Bildschirm installieren"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Neu beginnen"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Fertig"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Meldungen · Spickzettel"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Eine Vollbild-Benachrichtigung aus einer Automation."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Jeder Bildschirm hat die Aktion "},{t:4,k:"action"},{t:3,v:". Sie legt eine Karte über alles, weckt den Bildschirm und hält die Hintergrundbeleuchtung auf normaler Helligkeit, bis jemand auf die Taste tippt oder das Timeout abläuft. Home Assistant selbst zeigt für ESPHome-Aktionen keine Erklärungen oder Auswahllisten; alles, was du ausfüllen kannst, steht hier."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Der Spickzettel wird noch geladen; einen Moment."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Jemand ist an der Tür"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Tür 3, hinten"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Komme"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Abschnitte"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Ausprobieren"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Deine Bildschirme"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"In einer Automation"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Alle Bildschirme"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Die Felder"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Symbole"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Farben"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Verhalten"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Ereignisse"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Tipps"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Sende jetzt eine Meldung mit denselben Feldern, die auch eine Automation sendet. Der Bildschirm zeigt die Karte und lässt bei eingeschaltetem Blinken seine Hintergrundbeleuchtung blinken."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm"}},all:{t:0,b:{t:2,i:[{t:3,v:"Alle Bildschirme ("},{t:4,k:"ready"},{t:3,v:" bereit)"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · nicht bereit"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Titel"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Untertitel"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Symbol"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Farbe"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Tastentext"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Timeout (Sekunden, 0 wartet auf die Taste)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Hintergrundbeleuchtung blinken lassen"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Viermal, wenn die Meldung ankommt."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Wird gesendet…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Meldung senden"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"An "},{t:4,k:"n"},{t:3,v:" Bildschirm gesendet."}]},{t:2,i:[{t:3,v:"An "},{t:4,k:"n"},{t:3,v:" Bildschirme gesendet."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"An "},{t:4,k:"name"},{t:3,v:" gesendet."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"An den Bildschirm gesendet."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 übersprungen (offline oder alte Firmware)."},{t:2,i:[{t:4,k:"n"},{t:3,v:" übersprungen (offline oder alte Firmware)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Leer gelassen: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Kein Bildschirm konnte sie anzeigen: Prüfe, ob ein Bildschirm mit Firmware "},{t:4,k:"version"},{t:3,v:" oder neuer online ist."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Weiß (Standard)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Jeder Bildschirm hat seine eigene Aktion, mit dem Gerätenamen darin. Ab Firmware "},{t:4,k:"version"},{t:3,v:"; aktualisiere einen älteren Bildschirm mit seiner Schaltfläche „Aktualisieren“ unter „Bildschirme“."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Noch kein Bildschirm gekoppelt. Installiere einen über „Neuer Bildschirm“; die Aktion erscheint, sobald Home Assistant den Bildschirm sieht."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● Firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Update nötig · Firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Gerätename unbekannt · Bildschirm aktualisieren"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Meldung anzeigen"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Meldung schließen"}}},howto:{add:{t:0,b:{t:2,i:[{t:3,v:"Klicke auf "},{t:4,k:"add"},{t:3,v:" und suche nach "},{t:4,k:"esphome"},{t:3,v:". Wähle die Aktion deines Bildschirms: Home Assistant nennt sie „Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"“."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aktion hinzufügen"}},device:{t:0,b:{t:2,i:[{t:3}],s:"Gerätename"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant fragt nach allen sieben; lass leer, was du nicht brauchst ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", aus)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fülle die Felder aus."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Lieber YAML? Wähle an der Aktion "},{t:4,k:"edit"},{t:3,v:" und füge das Beispiel unten ein."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Beispiel für"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"einen Bildschirm (noch nicht gekoppelt)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"In YAML bearbeiten"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"YAML kopieren"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Alle Bildschirme auf einmal"}},text:{t:0,b:{t:2,i:[{t:3,v:"Löse das Ereignis "},{t:4,k:"show"},{t:3,v:" mit denselben Feldern aus, und ESP Screens gibt die Meldung an jeden Bildschirm weiter, der online ist, auch an später hinzugefügte. "},{t:4,k:"dismiss"},{t:3,v:" entfernt sie überall. Nimm in einer Automation die Aktion "},{t:4,k:"event"},{t:3,v:" oder füge das Beispiel unter "},{t:4,k:"edit"},{t:3,v:" ein. Lass die Felder weg, die du nicht brauchst. Dafür muss ESP Screens laufen."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Manuelles Ereignis auslösen"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Text ist frei wählbar; das Limit gilt in Bytes, und ein Umlaut oder Buchstabe mit Akzent zählt doppelt. Was nicht passt, bekommt Auslassungspunkte (Titel) oder fällt weg (Untertitel)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Feld"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Typ"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Funktion"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Beispiel"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limit"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"Text"}},int:{t:0,b:{t:2,i:[{t:3}],s:"Zahl"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"ein / aus"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entität"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" Bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"0 bis 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, Firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Trage den Namen in "},{t:4,k:"field"},{t:3,v:" ein, zum Beispiel "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" und der Hex-Codepoint ("},{t:4,k:"hex"},{t:3,v:") gehen auch. Nur diese Symbole sind in der Firmware enthalten; jeder andere Name zeigt das Warndreieck. Tippe auf ein Symbol, um seinen Namen zu kopieren."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Praktisch für Benachrichtigungen"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Symbol suchen"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Nach Name oder Beschreibung suchen…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Außerdem verfügbar: Steuerungs- und Wettersymbole"}},copy:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" kopieren"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Kein Symbol für „"},{t:4,k:"query"},{t:3,v:"“. Unbekannte Namen zeigen das Warndreieck ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Trage den Namen in "},{t:4,k:"field"},{t:3,v:" ein. Das sind die Pastelltöne der Kacheln, mit dunklem Text. Leer oder unbekannt ergibt die weiße Karte. Zum Kopieren tippen."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Eine Meldung weckt einen gedimmten oder dunklen Bildschirm sofort und erscheint über jeder Seite, jeder offenen Lichtkarte und der Standby-Ebene."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Weckt den Bildschirm."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Solange die Karte zu sehen ist, bleibt die Hintergrundbeleuchtung auf normaler Helligkeit. Standby und Nachtzeit warten. Nach dem Drücken der Taste beginnt die normale Standby-Zeit von vorn."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"An bis zur Taste."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" wartet auf die Taste, egal wie lange das dauert. Mit "},{t:4,k:"minute"},{t:3,v:" verschwindet die Karte nach einer Minute, aber die Taste schließt sie früher."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Timeout."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" lässt die Hintergrundbeleuchtung beim Eintreffen der Meldung viermal blinken (etwa eine Sekunde lang) und lässt den Bildschirm danach an."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Blinken."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Eine neue Meldung ersetzt die aktuelle; es gibt keinen Stapel. Die ersetzte Meldung endet mit "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ersetzen."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" entfernt die Karte, zum Beispiel wenn die Tür schon offen ist. Ohne Meldung bewirkt diese Aktion nichts."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aus der Ferne schließen."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" bewirkt nichts; nur die Taste schließt sie. So schließt ein Tippen zum Aufwecken die Meldung nie aus Versehen."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tippen neben die Karte"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Wenn eine Meldung endet, löst sie das Ereignis "},{t:4,k:"event"},{t:3,v:" aus, mit "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (dem Gerätenamen) und der "},{t:4,k:"device_id"},{t:3,v:", die Home Assistant hinzufügt. Zu sehen unter Einstellungen → Werkzeuge → Ereignisse."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Wann"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Warten, bis jemand die Taste drückt"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Nutze eine "},{t:4,k:"bold"},{t:3,v:": Orange für die Tür, Rot für Rauch oder Wasser, Grün für „erledigt“. Der Text bleibt immer dunkel und lesbar."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"Farbe je Art der Benachrichtigung"}},short:{t:0,b:{t:2,i:[{t:3,v:"Halte den Titel "},{t:4,k:"bold"},{t:3,v:"; ein Bildschirm zeigt etwa zwanzig Zeichen in einer Zeile und kürzt einen längeren Titel mit Auslassungspunkten. Details gehören in den Untertitel."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"kurz"}},button:{t:0,b:{t:2,i:[{t:3,v:"Ein "},{t:4,k:"bold"},{t:3,v:" macht aus der Benachrichtigung eine Frage: „Komme“, „Gesehen“, „Ausschalten“. Das Ereignis verrät dann, wer reagiert hat."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"eigener Tastentext"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Eine Meldung, die sich von selbst erledigt (die Tür geht auf, die Wäsche wird herausgenommen), schließt du in derselben Automation mit "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Alle Bildschirme? Löse "},{t:4,k:"event"},{t:3,v:" einmal aus (siehe „Alle Bildschirme auf einmal“). Die Bildschirme arbeiten trotzdem unabhängig, und jeder meldet sich mit seinem eigenen "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Für die Automation lieber "},{t:4,k:"bold"},{t:3,v:"? Installiere den ESP Screens-Skill unter Einstellungen → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"Claude fragen"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Türklingel: die Meldung zeigen und warten, bis jemand die Taste drückt."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Jemand kommt zur Tür."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Erweitert · lokale Anpassung"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML-Anpassung"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML-Anpassung · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Diese kleine Datei gehört dir. Sie wird nach dem gemeinsamen Bildschirm-Paket geladen und bleibt erhalten, wenn ESP Screens aktualisiert wird. Ändere hier hardwarespezifische Details, etwa ein Display-Modell."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Was kann ich gefahrlos ändern?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Display, Touchscreen, Substitutions, Pins und andere Gerätedetails. Name, Wi-Fi, API, OTA und Paket-Links bleiben von ESP Screens verwaltet."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Aktiv"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Bereit zum Einbinden"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"Lokale YAML-Anpassung"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Beispiel verwenden"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Leeren"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 Zeichen"},{t:2,i:[{t:4,k:"n"},{t:3,v:" Zeichen"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 Zeile"},{t:2,i:[{t:4,k:"n"},{t:3,v:" Zeilen"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Speichern & prüfen"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Anpassung speichern"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Für diesen Bildschirm wurde kein ESPHome-Profil gefunden."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Änderungen hier gelten ab dem nächsten Erstellen der Firmware."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Speichere einmal, um diese Datei in das Profil einzubinden."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Wird geprüft und gespeichert…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Die Anpassung bleibt bei Firmware-Updates erhalten."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML-Anpassung gespeichert."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. ESPHome prüft das vollständige Profil…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome prüft das Profil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome prüft das Profil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Das vollständige Profil ist gültig. Du kannst es gefahrlos erstellen und installieren."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome hat das vollständige Profil abgelehnt. Das ganze Protokoll findest du unter Firmware & USB."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Den aktuellen Text durch das Beispiel ersetzen?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Beispiel geladen. Speichere es, wenn du so weit bist."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Die lokale Anpassung leeren?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Nach dem Speichern ist die Anpassung leer."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Zuhause"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Unbekannt"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Nicht verfügbar"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Heizbetrieb"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Kühlbetrieb"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Heizen/Kühlen"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Entfeuchtung"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Nur Lüftung"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Heizbetrieb"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Kühlbetrieb"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Leerlauf"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Entfeuchtung"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Lüftung"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Vorheizen"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Enteisung"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Wird geöffnet"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Wird geschlossen"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Wiedergabe"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Pausiert"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Leerlauf"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"Standby"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Zuhause"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Abwesend"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Über dem Horizont"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Unter dem Horizont"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Angedockt"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Reinigt"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Pausiert"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Rückkehr zur Ladestation"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Leerlauf"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Sonnig"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Klare Nacht"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Bewölkt"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Teilweise bewölkt"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Regnerisch"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Strömender Regen"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Schneefall"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Schneeregen"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Nebel"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Hagel"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Gewitter"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Gewitter, regnerisch"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Windig"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Außergewöhnlich"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Niedrig"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Wird geladen"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Wird nicht geladen"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Kalt"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Verbunden"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Getrennt"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Heiß"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Licht erkannt"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Kein Licht"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Aufgeschlossen"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Abgeschlossen"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Nass"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Trocken"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"Bewegt sich"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Bewegt sich nicht"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Eingesteckt"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Ausgesteckt"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Zuhause"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Abwesend"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problem"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"In Betrieb"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Außer Betrieb"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Unsicher"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Sicher"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Manipulation erkannt"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Update verfügbar"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Aktuell"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Aktivieren"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Ausführen"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Drücken"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Niedrig"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Mittel"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Hoch"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Mittig"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Fokus"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffus"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Oben"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Beides"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Vertikal"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Gerade eben"}},minutes_ago:{t:0,b:{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Min."}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Stunde"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Stunden"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Gestern"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Tag"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Tagen"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Woche"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Wochen"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Monat"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Monaten"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Jahr"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Jahren"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" Min."}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In 1 Stunde"},{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" Stunden"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Morgen"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In 1 Tag"},{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" Tagen"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"Sonntag"}},{t:0,b:{t:2,i:[{t:3}],s:"Montag"}},{t:0,b:{t:2,i:[{t:3}],s:"Dienstag"}},{t:0,b:{t:2,i:[{t:3}],s:"Mittwoch"}},{t:0,b:{t:2,i:[{t:3}],s:"Donnerstag"}},{t:0,b:{t:2,i:[{t:3}],s:"Freitag"}},{t:0,b:{t:2,i:[{t:3}],s:"Samstag"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"So"}},{t:0,b:{t:2,i:[{t:3}],s:"Mo"}},{t:0,b:{t:2,i:[{t:3}],s:"Di"}},{t:0,b:{t:2,i:[{t:3}],s:"Mi"}},{t:0,b:{t:2,i:[{t:3}],s:"Do"}},{t:0,b:{t:2,i:[{t:3}],s:"Fr"}},{t:0,b:{t:2,i:[{t:3}],s:"Sa"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"So"}},{t:0,b:{t:2,i:[{t:3}],s:"Mo"}},{t:0,b:{t:2,i:[{t:3}],s:"Di"}},{t:0,b:{t:2,i:[{t:3}],s:"Mi"}},{t:0,b:{t:2,i:[{t:3}],s:"Do"}},{t:0,b:{t:2,i:[{t:3}],s:"Fr"}},{t:0,b:{t:2,i:[{t:3}],s:"Sa"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"Januar"}},{t:0,b:{t:2,i:[{t:3}],s:"Februar"}},{t:0,b:{t:2,i:[{t:3}],s:"März"}},{t:0,b:{t:2,i:[{t:3}],s:"April"}},{t:0,b:{t:2,i:[{t:3}],s:"Mai"}},{t:0,b:{t:2,i:[{t:3}],s:"Juni"}},{t:0,b:{t:2,i:[{t:3}],s:"Juli"}},{t:0,b:{t:2,i:[{t:3}],s:"August"}},{t:0,b:{t:2,i:[{t:3}],s:"September"}},{t:0,b:{t:2,i:[{t:3}],s:"Oktober"}},{t:0,b:{t:2,i:[{t:3}],s:"November"}},{t:0,b:{t:2,i:[{t:3}],s:"Dezember"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"Jan."}},{t:0,b:{t:2,i:[{t:3}],s:"Feb."}},{t:0,b:{t:2,i:[{t:3}],s:"März"}},{t:0,b:{t:2,i:[{t:3}],s:"Apr."}},{t:0,b:{t:2,i:[{t:3}],s:"Mai"}},{t:0,b:{t:2,i:[{t:3}],s:"Juni"}},{t:0,b:{t:2,i:[{t:3}],s:"Juli"}},{t:0,b:{t:2,i:[{t:3}],s:"Aug."}},{t:0,b:{t:2,i:[{t:3}],s:"Sept."}},{t:0,b:{t:2,i:[{t:3}],s:"Okt."}},{t:0,b:{t:2,i:[{t:3}],s:"Nov."}},{t:0,b:{t:2,i:[{t:3}],s:"Dez."}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:". "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:". "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:". "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:"."}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"1"}},percent:{t:0,b:{t:2,i:[{t:3}],s:" %"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Seite "},{t:4,k:"n"}]}}}}};export{t as default}; +const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Rückgängig"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"unbekannt"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Nicht gespeicherte Änderungen"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Abbrechen"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Geräte & Dienste öffnen"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Speichern & senden"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Wird gespeichert…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Aktuelle Daten abrufen"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 Ergebnis. Tippe weiter, um die Suche einzugrenzen."},{t:2,i:[{t:4,k:"n"},{t:3,v:" Ergebnisse. Tippe weiter, um die Suche einzugrenzen."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Schließen"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Entfernen"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Ändern"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Wird geladen…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Zurück"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Kopieren"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Neuer Bildschirm"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware & USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Meldungen"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Verbinden und installieren"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Das hat nicht geklappt. Lade die Seite neu und versuche es noch einmal."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"API-Schlüssel kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"API-Schlüssel ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Layout-JSON kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Layout-JSON ist markiert. Kopiere es mit Ctrl+C oder Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Aktionsname kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Aktionsname ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"YAML ist markiert. Kopiere es mit Ctrl+C oder Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Symbolname kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Symbolname ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Leerer Farbwert kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Leerer Farbwert ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Farbname kopiert."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Farbname ist markiert. Kopiere ihn mit Ctrl+C oder Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Verwaltungsseite nicht erreichbar · neuer Versuch…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant verbunden"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Verbinde erneut mit Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Suchen"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirme"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Mehr"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Neu laden"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Update"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aktualisieren"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"Für das Update vorgemerkt"}},available:{t:0,b:{t:2,i:[{t:3,v:"Update "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Kein ESPHome-Profil mit diesem Gerätenamen gefunden."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Was ist neu"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Ganzes Protokoll"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"Gib einmal die IP-Adresse ein; neue Firmware meldet sie selbst."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"IP-Adresse, z. B. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"IP-Adresse"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Starten"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Installiert, aber noch nicht in Home Assistant. Füge das entdeckte ESPHome-Gerät unter Einstellungen → Geräte & Dienste hinzu, gib dort den API-Schlüssel ein und aktiviere unter „Konfigurieren“ die Option „Dem Gerät erlauben, Home Assistant-Aktionen auszuführen“."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware heruntergeladen, noch nicht in Home Assistant. Spiele sie mit ESPHome Web auf den Bildschirm, füge dann das entdeckte ESPHome-Gerät unter Einstellungen → Geräte & Dienste hinzu, gib dort den API-Schlüssel ein und erlaube unter „Konfigurieren“ die Home Assistant-Aktionen."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Noch nicht in Home Assistant. Schon geflasht? Füge das ESPHome-Gerät unter Einstellungen → Geräte & Dienste hinzu und erlaube dann unter „Konfigurieren“ die Home Assistant-Aktionen. Noch nicht geflasht? Firmware & USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"API-Schlüssel kopieren"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirme"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Aktionen"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Zu diesem Bildschirm hinzufügen"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Spickzettel und eine Testmeldung"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Updates, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nichts zu speichern"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Diesen Bildschirm identifizieren"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Lässt die Hintergrundbeleuchtung blinken und zeigt eine Karte"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Braucht eine neuere Firmware"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Layout exportieren"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Als JSON herunterladen und kopieren"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirme, Entitäten, Aktionen suchen…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Nichts gefunden. Gib einen Teil eines Bildschirm-, Entitäts- oder Aktionsnamens ein."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wähle einen Bildschirm"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Wähle links einen deiner Bildschirme, um seine Kacheln, Kopfleiste und Einstellungen zu ändern."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Starte mit einem Bildschirm"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Schließe ein CYD oder Guition per USB an deinen Home Assistant-Rechner an. Profil, Firmware und das erste Flashen laufen in einem Rutsch."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Neuen Bildschirm installieren"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Du hast nicht gespeicherte Änderungen. Trotzdem einen anderen Bildschirm öffnen?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Das nicht gespeicherte Layout durch eine Kopie vom anderen Bildschirm ersetzen?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Das nicht gespeicherte Layout durch das importierte ersetzen?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Dein Bildschirm wird aktualisiert."}},other:{t:0,b:{t:2,i:[{t:3,v:"Gespeichert. "},{t:4,k:"name"},{t:3,v:" wird aktualisiert."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Der Bildschirm wird aktualisiert."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Deine neueste Änderung ist noch nicht gesendet: Drücke noch einmal auf „Speichern & senden“."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" blinkt und zeigt ein paar Sekunden lang eine Karte."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · Änderungen werden gespeichert"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Layout"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirmeinstellungen"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert · gesendet"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Alles gespeichert"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Mehr"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifizieren"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm blinken lassen"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Braucht Firmware 0.2.31 oder neuer"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"aus Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Layout kopieren von…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Bildschirm"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Bildschirme"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"kein anderer Bildschirm"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Kachel"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Kacheln"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Layout exportieren"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Layout importieren…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML-Anpassung"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"erweitert"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Kein ESPHome-Profil für diesen Bildschirm gefunden"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Firmware aktualisieren"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" entfernt"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Auf Seite "},{t:4,k:"page"},{t:3,v:" ist kein Platz für diese Kachel."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Keine Seite ist frei für eine ganzseitige Kachel. Mach zuerst eine Seite frei."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Dieser Bildschirm hat schon eine Kachel, die zu Seite "},{t:4,k:"page"},{t:3,v:" führt."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Layout von "},{t:4,k:"name"},{t:3,v:" kopiert. Drücke „Speichern & senden“, wenn alles passt."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Layout von "},{t:4,k:"name"},{t:3,v:" kopiert: "},{t:4,k:"kept"},{t:3,v:" von "},{t:4,k:"total"},{t:3,v:" Kacheln passen zur Firmware dieses Bildschirms. Drücke „Speichern & senden“, wenn alles passt."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Layout importiert. Drücke „Speichern & senden“, wenn alles passt."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Layout importiert: "},{t:4,k:"kept"},{t:3,v:" von "},{t:4,k:"total"},{t:3,v:" Kacheln passen zur Firmware dieses Bildschirms. Drücke „Speichern & senden“, wenn alles passt."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Das ist kein JSON. Exportiere zuerst ein Layout oder füge eines aus einer anderen ESP Screens-Installation ein."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Keine Kacheln in dieser Datei. Erwartet wird ein aus ESP Screens exportiertes Layout."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Seite · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" Kacheln"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Seiten · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" Kacheln"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Füge aus der Bibliothek deine erste Leuchte, Szene oder dein erstes Gerät hinzu."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Tippe auf die Kopfleiste oder eine Kachel, um sie zu ändern. Ziehen verschiebt; Ablegen auf der nächsten Seite legt eine neue an."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Freie Plätze und feste Positionen funktionieren ab Firmware 0.2.26. Bis zu diesem Update rückt dieser Bildschirm (Firmware "},{t:4,k:"firmware"},{t:3,v:") die Kacheln auf den ersten freien Platz vor."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm-Layout"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Seite hinzufügen"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Höchstens 1 Seite"},{t:2,i:[{t:3,v:"Höchstens "},{t:4,k:"n"},{t:3,v:" Seiten"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Seite "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Seite entfernen"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Die folgenden Seiten rücken um eine Stelle nach vorn"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Kopfleiste bearbeiten"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Freier Platz. Klicke, um hier eine Kachel hinzuzufügen, oder ziehe eine hierher."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Freier Platz "},{t:4,k:"slot"},{t:3,v:" auf Seite "},{t:4,k:"page"},{t:3,v:": nächste Kachel hier hinzufügen"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Nächste Kachel kommt hierhin"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Leer"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bibliothek"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Entität"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Entitäten"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Nach Name, Gerät oder Bereich suchen…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Entität hinzufügen"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Alle"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Leuchten"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klima"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Schalter"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aktionen"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Skripte"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatoren"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Abdeckungen"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Szenen"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Staubsauger"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensoren"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Medien"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Wetter"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Werte"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Auswahl"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personen"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Bereich"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Alle Bereiche"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Platzierte ausblenden"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Ausblenden, was schon auf diesem Bildschirm ist"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Alles hier ist schon auf diesem Bildschirm."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Keine Entitäten gefunden. Versuche einen anderen Namen, Bereich oder Filter."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Dieser Bildschirm fasst 1 Kachel."},{t:2,i:[{t:3,v:"Dieser Bildschirm fasst "},{t:4,k:"n"},{t:3,v:" Kacheln."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Dieser Bildschirm fasst 1 Kachel; mit einem Firmware-Update sind es 48."},{t:2,i:[{t:3,v:"Dieser Bildschirm fasst "},{t:4,k:"n"},{t:3,v:" Kacheln; mit einem Firmware-Update sind es 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Ziehe eine Entität auf eine Seite oder tippe auf +, um sie auf den ersten freien Platz zu setzen. ⌘K durchsucht alles."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Leuchte"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klima"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Staubsauger"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilator"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Abdeckung"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Medien"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Schalter"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Schalter"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Szene"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Skript"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Wetter"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Wert"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Wert"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Auswahl"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Auswahl"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aktion"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Aktion"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sonne"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Person"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Kamera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Bild"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entität"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"Standard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"großer Wert"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Wettervorhersage"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Diagramm"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Digitaluhr"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Analoguhr"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Sonnenbahn"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Livebild"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Albumcover"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"doppelt"}},full:{t:0,b:{t:2,i:[{t:3}],s:"ganze Seite"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Name auf dem Bildschirm"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (aus Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (Standard)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ein gewähltes Symbol zeigt der Bildschirm ab Firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Führt zu Seite"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (leer)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Navigationskacheln brauchen Firmware 0.2.62: Drücke zuerst beim Bildschirm auf „Aktualisieren“."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Dieser Bildschirm hat keine Seite "},{t:4,k:"page"},{t:3,v:", daher öffnet ein Tippen seine letzte Seite. Wähle eine andere Seite."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Ein Tippen auf die Kachel öffnet diese Seite."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Anzeige"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Digitaluhr"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Analoguhr"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Name und Status"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Großer Wert"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Wettervorhersage"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Diagramm"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Sonnenbahn"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Livebild"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Ein kleines Bild der Kamera anstelle des Symbols, im Takt unten aufgefrischt, solange die Seite zu sehen ist. Ein Tipp öffnet sie weiterhin bildschirmfüllend."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ein Livebild braucht Firmware 0.2.77 oder neuer: Nach dem Speichern beim Bildschirm auf Aktualisieren drücken."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Albumcover"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"Das Albumcover des laufenden Titels anstelle des Symbols, wie auf der eigenen Kachel von Home Assistant; ein Player ohne Bild behält sein Symbol. Ein Tipp öffnet weiterhin die Karte."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Das Albumcover auf der Kachel braucht Firmware 0.2.78 oder neuer: Nach dem Speichern beim Bildschirm auf Aktualisieren drücken."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant hat für diese Entität keine Zahlen, daher bleibt das Diagramm leer. Wähle eine andere Anzeige."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Dieser Wetterdienst hat in Home Assistant keine Tagesvorhersage. Wähle eine andere Anzeige."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Auffrischen"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Alle "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Größe"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Doppelt breit"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Ganze Seite"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Ganze Seite: eine große Taste in der eigenen Farbe der Kachel; am unteren Rand sitzen ein Schieberegler, Bedienelemente oder ein Diagramm."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Eine ganzseitige Kachel braucht Firmware 0.2.62: Drücke zuerst beim Bildschirm auf „Aktualisieren“."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Seite"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Neue Seite"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Direkte Steuerung auf der Kachel"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant bietet diese Steuerung für diese Entität nicht an, daher bleibt sie auf dem Bildschirm leer. Wähle eine andere."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Am unteren Rand der ganzseitigen Kachel; ein Tippen woanders wirkt wie unten eingestellt."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"Rechts auf der doppelt breiten Kachel, wie die Zeilen in Home Assistant. Ein Tippen auf den Namen wirkt wie unten eingestellt."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Der Bildschirm zeigt die direkte Steuerung ab Firmware 0.2.19; bis dahin bleibt die Kachel, wie sie war."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Beim Tippen"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Steuerung öffnen"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nur anzeigen"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Ein / Aus"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Aktion ausführen"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant kann dies nicht ein- und ausschalten, daher bewirkt ein Tippen nichts. Wähle eine andere Option."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ab Firmware 0.2.58 schaltet der Bildschirm das ein und aus: Drücke beim Bildschirm auf „Aktualisieren“. Bis dahin öffnet ein Tippen die Karte."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Halte die Kachel gedrückt, um ihre Karte zu öffnen."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Kleiner Schieberegler auf der Kachel"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Nein"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Ja, direkt steuern"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant hat für diese Entität nichts, was ein Schieberegler ändern kann. Wähle „Nein“."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Verlauf"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" Stunde"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" Stunden"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pastellhintergrund"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Hintergrund: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", Platz "},{t:4,k:"slot"},{t:3,v:" auf Seite "},{t:4,k:"page"},{t:3,v:". Enter: einstellen, Pfeiltasten: verschieben"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Kachel entfernen"}},remove_named:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" entfernen"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Aktion"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Frage Home Assistant, welche Aktionen diese Entität hat…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant antwortet gerade nicht. Versuche es gleich noch einmal."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Wähle eine Aktion"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Suchen, z. B. umschalten, Position oder wiedergeben"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Aktion suchen"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Keine Aktion gefunden."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant bietet diese Aktion für diese Entität nicht mehr an, daher bewirkt ein Tippen nichts. Wähle eine andere."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (optional)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Nicht gesetzt"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant braucht "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Der Bildschirm führt Aktionen ab Firmware 0.2.58 aus: Drücke beim Bildschirm auf „Aktualisieren“. Bis dahin wirkt ein Tippen wie „Automatisch“."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Symbol"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Kein Symbol"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Suchen, z. B. Lampe, Musik oder Tür"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Symbol suchen"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Kein Symbol, nur Text"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Symbol: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Kein Symbol gefunden."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Aktuelle Daten"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Verbindung, Status und unterstützte Eigenschaften"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Wird abgerufen…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Aktueller HA-Status wird abgerufen…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Status: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Kleiner Schieberegler: "},{t:4,k:"slider"},{t:3,v:" · Anzeige: "},{t:4,k:"display"},{t:3,v:" · Größe: "},{t:4,k:"size"},{t:3,v:" · Steuerung: "},{t:4,k:"control"},{t:3,v:" · Hintergrund: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"ja"}},no:{t:0,b:{t:2,i:[{t:3}],s:"nein"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"keine"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Standard"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Erneut abrufen"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" aus der Kopfleiste entfernt"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In der Kopfleiste ist Platz für 1 Element."},{t:2,i:[{t:3,v:"In der Kopfleiste ist Platz für "},{t:4,k:"n"},{t:3,v:" Elemente."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"Das ist schon in der Kopfleiste."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Kopfleiste"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Kopfleiste: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Vom Bildschirm selbst, funktioniert auch ohne Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" von "},{t:4,k:"n"},{t:3,v:" Element"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" von "},{t:4,k:"n"},{t:3,v:" Elementen"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Links: Name"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Zum Beispiel: Wohnzimmer"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Rechts: Uhrzeit, Sensoren oder eine Uhr"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", Platz "},{t:4,k:"slot"},{t:3,v:". Enter: einstellen, Pfeile: verschieben"}]}},remove_named:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" aus der Kopfleiste entfernen"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Höchstens 1 Element"},{t:2,i:[{t:3,v:"Höchstens "},{t:4,k:"n"},{t:3,v:" Elemente"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Uhrzeit, Datum, Analoguhr oder eine Entität hinzufügen"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Uhrzeit, Datum oder Entität hinzufügen"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Nicht alles passt neben den Namen: Der Bildschirm lässt die gestrichelten Elemente weg. Entferne eines oder wähle einen kürzeren Namen."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Zum Umsortieren ziehen; zum Einstellen auf ein Element tippen."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensoren, Datum und Analoguhr erscheinen ab Firmware "},{t:4,k:"version"},{t:3,v:"; bis zu diesem Update zeigt dieser Bildschirm den Namen und, falls die Uhrzeit in der Leiste ist, die Uhr."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Ausgeblendet: gerade nicht aktiv"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Passt nicht neben den Namen"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Zifferblatt"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Gerade ausgeblendet: nicht aktiv"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Passt gerade nicht neben den Namen"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"So sieht es auf dem Bildschirm aus"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Kleines Zifferblatt mit der Uhrzeit"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Inhalt"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"„Zuletzt geändert“ zählt auf dem Bildschirm selbst weiter: „Gerade eben“, „Vor 5 Min.“, „Gestern“."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (wie Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Anzeigen"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"„Nur wenn aktiv“ blendet das Element aus, solange es aus, geschlossen, abwesend oder 0 ist. Praktisch für eine offene Tür, eine laufende Waschmaschine oder wer zu Hause ist."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"24-Stunden-Uhr · ändern unter "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"12-Stunden-Uhr · ändern unter "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Einstellungen → Sprache & Region"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Heute: "},{t:4,k:"date"},{t:3,v:". Das Datum folgt der eigenen Uhr des Bildschirms."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Nach oben"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Nach unten"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Zur Kopfleiste hinzufügen"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" von "},{t:4,k:"n"},{t:3,v:" Platz belegt"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" von "},{t:4,k:"n"},{t:3,v:" Plätzen belegt"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Vom Bildschirm selbst"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Schon hinzugefügt"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Vorschläge aus Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Eine Entität"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Nach Name, Bereich oder Entität suchen, z. B. Temperatur oder Tür"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Entität für die Kopfleiste suchen"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Keine Entitäten gefunden."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helligkeit"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Nacht"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helligkeit"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Dunkler Modus"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Auto-Standby"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Standby nach"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helligkeit Standby"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Nachtmodus"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Beginnt"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Endet"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helligkeit nachts"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Zurück zu Seite 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Nach"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Auch im Standby"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Zwischen Seiten wischen"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Seitentasten"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Drehung"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" Sek."}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" Min."}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" Std."}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" Std. "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Die Einstellungen des anderen Bildschirms werden noch gespeichert. Versuche es gleich noch einmal."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Seitentasten und Wischen sind aus, daher wechseln nur Navigationskacheln die Seite."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Seite "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"den Seiten "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskachel zu "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskacheln zu "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskachel zu "},{t:4,k:"targets"},{t:3,v:", aber keine zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]},{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskacheln zu "},{t:4,k:"targets"},{t:3,v:", aber keine zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskachel zu "},{t:4,k:"targets"},{t:3,v:", aber keine zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]},{t:2,i:[{t:3,v:"Du hast "},{t:4,k:"n"},{t:3,v:" Navigationskacheln zu "},{t:4,k:"targets"},{t:3,v:", aber keine zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Du hast keine Navigationskacheln."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Du hast keine Navigationskacheln zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Du hast keine Navigationskacheln zu "},{t:4,k:"missing"},{t:3,v:", daher erreichst du sie nicht."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Die Kacheln zu "},{t:4,k:"pages"},{t:3,v:" liegen nur auf Seiten, die du nicht erreichst."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Von "},{t:4,k:"pages"},{t:3,v:" führt keine Kachel zurück zu Seite 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Dieser Bildschirm ist offline. Seine Einstellungen lassen sich ändern, sobald er wieder da ist."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Änderungen gelten sofort auf dem Bildschirm und erscheinen hier, wenn sie dort geändert werden."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Änderungen gelten sofort. Ab Firmware 0.2.49 speichert der Bildschirm sie selbst."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Diese Entität ist in Home Assistant deaktiviert, oder der Bildschirm startet neu."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verringern"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" erhöhen"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Update wird gestartet…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Firmware wird erstellt…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Firmware wird per Wi-Fi übertragen…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Wird erstellt und installiert…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Warte, bis der Bildschirm wieder da ist…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Prüfe, ob er stabil bleibt…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Neue Sprache: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Die Bildschirme aktualisieren sich jetzt nachts automatisch."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Automatische Updates sind aus."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Firmware-Updates"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Aktualisiere auf Firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Noch kein Bildschirm gekoppelt. Neue Bildschirme bekommen Firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" ist für "},{t:4,k:"n"},{t:3,v:" Bildschirm verfügbar."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" ist für "},{t:4,k:"n"},{t:3,v:" Bildschirme verfügbar."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Alle Bildschirme haben Firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 Bildschirm aktualisieren"},{t:2,i:[{t:3,v:"Alle "},{t:4,k:"n"},{t:3,v:" Bildschirme aktualisieren"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Neu in Firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Jede Nacht automatisch aktualisieren"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Zwischen 03:00 und 06:00 Uhr, ein Bildschirm nach dem anderen. Stoppt bei einem Fehler und meldet ihn in Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Skill installiert. Claude Code nutzt ihn sofort."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Skill installiert. Starte Claude Code einmal neu, damit es den neuen Skills-Ordner findet."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Bring Claude ESP Screens bei und frag dann: „Zeig eine Meldung auf allen meinen Bildschirmen, wenn der Briefkasten voll ist.“ Claude kennt die Meldungs-Ereignisse und jedes Feld, jede Farbe und jedes Symbol."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Für Claude Code installieren"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Erneut installieren"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Skill aktualisieren"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Nicht installiert"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Installiert"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Installiert · eine neuere Version ist bereit"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Für Claude Code in Home Assistant. Schreibt eine Datei nach "},{t:4,k:"path"},{t:3,v:"; erneutes Installieren ersetzt sie."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Für claude.ai herunterladen"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Lade die ZIP-Datei in Claude unter Anpassen → Skills hoch."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Alles rund um deine Bildschirme."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Meine Bildschirme"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirme"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Füge einen Bildschirm hinzu oder erstelle und installiere die Firmware eines vorhandenen neu."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Per USB oder Wi-Fi erstellen und installieren"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Sprache & Region"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirmsprache"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Sprache von Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Sprache von Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Die Bildschirme zeigen Englisch, bis die Sprache von Home Assistant verfügbar ist."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · noch nicht geprüft, Hilfe willkommen"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" ist noch nicht geprüft, Hilfe ist willkommen: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"Anleitung zum Übersetzen"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Nach einer Änderung braucht jeder Bildschirm ein eigenes Firmware-Update: über seine Schaltfläche „Aktualisieren“ oder mit den nächtlichen Updates."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Uhrzeitformat"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatisch, folgt der Sprache ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 Stunden"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 Stunden"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Zahlenformat"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatisch, folgt der Sprache ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Dein Home Assistant-Profil: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Diese verwenden"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"Der Editor selbst folgt der Sprache deines Home Assistant-Profils."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Jeder Bildschirm übernimmt die neue Sprache mit seinem nächsten Update."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Eine Karte über den ganzen Bildschirm, ausgelöst von einer Automation, auf einem Bildschirm oder auf allen. Der Spickzettel enthält die Aktionsnamen, Felder, Symbole und Farben und ein Formular zum Ausprobieren."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Vollbild-Benachrichtigungen aus einer Automation"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm-Firmware erstellen und installieren"}},intro:{t:0,b:{t:2,i:[{t:3,v:"Die eingebaute ESPHome CLI nutzt dein eigenes Profil (YAML mit Schlüsseln) und deine Secrets. Wähle das Profil des Bildschirms, dann einen USB-Port (Bildschirm am Home Assistant-Rechner angeschlossen), "},{t:4,k:"ota"},{t:3,v:" mit dem Hostnamen oder "},{t:4,k:"download"},{t:3,v:", um die Firmware von deinem eigenen Computer aus auf den Bildschirm zu spielen. "},{t:4,k:"check"},{t:3,v:" validiert nur, "},{t:4,k:"build"},{t:3,v:" kompiliert, "},{t:4,k:"install"},{t:3,v:" spielt die Firmware auf den Bildschirm. Deine Kacheln bleiben in ESP Screens, wie sie sind. Das erste Erstellen dauert ein paar Minuten."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Prüfen"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Nur erstellen"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Erstellen & installieren"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Erstellen & herunterladen"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Die ESPHome CLI fehlt. Aktualisiere die App auf 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Wähle das gewünschte Profil, dann einen USB-Port, eine IP-Adresse oder „Download“."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome-Profil"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Installieren auf"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · noch kein Board am Home Assistant-Rechner gefunden"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Download · von deinem eigenen Computer flashen"}},host:{t:0,b:{t:2,i:[{t:3}],s:"IP-Adresse oder Hostname"}},download_file:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" herunterladen"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Spiele sie mit "},{t:4,k:"esphome_web"},{t:3,v:" in Chrome oder Edge auf den Bildschirm: „Connect“ klicken, den USB-Port des Bildschirms wählen, „Install“ klicken und diese Datei auswählen. Sie enthält dein Wi-Fi-Passwort und die Schlüssel des Bildschirms: Behalte sie für dich."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Verbinden und installieren."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profil gespeichert."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Einen Moment…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Bereit zum Herunterladen."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Fertig."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Das hat nicht geklappt."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens legt das eigene Profil des Bildschirms mit eindeutigen Schlüsseln an und erstellt die Firmware. Schließe den Bildschirm mit einem USB-Datenkabel an den Rechner an, auf dem Home Assistant läuft, oder lade die Firmware herunter und spiele sie von deinem eigenen Computer aus auf den Bildschirm."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Welchen Bildschirm hast du?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 Zoll"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 Zoll"}},board_elecrow:{t:0,b:{t:2,i:[{t:3}],s:"Elecrow CrowPanel · 7 Zoll"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Name"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm Wohnzimmer"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Gerätename"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"anpassen"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Jeder Bildschirm bekommt ein eigenes Profil mit eigenen Schlüsseln. Vier Bildschirme? Dann das Ganze viermal, mit je einem anderen Namen."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Kleinbuchstaben, Ziffern und Bindestriche. Für jeden Bildschirm ein anderer Name."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi-Name (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi-Passwort"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Einmal ausfüllen: ESP Screens speichert das in der secrets.yaml von ESPHome, weitere Bildschirme nutzen es automatisch."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"In deiner secrets.yaml von ESPHome fehlen noch Wi-Fi-Angaben. ESP Screens ergänzt nur die fehlenden Zeilen."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Die Wi-Fi-Daten kommen aus deiner secrets.yaml von ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Die secrets.yaml im ESPHome-Ordner ist kein gültiges YAML. Korrigiere zuerst die Datei; sie wird nicht überschrieben."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Installieren über"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Später · nur Profil speichern"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Schließe den Bildschirm mit einem USB-Datenkabel an den Home Assistant-Rechner an; die Liste aktualisiert sich von selbst. Oder wähle „Download“, um deinen eigenen Computer zu nutzen."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Lade die Firmware herunter und spiele sie in Chrome oder Edge von deinem eigenen Computer aus auf den Bildschirm. Danach laufen Updates über Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Das Profil kommt in den ESPHome-Ordner. Installieren kannst du später über Firmware & USB oder im ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Mehr als ein Board angeschlossen: Wähle den Port dieses Bildschirms."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Einmal per USB; danach läuft alles drahtlos."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installieren"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Profil speichern"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Es wird schon eine Firmware erstellt oder installiert ("},{t:4,k:"file"},{t:3,v:"). Warte, bis das fertig ist."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"In dieser Installation fehlt die ESPHome CLI; nur das Speichern des Profils ist möglich."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" liegt im ESPHome-Ordner"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Firmware wird auf "},{t:4,k:"name"},{t:3,v:" geschrieben…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Firmware wird erstellt…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Firmware für "},{t:4,k:"name"},{t:3,v:" ist fertig"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Firmware ist auf "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Erstellen fehlgeschlagen"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Installation fehlgeschlagen"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Installiere es später über Firmware & USB: Wähle dieses Profil, dann den USB-Port des Home Assistant-Rechners oder „Download“, um die Firmware von deinem eigenen Computer aus auf den Bildschirm zu spielen. Speichere den API-Schlüssel für die Kopplung:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Zieh das USB-Kabel noch nicht ab."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Das erste Erstellen dauert auf einem Raspberry Pi ein paar Minuten. Du kannst diese Seite verlassen: Die Installation läuft weiter, und du findest sie unter „Neuer Bildschirm“ wieder."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Das erste Erstellen dauert auf einem Raspberry Pi ein paar Minuten. Du kannst diese Seite verlassen: Die Firmware wird weiter erstellt, und du findest sie unter „Neuer Bildschirm“ wieder."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Spiele sie von deinem eigenen Computer aus auf den Bildschirm und kopple den Bildschirm dann mit Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"Der Bildschirm startet und verbindet sich mit deinem Wi-Fi. Kopple ihn jetzt mit Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"Der Bildschirm startet und verbindet sich mit deinem Wi-Fi. Das CYD fragt zuerst nach einer Touch-Kalibrierung: Tippe auf die Kreuze. Kopple ihn jetzt mit Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Siehe das Protokoll unten."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" – mit einem USB-Datenkabel."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Schließe den Bildschirm an deinen Computer an"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" in Chrome oder Edge, klicke auf „Connect“ und wähle den USB-Port des Bildschirms."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Öffne "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" und wähle "},{t:4,k:"file"},{t:3,v:". Der Bildschirm startet neu und verbindet sich mit deinem Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" und wähle "},{t:4,k:"file"},{t:3,v:". Der Bildschirm startet neu und verbindet sich mit deinem Wi-Fi. Das CYD fragt zuerst nach einer Touch-Kalibrierung: Tippe auf die Kreuze."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Klicke auf „Install“"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Die Datei enthält dein Wi-Fi-Passwort und die Schlüssel des Bildschirms: Behalte sie für dich."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"API-Schlüssel"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Das passiert außerhalb von ESP Screens. Home Assistant entdeckt "},{t:4,k:"name"},{t:3,v:" als ESPHome-Gerät; klicke auf „Hinzufügen“. Nicht entdeckt? Füge ESPHome manuell mit der IP-Adresse des Bildschirms hinzu."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Öffne in Home Assistant Einstellungen → Geräte & Dienste."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:", wenn Home Assistant nach einem Verschlüsselungscode fragt."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Füge den API-Schlüssel von oben ein"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ESPHome-Integration → Konfigurieren → „Dem Gerät erlauben, Home Assistant-Aktionen auszuführen“. Ohne das sieht der Bildschirm alles, steuert aber nichts."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"HA-Aktionen erlauben:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Zurück in ESP Screens erscheint der Bildschirm innerhalb von etwa dreißig Sekunden links in der Liste; bis dahin steht er dort als „noch nicht in Home Assistant“."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wähle deine Kacheln."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome-Protokoll"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Erneut versuchen"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Weiteren Bildschirm installieren"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Neu beginnen"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Fertig"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Meldungen · Spickzettel"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Eine Vollbild-Benachrichtigung aus einer Automation."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Jeder Bildschirm hat die Aktion "},{t:4,k:"action"},{t:3,v:". Sie legt eine Karte über alles, weckt den Bildschirm und hält die Hintergrundbeleuchtung auf normaler Helligkeit, bis jemand auf die Taste tippt oder das Timeout abläuft. Home Assistant selbst zeigt für ESPHome-Aktionen keine Erklärungen oder Auswahllisten; alles, was du ausfüllen kannst, steht hier."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Der Spickzettel wird noch geladen; einen Moment."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Jemand ist an der Tür"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Tür 3, hinten"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Komme"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Abschnitte"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Ausprobieren"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Deine Bildschirme"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"In einer Automation"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Alle Bildschirme"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Die Felder"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Symbole"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Farben"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Verhalten"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Ereignisse"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Tipps"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Sende jetzt eine Meldung mit denselben Feldern, die auch eine Automation sendet. Der Bildschirm zeigt die Karte und lässt bei eingeschaltetem Blinken seine Hintergrundbeleuchtung blinken."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Bildschirm"}},all:{t:0,b:{t:2,i:[{t:3,v:"Alle Bildschirme ("},{t:4,k:"ready"},{t:3,v:" bereit)"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · nicht bereit"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Titel"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Untertitel"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Symbol"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Farbe"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Tastentext"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Timeout (Sekunden, 0 wartet auf die Taste)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Hintergrundbeleuchtung blinken lassen"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Viermal, wenn die Meldung ankommt."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Wird gesendet…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Meldung senden"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"An "},{t:4,k:"n"},{t:3,v:" Bildschirm gesendet."}]},{t:2,i:[{t:3,v:"An "},{t:4,k:"n"},{t:3,v:" Bildschirme gesendet."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"An "},{t:4,k:"name"},{t:3,v:" gesendet."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"An den Bildschirm gesendet."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 übersprungen (offline oder alte Firmware)."},{t:2,i:[{t:4,k:"n"},{t:3,v:" übersprungen (offline oder alte Firmware)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Leer gelassen: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Kein Bildschirm konnte sie anzeigen: Prüfe, ob ein Bildschirm mit Firmware "},{t:4,k:"version"},{t:3,v:" oder neuer online ist."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Weiß (Standard)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Jeder Bildschirm hat seine eigene Aktion, mit dem Gerätenamen darin. Ab Firmware "},{t:4,k:"version"},{t:3,v:"; aktualisiere einen älteren Bildschirm mit seiner Schaltfläche „Aktualisieren“ unter „Bildschirme“."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Noch kein Bildschirm gekoppelt. Installiere einen über „Neuer Bildschirm“; die Aktion erscheint, sobald Home Assistant den Bildschirm sieht."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● Firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Update nötig · Firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Gerätename unbekannt · Bildschirm aktualisieren"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Meldung anzeigen"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Meldung schließen"}}},howto:{add:{t:0,b:{t:2,i:[{t:3,v:"Klicke auf "},{t:4,k:"add"},{t:3,v:" und suche nach "},{t:4,k:"esphome"},{t:3,v:". Wähle die Aktion deines Bildschirms: Home Assistant nennt sie „Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"“."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aktion hinzufügen"}},device:{t:0,b:{t:2,i:[{t:3}],s:"Gerätename"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant fragt nach allen sieben; lass leer, was du nicht brauchst ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", aus)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fülle die Felder aus."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Lieber YAML? Wähle an der Aktion "},{t:4,k:"edit"},{t:3,v:" und füge das Beispiel unten ein."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Beispiel für"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"einen Bildschirm (noch nicht gekoppelt)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"In YAML bearbeiten"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"YAML kopieren"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Alle Bildschirme auf einmal"}},text:{t:0,b:{t:2,i:[{t:3,v:"Löse das Ereignis "},{t:4,k:"show"},{t:3,v:" mit denselben Feldern aus, und ESP Screens gibt die Meldung an jeden Bildschirm weiter, der online ist, auch an später hinzugefügte. "},{t:4,k:"dismiss"},{t:3,v:" entfernt sie überall. Nimm in einer Automation die Aktion "},{t:4,k:"event"},{t:3,v:" oder füge das Beispiel unter "},{t:4,k:"edit"},{t:3,v:" ein. Lass die Felder weg, die du nicht brauchst. Dafür muss ESP Screens laufen."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Manuelles Ereignis auslösen"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Text ist frei wählbar; das Limit gilt in Bytes, und ein Umlaut oder Buchstabe mit Akzent zählt doppelt. Was nicht passt, bekommt Auslassungspunkte (Titel) oder fällt weg (Untertitel)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Feld"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Typ"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Funktion"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Beispiel"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limit"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"Text"}},int:{t:0,b:{t:2,i:[{t:3}],s:"Zahl"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"ein / aus"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entität"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" Bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"0 bis 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, Firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Trage den Namen in "},{t:4,k:"field"},{t:3,v:" ein, zum Beispiel "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" und der Hex-Codepoint ("},{t:4,k:"hex"},{t:3,v:") gehen auch. Nur diese Symbole sind in der Firmware enthalten; jeder andere Name zeigt das Warndreieck. Tippe auf ein Symbol, um seinen Namen zu kopieren."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Praktisch für Benachrichtigungen"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Symbol suchen"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Nach Name oder Beschreibung suchen…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Außerdem verfügbar: Steuerungs- und Wettersymbole"}},copy:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" kopieren"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Kein Symbol für „"},{t:4,k:"query"},{t:3,v:"“. Unbekannte Namen zeigen das Warndreieck ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Trage den Namen in "},{t:4,k:"field"},{t:3,v:" ein. Das sind die Pastelltöne der Kacheln, mit dunklem Text. Leer oder unbekannt ergibt die weiße Karte. Zum Kopieren tippen."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Eine Meldung weckt einen gedimmten oder dunklen Bildschirm sofort und erscheint über jeder Seite, jeder offenen Lichtkarte und der Standby-Ebene."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Weckt den Bildschirm."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Solange die Karte zu sehen ist, bleibt die Hintergrundbeleuchtung auf normaler Helligkeit. Standby und Nachtzeit warten. Nach dem Drücken der Taste beginnt die normale Standby-Zeit von vorn."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"An bis zur Taste."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" wartet auf die Taste, egal wie lange das dauert. Mit "},{t:4,k:"minute"},{t:3,v:" verschwindet die Karte nach einer Minute, aber die Taste schließt sie früher."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Timeout."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" lässt die Hintergrundbeleuchtung beim Eintreffen der Meldung viermal blinken (etwa eine Sekunde lang) und lässt den Bildschirm danach an."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Blinken."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Eine neue Meldung ersetzt die aktuelle; es gibt keinen Stapel. Die ersetzte Meldung endet mit "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ersetzen."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" entfernt die Karte, zum Beispiel wenn die Tür schon offen ist. Ohne Meldung bewirkt diese Aktion nichts."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aus der Ferne schließen."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" bewirkt nichts; nur die Taste schließt sie. So schließt ein Tippen zum Aufwecken die Meldung nie aus Versehen."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tippen neben die Karte"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Wenn eine Meldung endet, löst sie das Ereignis "},{t:4,k:"event"},{t:3,v:" aus, mit "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (dem Gerätenamen) und der "},{t:4,k:"device_id"},{t:3,v:", die Home Assistant hinzufügt. Zu sehen unter Einstellungen → Werkzeuge → Ereignisse."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Wann"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Warten, bis jemand die Taste drückt"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Nutze eine "},{t:4,k:"bold"},{t:3,v:": Orange für die Tür, Rot für Rauch oder Wasser, Grün für „erledigt“. Der Text bleibt immer dunkel und lesbar."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"Farbe je Art der Benachrichtigung"}},short:{t:0,b:{t:2,i:[{t:3,v:"Halte den Titel "},{t:4,k:"bold"},{t:3,v:"; ein Bildschirm zeigt etwa zwanzig Zeichen in einer Zeile und kürzt einen längeren Titel mit Auslassungspunkten. Details gehören in den Untertitel."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"kurz"}},button:{t:0,b:{t:2,i:[{t:3,v:"Ein "},{t:4,k:"bold"},{t:3,v:" macht aus der Benachrichtigung eine Frage: „Komme“, „Gesehen“, „Ausschalten“. Das Ereignis verrät dann, wer reagiert hat."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"eigener Tastentext"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Eine Meldung, die sich von selbst erledigt (die Tür geht auf, die Wäsche wird herausgenommen), schließt du in derselben Automation mit "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Alle Bildschirme? Löse "},{t:4,k:"event"},{t:3,v:" einmal aus (siehe „Alle Bildschirme auf einmal“). Die Bildschirme arbeiten trotzdem unabhängig, und jeder meldet sich mit seinem eigenen "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Für die Automation lieber "},{t:4,k:"bold"},{t:3,v:"? Installiere den ESP Screens-Skill unter Einstellungen → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"Claude fragen"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Türklingel: die Meldung zeigen und warten, bis jemand die Taste drückt."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Jemand kommt zur Tür."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Erweitert · lokale Anpassung"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML-Anpassung"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML-Anpassung · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Diese kleine Datei gehört dir. Sie wird nach dem gemeinsamen Bildschirm-Paket geladen und bleibt erhalten, wenn ESP Screens aktualisiert wird. Ändere hier hardwarespezifische Details, etwa ein Display-Modell."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Was kann ich gefahrlos ändern?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Display, Touchscreen, Substitutions, Pins und andere Gerätedetails. Name, Wi-Fi, API, OTA und Paket-Links bleiben von ESP Screens verwaltet."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Aktiv"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Bereit zum Einbinden"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"Lokale YAML-Anpassung"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Beispiel verwenden"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Leeren"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 Zeichen"},{t:2,i:[{t:4,k:"n"},{t:3,v:" Zeichen"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 Zeile"},{t:2,i:[{t:4,k:"n"},{t:3,v:" Zeilen"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Speichern & prüfen"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Anpassung speichern"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Für diesen Bildschirm wurde kein ESPHome-Profil gefunden."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Änderungen hier gelten ab dem nächsten Erstellen der Firmware."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Speichere einmal, um diese Datei in das Profil einzubinden."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Wird geprüft und gespeichert…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. Die Anpassung bleibt bei Firmware-Updates erhalten."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML-Anpassung gespeichert."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Gespeichert. ESPHome prüft das vollständige Profil…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome prüft das Profil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome prüft das Profil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Das vollständige Profil ist gültig. Du kannst es gefahrlos erstellen und installieren."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome hat das vollständige Profil abgelehnt. Das ganze Protokoll findest du unter Firmware & USB."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Den aktuellen Text durch das Beispiel ersetzen?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Beispiel geladen. Speichere es, wenn du so weit bist."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Die lokale Anpassung leeren?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Nach dem Speichern ist die Anpassung leer."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Zuhause"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Unbekannt"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Nicht verfügbar"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Heizbetrieb"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Kühlbetrieb"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Heizen/Kühlen"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Entfeuchtung"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Nur Lüftung"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Heizbetrieb"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Kühlbetrieb"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Leerlauf"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Entfeuchtung"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Lüftung"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Vorheizen"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Enteisung"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Wird geöffnet"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Wird geschlossen"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Wiedergabe"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Pausiert"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Leerlauf"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"Standby"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Zuhause"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Abwesend"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Über dem Horizont"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Unter dem Horizont"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Angedockt"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Reinigt"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Pausiert"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Rückkehr zur Ladestation"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Leerlauf"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Sonnig"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Klare Nacht"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Bewölkt"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Teilweise bewölkt"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Regnerisch"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Strömender Regen"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Schneefall"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Schneeregen"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Nebel"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Hagel"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Gewitter"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Gewitter, regnerisch"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Windig"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Außergewöhnlich"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Niedrig"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Wird geladen"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Wird nicht geladen"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Kalt"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Verbunden"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Getrennt"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Heiß"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Licht erkannt"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Kein Licht"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Aufgeschlossen"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Abgeschlossen"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Nass"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Trocken"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"Bewegt sich"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Bewegt sich nicht"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Eingesteckt"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Ausgesteckt"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Zuhause"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Abwesend"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problem"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"In Betrieb"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Außer Betrieb"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Unsicher"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Sicher"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Manipulation erkannt"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Update verfügbar"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Aktuell"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Erkannt"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Frei"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Geöffnet"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Geschlossen"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Aktivieren"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Ausführen"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Drücken"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Niedrig"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Mittel"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Hoch"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Mittig"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Fokus"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffus"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Oben"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Ein"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Aus"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Beides"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Vertikal"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Gerade eben"}},minutes_ago:{t:0,b:{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Min."}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Stunde"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Stunden"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Gestern"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Tag"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Tagen"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Woche"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Wochen"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Monat"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Monaten"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Vor 1 Jahr"},{t:2,i:[{t:3,v:"Vor "},{t:4,k:"n"},{t:3,v:" Jahren"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" Min."}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In 1 Stunde"},{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" Stunden"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Morgen"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In 1 Tag"},{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" Tagen"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"Sonntag"}},{t:0,b:{t:2,i:[{t:3}],s:"Montag"}},{t:0,b:{t:2,i:[{t:3}],s:"Dienstag"}},{t:0,b:{t:2,i:[{t:3}],s:"Mittwoch"}},{t:0,b:{t:2,i:[{t:3}],s:"Donnerstag"}},{t:0,b:{t:2,i:[{t:3}],s:"Freitag"}},{t:0,b:{t:2,i:[{t:3}],s:"Samstag"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"So"}},{t:0,b:{t:2,i:[{t:3}],s:"Mo"}},{t:0,b:{t:2,i:[{t:3}],s:"Di"}},{t:0,b:{t:2,i:[{t:3}],s:"Mi"}},{t:0,b:{t:2,i:[{t:3}],s:"Do"}},{t:0,b:{t:2,i:[{t:3}],s:"Fr"}},{t:0,b:{t:2,i:[{t:3}],s:"Sa"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"So"}},{t:0,b:{t:2,i:[{t:3}],s:"Mo"}},{t:0,b:{t:2,i:[{t:3}],s:"Di"}},{t:0,b:{t:2,i:[{t:3}],s:"Mi"}},{t:0,b:{t:2,i:[{t:3}],s:"Do"}},{t:0,b:{t:2,i:[{t:3}],s:"Fr"}},{t:0,b:{t:2,i:[{t:3}],s:"Sa"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"Januar"}},{t:0,b:{t:2,i:[{t:3}],s:"Februar"}},{t:0,b:{t:2,i:[{t:3}],s:"März"}},{t:0,b:{t:2,i:[{t:3}],s:"April"}},{t:0,b:{t:2,i:[{t:3}],s:"Mai"}},{t:0,b:{t:2,i:[{t:3}],s:"Juni"}},{t:0,b:{t:2,i:[{t:3}],s:"Juli"}},{t:0,b:{t:2,i:[{t:3}],s:"August"}},{t:0,b:{t:2,i:[{t:3}],s:"September"}},{t:0,b:{t:2,i:[{t:3}],s:"Oktober"}},{t:0,b:{t:2,i:[{t:3}],s:"November"}},{t:0,b:{t:2,i:[{t:3}],s:"Dezember"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"Jan."}},{t:0,b:{t:2,i:[{t:3}],s:"Feb."}},{t:0,b:{t:2,i:[{t:3}],s:"März"}},{t:0,b:{t:2,i:[{t:3}],s:"Apr."}},{t:0,b:{t:2,i:[{t:3}],s:"Mai"}},{t:0,b:{t:2,i:[{t:3}],s:"Juni"}},{t:0,b:{t:2,i:[{t:3}],s:"Juli"}},{t:0,b:{t:2,i:[{t:3}],s:"Aug."}},{t:0,b:{t:2,i:[{t:3}],s:"Sept."}},{t:0,b:{t:2,i:[{t:3}],s:"Okt."}},{t:0,b:{t:2,i:[{t:3}],s:"Nov."}},{t:0,b:{t:2,i:[{t:3}],s:"Dez."}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:". "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:". "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:". "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:"."}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"1"}},percent:{t:0,b:{t:2,i:[{t:3}],s:" %"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Seite "},{t:4,k:"n"}]}}}}};export{t as default}; diff --git a/screen_manager/app/static/assets/es-DVs9Eema.js b/screen_manager/app/static/assets/es-CiY4kmZ6.js similarity index 56% rename from screen_manager/app/static/assets/es-DVs9Eema.js rename to screen_manager/app/static/assets/es-CiY4kmZ6.js index 0072965..c2fc666 100644 --- a/screen_manager/app/static/assets/es-DVs9Eema.js +++ b/screen_manager/app/static/assets/es-CiY4kmZ6.js @@ -1 +1 @@ -const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Deshacer"}},online:{t:0,b:{t:2,i:[{t:3}],s:"En línea"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Sin conexión"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"desconocido"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Cambios no guardados"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Cancelar"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Abrir Dispositivos y servicios"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Guardar y enviar"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Guardando…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Leer datos actuales"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 resultado. Sigue escribiendo para acotar."},{t:2,i:[{t:4,k:"n"},{t:3,v:" resultados. Sigue escribiendo para acotar."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Cerrar"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Eliminar"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Cambiar"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Cargando…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Volver"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copiar"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nueva pantalla"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware y USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alertas"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Configuración"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Conectar e instalar"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"No ha funcionado. Recarga la página y vuelve a intentarlo."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Clave API copiada."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"La clave API está seleccionada. Cópiala con Ctrl+C o Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON del diseño copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El JSON del diseño está seleccionado. Cópialo con Ctrl+C o Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nombre de la acción copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El nombre de la acción está seleccionado. Cópialo con Ctrl+C o Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El YAML está seleccionado. Cópialo con Ctrl+C o Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nombre del icono copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El nombre del icono está seleccionado. Cópialo con Ctrl+C o Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Color vacío copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El color vacío está seleccionado. Cópialo con Ctrl+C o Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nombre del color copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El nombre del color está seleccionado. Cópialo con Ctrl+C o Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Página de gestión inaccesible · reintentando…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Conectado a Home Assistant"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Reconectando con Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Buscar"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Pantallas"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Más"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Recargar"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"En cola para actualizar"}},available:{t:0,b:{t:2,i:[{t:3,v:"Actualización a "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ningún perfil de ESPHome con este nombre de dispositivo."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Novedades"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Registro completo"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"La dirección IP, solo esta vez; el firmware nuevo la comunica por sí mismo."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Dirección IP, p. ej. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Dirección IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Iniciar"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Instalada, pero aún no está en Home Assistant. Añade el dispositivo ESPHome descubierto en Configuración → Dispositivos y servicios, pega allí la clave API y activa «Permite que el dispositivo realice acciones de Home Assistant» en Configurar."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware descargado; aún no está en Home Assistant. Instálalo en la pantalla con ESPHome Web y luego añade el dispositivo ESPHome descubierto en Configuración → Dispositivos y servicios, pega allí la clave API y permite las acciones de Home Assistant en Configurar."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Aún no está en Home Assistant. ¿Ya has instalado el firmware? Añade el dispositivo ESPHome en Configuración → Dispositivos y servicios y luego permite las acciones de Home Assistant en Configurar. ¿Todavía no? Firmware y USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copiar clave API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Pantallas"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Acciones"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Añadir a esta pantalla"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Guía rápida y una alerta de prueba"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Actualizaciones, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nada que guardar"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificar esta pantalla"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Hace parpadear la retroiluminación y muestra una tarjeta"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Necesita un firmware más reciente"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exportar diseño"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Descargar y copiar como JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Busca pantallas, entidades, acciones…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"No hay coincidencias. Escribe parte del nombre de una pantalla, entidad o acción."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Elige una pantalla"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Elige una de tus pantallas a la izquierda para cambiar sus mosaicos, su barra superior y su configuración."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Empieza con una pantalla"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Conecta un CYD o un Guition por USB al equipo de Home Assistant. El perfil, el firmware y la primera instalación se hacen de una vez."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Instalar pantalla nueva"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Tienes cambios sin guardar. ¿Abrir otra pantalla de todos modos?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"¿Sustituir el diseño sin guardar por una copia del de la otra pantalla?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"¿Sustituir el diseño sin guardar por el importado?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. Tu pantalla se está actualizando."}},other:{t:0,b:{t:2,i:[{t:3,v:"Guardado. "},{t:4,k:"name"},{t:3,v:" se está actualizando."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. La pantalla se está actualizando."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. Tu último cambio aún no se ha enviado: vuelve a pulsar Guardar y enviar."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" parpadea y muestra una tarjeta durante unos segundos."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Sin conexión · los cambios se guardan"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Diseño"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Configuración de pantalla"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Guardado · enviado a la pantalla"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Todo guardado"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Más"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificar"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"hace parpadear la pantalla"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Necesita el firmware 0.2.31 o posterior"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"de Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copiar diseño de…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" pantalla"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pantallas"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"no hay otra pantalla"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" mosaico"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" mosaicos"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exportar diseño"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importar diseño…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"avanzado"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ningún perfil de ESPHome para esta pantalla"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Se ha eliminado "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"No hay sitio para este mosaico en la página "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"No hay ninguna página libre para un mosaico de página completa. Libera antes una página."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Esta pantalla ya tiene un mosaico que lleva a la página "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Diseño de "},{t:4,k:"name"},{t:3,v:" copiado. Pulsa Guardar y enviar cuando te parezca bien."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Diseño de "},{t:4,k:"name"},{t:3,v:" copiado: "},{t:4,k:"kept"},{t:3,v:" de "},{t:4,k:"total"},{t:3,v:" mosaicos son compatibles con el firmware de esta pantalla. Pulsa Guardar y enviar cuando te parezca bien."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Diseño importado. Pulsa Guardar y enviar cuando te parezca bien."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Diseño importado: "},{t:4,k:"kept"},{t:3,v:" de "},{t:4,k:"total"},{t:3,v:" mosaicos son compatibles con el firmware de esta pantalla. Pulsa Guardar y enviar cuando te parezca bien."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Eso no es JSON. Exporta antes un diseño o pega uno de otro ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Este archivo no tiene mosaicos. Se esperaba un diseño exportado desde ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" página · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" mosaicos"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" páginas · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" mosaicos"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Añade tu primera luz, escena o dispositivo desde la biblioteca."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Toca la barra superior o un mosaico para cambiarlo. Arrastra para mover; suelta en la página siguiente para crear una nueva."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Los huecos vacíos y las posiciones fijas funcionan a partir del firmware 0.2.26. Hasta esa actualización, esta pantalla (firmware "},{t:4,k:"firmware"},{t:3,v:") sube los mosaicos al primer hueco libre."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Diseño de la pantalla"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Añadir página"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Máximo 1 página"},{t:2,i:[{t:3,v:"Máximo "},{t:4,k:"n"},{t:3,v:" páginas"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Página "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Eliminar página"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Las páginas siguientes suben un puesto"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Editar barra superior"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Hueco vacío. Haz clic para añadir aquí un mosaico o arrastra uno hasta aquí."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Hueco vacío "},{t:4,k:"slot"},{t:3,v:" en la página "},{t:4,k:"page"},{t:3,v:": añade aquí el siguiente mosaico"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"El siguiente mosaico va aquí"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Vacío"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Biblioteca"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entidad"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entidades"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca por nombre, dispositivo o habitación…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Añadir una entidad"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Todo"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Luces"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatización"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruptores"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Estado"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Acciones"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventiladores"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Persianas"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Escenas"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspiradora"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensores"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Multimedia"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valores"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selectores"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personas"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Temporizadores"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Habitación"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Todas las habitaciones"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Ocultar añadidas"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Ocultar lo que ya está en esta pantalla"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Todo lo de aquí ya está en esta pantalla."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No se han encontrado entidades. Prueba con otro nombre, habitación o filtro."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En esta pantalla cabe 1 mosaico."},{t:2,i:[{t:3,v:"En esta pantalla caben "},{t:4,k:"n"},{t:3,v:" mosaicos."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En esta pantalla cabe 1 mosaico; actualiza su firmware para tener 48."},{t:2,i:[{t:3,v:"En esta pantalla caben "},{t:4,k:"n"},{t:3,v:" mosaicos; actualiza su firmware para tener 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Arrastra a una página o toca + para añadir al primer hueco libre. ⌘K busca en todo."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Luz"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatización"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspiradora"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilador"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Persiana"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Multimedia"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Estado"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruptor"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Interruptor"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Escena"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valor"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Valor"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selector"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Selector"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Acción"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Acción"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sol"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Temporizador"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Persona"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Cámara"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Imagen"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entidad"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"estándar"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"valor grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"previsión del tiempo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"gráfico"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"reloj digital"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"reloj analógico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"recorrido del sol"}},live:{t:0,b:{t:2,i:[{t:3}],s:"imagen en vivo"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"carátula"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"doble"}},full:{t:0,b:{t:2,i:[{t:3}],s:"página completa"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nombre en la pantalla"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automático (de Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automático (predeterminado)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla muestra el icono elegido a partir del firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Lleva a la página"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (vacía)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Los mosaicos de navegación necesitan el firmware 0.2.62: pulsa antes Actualizar en la lista de pantallas."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Esta pantalla no tiene página "},{t:4,k:"page"},{t:3,v:", así que un toque abre su última página. Elige otra página."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Al tocar el mosaico se abre esa página."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Presentación"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Reloj digital"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Reloj analógico"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nombre y estado"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Valor grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Previsión del tiempo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Gráfico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Recorrido del sol"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Imagen en vivo"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Una imagen pequeña de la cámara en el lugar del icono, actualizada al ritmo de abajo mientras la página está en pantalla. Un toque la sigue abriendo a pantalla completa."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Una imagen en vivo necesita el firmware 0.2.77 o más reciente: pulsa Actualizar en la pantalla después de guardar."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Carátula"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"La carátula de lo que suena en el lugar del icono, como en el propio mosaico de Home Assistant; un reproductor sin imagen conserva su icono. Un toque sigue abriendo la tarjeta."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La carátula en el mosaico necesita el firmware 0.2.78 o más reciente: pulsa Actualizar en la pantalla después de guardar."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no tiene valores numéricos para esta entidad, así que el gráfico queda vacío. Elige otra presentación."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Este servicio meteorológico no tiene previsión diaria en Home Assistant. Elige otra presentación."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Cada "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Tamaño"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Doble ancho"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Página completa"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Página completa: un botón grande en el color del propio mosaico; en la parte inferior va un control deslizante, unos controles o un gráfico."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Un mosaico de página completa necesita el firmware 0.2.62: pulsa antes Actualizar en la lista de pantallas."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Página"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Página nueva"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Control directo en el mosaico"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no ofrece este control para esta entidad, así que en la pantalla queda vacío. Elige otro."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"En la parte inferior del mosaico de página completa; un toque en cualquier otro sitio funciona como se indica más abajo."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"A la derecha del mosaico de doble ancho, como las filas de Home Assistant. Tocar el nombre funciona como se indica más abajo."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla muestra el control directo a partir del firmware 0.2.19; hasta entonces, el mosaico se queda como estaba."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Al tocar"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automático"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Abrir control"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Solo ver"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Encender / apagar"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Realizar una acción"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no puede encender y apagar esto, así que un toque no hace nada. Elige otra opción."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla lo enciende y apaga a partir del firmware 0.2.58: pulsa Actualizar en la lista de pantallas. Hasta entonces, un toque abre su tarjeta."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Mantén pulsado el mosaico para abrir su tarjeta."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Control deslizante pequeño en el mosaico"}},no:{t:0,b:{t:2,i:[{t:3}],s:"No"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Sí, control directo"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no tiene nada que un control deslizante pueda cambiar en esta entidad. Elige No."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Historial"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" hora"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" horas"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Fondo pastel"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Fondo: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", hueco "},{t:4,k:"slot"},{t:3,v:" de la página "},{t:4,k:"page"},{t:3,v:". Enter: configurar; teclas de flecha: mover"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Eliminar mosaico"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Eliminar "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Acción"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Preguntando a Home Assistant qué acciones tiene esta entidad…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no responde ahora mismo. Vuelve a intentarlo en un momento."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Elige una acción"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca, por ejemplo alternar, posición o reproducir"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Buscar una acción"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ninguna acción."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ya no ofrece esta acción para esta entidad, así que un toque no hace nada. Elige otra."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (opcional)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Sin definir"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Activado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desactivado"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant necesita "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla realiza acciones a partir del firmware 0.2.58: pulsa Actualizar en la lista de pantallas. Hasta entonces, un toque funciona como Automático."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icono"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Sin icono"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca, por ejemplo lámpara, música o puerta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Buscar un icono"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Sin icono, solo texto"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icono: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ningún icono."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Datos actuales"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Conexión, estado y propiedades compatibles"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Leyendo…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Obteniendo el estado actual de HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Estado: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Control deslizante pequeño: "},{t:4,k:"slider"},{t:3,v:" · Presentación: "},{t:4,k:"display"},{t:3,v:" · Tamaño: "},{t:4,k:"size"},{t:3,v:" · Control: "},{t:4,k:"control"},{t:3,v:" · Fondo: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"sí"}},no:{t:0,b:{t:2,i:[{t:3}],s:"no"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"ninguno"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Predeterminado"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Volver a leer"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Se ha eliminado "},{t:4,k:"name"},{t:3,v:" de la barra superior"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En la barra superior cabe 1 elemento."},{t:2,i:[{t:3,v:"En la barra superior caben "},{t:4,k:"n"},{t:3,v:" elementos."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"Esto ya está en la barra superior."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Barra superior"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Barra superior: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"De la propia pantalla; también funciona sin Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" elemento"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" elementos"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Izquierda: nombre"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Por ejemplo: Salón"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Derecha: hora, sensores o un reloj"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", hueco "},{t:4,k:"slot"},{t:3,v:". Enter: configurar; flechas: mover"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Eliminar "},{t:4,k:"name"},{t:3,v:" de la barra superior"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Máximo 1 elemento"},{t:2,i:[{t:3,v:"Máximo "},{t:4,k:"n"},{t:3,v:" elementos"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Añade la hora, la fecha, el reloj analógico o una entidad"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Añadir hora, fecha o una entidad"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"No todo cabe junto al nombre: la pantalla omite los elementos con borde discontinuo. Elimina uno o elige un nombre más corto."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Arrastra para reordenar; toca un elemento para configurarlo."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Los sensores, la fecha y el reloj analógico aparecen a partir del firmware "},{t:4,k:"version"},{t:3,v:"; hasta esa actualización, esta pantalla muestra el nombre y, si la hora está en la barra, el reloj."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Oculto: ahora no está activo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"No cabe junto al nombre"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Esfera"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Oculto ahora mismo: no está activo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Ahora mismo no cabe junto al nombre"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Así se ve en la pantalla"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Esfera pequeña con la hora"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Qué mostrar"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Último cambio» sigue contando en la propia pantalla: «Justo ahora», «Hace 5 min», «Ayer»."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automático (como en Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mostrar"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Solo cuando está activo» oculta el elemento mientras está apagado, cerrado, fuera o en 0. Útil para una puerta abierta, una lavadora en marcha o quién está en casa."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Reloj de 24 horas · cámbialo en "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Reloj de 12 horas · cámbialo en "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Configuración → Idioma y región"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Hoy: "},{t:4,k:"date"},{t:3,v:". La fecha sigue el reloj de la propia pantalla."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Subir"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Bajar"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Añadir a la barra superior"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" hueco usado"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" huecos usados"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"De la propia pantalla"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Ya añadido"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Sugerencias de Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Una entidad"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca por nombre, habitación o entidad, p. ej. temperatura o puerta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Buscar una entidad para la barra superior"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No se han encontrado entidades."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brillo"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Noche"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brillo"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Modo oscuro"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Reposo automático"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Reposo tras"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brillo en reposo"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Modo noche"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Empieza"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Termina"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brillo nocturno"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Volver a la página 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Tras"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"También en reposo"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Deslizar entre páginas"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Botones de página"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotación"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" a. m."}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" p. m."}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Aún se está guardando la configuración de la otra pantalla. Vuelve a intentarlo en un momento."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Los botones de página y el deslizamiento están desactivados, así que solo los mosaicos «Ir a la página» cambian de página."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"la página "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"las páginas "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaico «Ir a la página», que lleva a "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir a la página», que llevan a "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaico «Ir a la página», que lleva a "},{t:4,k:"targets"},{t:3,v:", pero ninguno a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ella."}]},{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir a la página», que llevan a "},{t:4,k:"targets"},{t:3,v:", pero ninguno a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ella."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaico «Ir a la página», que lleva a "},{t:4,k:"targets"},{t:3,v:", pero ninguno a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ellas."}]},{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir a la página», que llevan a "},{t:4,k:"targets"},{t:3,v:", pero ninguno a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ellas."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"No tienes mosaicos «Ir a la página»."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"No tienes mosaicos «Ir a la página» que lleven a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ella."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"No tienes mosaicos «Ir a la página» que lleven a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ellas."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Los mosaicos que llevan a "},{t:4,k:"pages"},{t:3,v:" solo están en páginas a las que no puedes llegar."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Desde "},{t:4,k:"pages"},{t:3,v:" ningún mosaico lleva de vuelta a la página 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Esta pantalla está sin conexión. Podrás cambiar su configuración cuando vuelva."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Los cambios se aplican al instante en la pantalla, y aparecen aquí cuando se cambian allí."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Los cambios se aplican al instante. Con el firmware 0.2.49, la pantalla los guarda ella misma."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Esta entidad está desactivada en Home Assistant o la pantalla se está reiniciando."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": menos"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": más"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Iniciando la actualización…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilando el firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Grabando el firmware por Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Compilando e instalando…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Esperando a que vuelva la pantalla…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Comprobando que se mantiene estable…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Idioma nuevo: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Ahora las pantallas se actualizarán automáticamente por la noche."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Las actualizaciones automáticas están desactivadas."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Actualizaciones de firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Actualizando al firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Aún no hay ninguna pantalla emparejada. Las pantallas nuevas reciben el firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"El firmware "},{t:4,k:"version"},{t:3,v:" está disponible para "},{t:4,k:"n"},{t:3,v:" pantalla."}]},{t:2,i:[{t:3,v:"El firmware "},{t:4,k:"version"},{t:3,v:" está disponible para "},{t:4,k:"n"},{t:3,v:" pantallas."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Todas las pantallas tienen el firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Actualizar 1 pantalla"},{t:2,i:[{t:3,v:"Actualizar las "},{t:4,k:"n"},{t:3,v:" pantallas"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Novedades del firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar automáticamente cada noche"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Entre las 03:00 y las 06:00, una pantalla cada vez. Se detiene si hay un error y lo notifica en Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Habilidad instalada. Claude Code la detecta al momento."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Habilidad instalada. Reinicia Claude Code una vez para que encuentre la nueva carpeta de habilidades."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Enseña a Claude a usar ESP Screens y luego pídele: «Muestra una alerta en todas mis pantallas cuando el buzón esté lleno». Claude conoce los eventos de alerta y cada campo, color e icono."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Instalar para Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Volver a instalar"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar la habilidad"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"No instalada"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Instalada"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Instalada · hay una versión más reciente"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Para Claude Code en Home Assistant. Escribe un archivo en "},{t:4,k:"path"},{t:3,v:"; al volver a instalar se sustituye."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descargar para claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Sube el zip en Claude, en Personalizar → Habilidades."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Todo lo que rodea a tus pantallas."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Mis pantallas"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Pantallas"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Añade una pantalla, o compila y reinstala el firmware de una que ya tengas."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar por USB o Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Idioma y región"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Idioma de las pantallas"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Idioma de Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Idioma de Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Las pantallas usan el inglés hasta que el idioma de Home Assistant esté disponible."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · aún sin revisar, se agradece ayuda"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" aún no está revisado; se agradece ayuda: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"cómo traducir"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Tras un cambio, cada pantalla necesita una actualización de firmware, una compilación por pantalla: con su botón Actualizar o en las actualizaciones nocturnas."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Formato de hora"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automático, según el idioma ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 horas"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 horas"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Formato numérico"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automático, según el idioma ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Tu perfil de Home Assistant: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Usar estos"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"El propio editor usa el idioma de tu perfil de Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Guardado."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. Cada pantalla adoptará el nuevo idioma con su próxima actualización."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Una tarjeta a pantalla completa desde una automatización, en una pantalla o en todas. La guía rápida tiene los nombres de las acciones, los campos, los iconos y los colores, y un formulario para probar una alerta."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Notificaciones a pantalla completa, desde una automatización"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar el firmware de las pantallas"}},intro:{t:0,b:{t:2,i:[{t:3,v:"La CLI de ESPHome integrada usa tu propio perfil (YAML con claves) y tus secretos. Elige el perfil de la pantalla y luego un puerto USB (pantalla conectada al equipo de Home Assistant), "},{t:4,k:"ota"},{t:3,v:" con el nombre de host, o "},{t:4,k:"download"},{t:3,v:" para instalar el firmware en la pantalla desde tu propio ordenador. "},{t:4,k:"check"},{t:3,v:" solo valida, "},{t:4,k:"build"},{t:3,v:" compila y "},{t:4,k:"install"},{t:3,v:" instala el firmware en la pantalla. Tus mosaicos se quedan como están en ESP Screens. La primera compilación tarda unos minutos."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descargar"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Comprobar"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Solo compilar"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Compilar y descargar"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Falta la CLI de ESPHome. Actualiza la aplicación a la versión 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Elige el perfil que corresponda y luego un puerto USB, una dirección IP o Descargar."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Perfil de ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Instalar en"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · aún no se ha encontrado ninguna placa en el equipo de Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Descargar · instalar desde tu propio ordenador"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Dirección IP o nombre de host"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Descargar "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Instálalo en la pantalla con "},{t:4,k:"esphome_web"},{t:3,v:" en Chrome o Edge: Connect, elige el puerto USB de la pantalla, Install y selecciona este archivo. Contiene tu contraseña de Wi-Fi y las claves de la pantalla: no lo compartas."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Conectar e instalar."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Perfil guardado."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Un momento…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Listo para descargar."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Hecho."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"No ha funcionado."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens crea el perfil propio de la pantalla con claves únicas y compila el firmware. Conecta la pantalla con un cable USB de datos al equipo donde se ejecuta Home Assistant, o descarga el firmware e instálalo en la pantalla desde tu propio ordenador."}},board:{t:0,b:{t:2,i:[{t:3}],s:"¿Qué pantalla tienes?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 pulgadas"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 pulgadas"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nombre"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla del salón"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nombre del dispositivo"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"personalizar"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cada pantalla tiene su propio perfil con sus propias claves. ¿Cuatro pantallas? Haz esto cuatro veces con un nombre distinto."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Letras minúsculas, números y guiones. Un nombre distinto para cada pantalla."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nombre de la red Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Contraseña de la Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Rellénalo una sola vez: ESP Screens lo guarda en el secrets.yaml de ESPHome y las siguientes pantallas lo usan automáticamente."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"A tu secrets.yaml de ESPHome aún le faltan los datos de la Wi-Fi. ESP Screens solo rellena las líneas que faltan."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"La Wi-Fi se toma de tu secrets.yaml de ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"El secrets.yaml de la carpeta de ESPHome no es un YAML válido. Corrige antes el archivo; no se sobrescribirá."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Instalar mediante"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Más tarde · solo guardar el perfil"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Conecta la pantalla con un cable USB de datos al equipo de Home Assistant; la lista se actualiza sola. O elige Descargar para usar tu propio ordenador."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descarga el firmware e instálalo en la pantalla desde tu propio ordenador, con Chrome o Edge. Después, las actualizaciones van por Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"El perfil se guarda en la carpeta de ESPHome. Puedes instalarlo más tarde desde Firmware y USB o desde ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Hay más de una placa conectada: elige el puerto de esta pantalla."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Una vez por USB; después, todo es inalámbrico."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Instalar"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Guardar perfil"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Ya hay una compilación o instalación en curso ("},{t:4,k:"file"},{t:3,v:"). Espera a que termine."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"A esta instalación le falta la CLI de ESPHome; solo se puede guardar el perfil."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" está en la carpeta de ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Grabando el firmware en "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilando el firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"El firmware para "},{t:4,k:"name"},{t:3,v:" está listo"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"El firmware ya está en "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Error en la compilación"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Error en la instalación"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Instálalo más tarde desde Firmware y USB: elige este perfil y luego el puerto USB del equipo de Home Assistant, o Descargar para instalar el firmware en la pantalla desde tu propio ordenador. Guarda la clave API para el emparejamiento:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"No desconectes todavía el cable USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"La primera compilación tarda unos minutos en una Raspberry Pi. Puedes salir de esta página: la instalación sigue en marcha y la volverás a encontrar en Nueva pantalla."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"La primera compilación tarda unos minutos en una Raspberry Pi. Puedes salir de esta página: la compilación sigue en marcha y la volverás a encontrar en Nueva pantalla."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Instálalo en la pantalla desde tu propio ordenador y luego empareja la pantalla con Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla arranca y se conecta a tu Wi-Fi. Empareja ahora la pantalla con Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla arranca y se conecta a tu Wi-Fi. El CYD pide primero una calibración táctil: toca las cruces. Empareja ahora la pantalla con Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Consulta el registro de abajo."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" con un cable USB de datos."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Conecta la pantalla a tu ordenador"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" en Chrome o Edge, haz clic en Connect y elige el puerto USB de la pantalla."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Abre "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" y selecciona "},{t:4,k:"file"},{t:3,v:". La pantalla se reinicia y se conecta a tu Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" y selecciona "},{t:4,k:"file"},{t:3,v:". La pantalla se reinicia y se conecta a tu Wi-Fi. El CYD pide primero una calibración táctil: toca las cruces."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Haz clic en Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"El archivo contiene tu contraseña de Wi-Fi y las claves de la pantalla: no lo compartas."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Clave API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Esto se hace fuera de ESP Screens. Home Assistant descubre "},{t:4,k:"name"},{t:3,v:" como dispositivo ESPHome; haz clic en Añadir. ¿No aparece? Añade ESPHome manualmente con la dirección IP de la pantalla."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ve a Home Assistant → Configuración → Dispositivos y servicios."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" de arriba cuando Home Assistant pida la clave de cifrado."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Pega la clave API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" integración ESPHome → Configurar → «Permite que el dispositivo realice acciones de Home Assistant». Sin esto, la pantalla lo ve todo pero no controla nada."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Permite las acciones de HA:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" De vuelta en ESP Screens, la pantalla aparece en la lista de la izquierda en unos treinta segundos; hasta entonces se muestra ahí como «aún no está en Home Assistant»."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Elige tus mosaicos."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Registro de ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Reintentar"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Instalar otra pantalla"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Empezar de nuevo"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Hecho"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alertas · guía rápida"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Una notificación a pantalla completa, desde una automatización."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Cada pantalla tiene la acción "},{t:4,k:"action"},{t:3,v:". Coloca una tarjeta por encima de todo, despierta la pantalla y mantiene la retroiluminación al brillo normal hasta que alguien toque el botón o se agote el tiempo de espera. Home Assistant no muestra explicaciones ni desplegables para las acciones de ESPHome; aquí tienes todo lo que puedes rellenar."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"La guía rápida aún se está cargando; un momento."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Hay alguien en la puerta"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Puerta 3, trasera"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Voy"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Secciones"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Pruébalo"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Tus pantallas"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"En una automatización"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Todas las pantallas"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Los campos"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Iconos"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Colores"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Comportamiento"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Eventos"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Consejos"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Envía ahora una alerta, con los mismos campos que envía una automatización. La pantalla muestra la tarjeta y, con el parpadeo activado, hace parpadear la retroiluminación."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla"}},all:{t:0,b:{t:2,i:[{t:3,v:"Todas las pantallas (listas: "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · no está lista"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Título"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Subtítulo"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icono"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Color"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Texto del botón"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Tiempo de espera (segundos; 0 espera al botón)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Hacer parpadear la retroiluminación"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cuatro veces cuando llega la alerta."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Enviando…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Enviar alerta"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Enviada a "},{t:4,k:"n"},{t:3,v:" pantalla."}]},{t:2,i:[{t:3,v:"Enviada a "},{t:4,k:"n"},{t:3,v:" pantallas."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Enviada a "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Enviada a la pantalla."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Se ha omitido 1 pantalla (sin conexión o firmware antiguo)."},{t:2,i:[{t:3,v:"Se han omitido "},{t:4,k:"n"},{t:3,v:" pantallas (sin conexión o firmware antiguo)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Se dejaron vacíos: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Ninguna pantalla ha podido mostrarla: comprueba que haya una pantalla en línea con el firmware "},{t:4,k:"version"},{t:3,v:" o posterior."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Blanco (predeterminado)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Cada pantalla tiene su propia acción, con el nombre del dispositivo en ella. A partir del firmware "},{t:4,k:"version"},{t:3,v:"; actualiza una pantalla más antigua con su botón Actualizar en Pantallas."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Aún no hay ninguna pantalla emparejada. Instala una desde Nueva pantalla; la acción aparece en cuanto Home Assistant ve la pantalla."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Hay que actualizar · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nombre del dispositivo desconocido · actualiza la pantalla"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Mostrar alerta"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Descartar alerta"}}},howto:{add:{t:0,b:{t:2,i:[{t:3,v:"Pulsa "},{t:4,k:"add"},{t:3,v:" y busca "},{t:4,k:"esphome"},{t:3,v:". Elige la acción de tu pantalla: Home Assistant la llama «Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"»."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Añadir acción"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nombre del dispositivo"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant pide los siete; deja vacío lo que no uses ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", desactivado)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Rellena los campos."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"¿Prefieres YAML? Elige "},{t:4,k:"edit"},{t:3,v:" en la acción y pega el ejemplo de abajo."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Ejemplo para"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"una pantalla (aún sin emparejar)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Editar en YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copiar YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Todas las pantallas a la vez"}},text:{t:0,b:{t:2,i:[{t:3,v:"Dispara el evento "},{t:4,k:"show"},{t:3,v:" con los mismos campos y ESP Screens pasa la alerta a todas las pantallas en línea, incluidas las que añadas más tarde. "},{t:4,k:"dismiss"},{t:3,v:" la quita en todas. En una automatización, añade la acción "},{t:4,k:"event"},{t:3,v:" o pega el ejemplo en "},{t:4,k:"edit"},{t:3,v:". Omite los campos que no uses. Para esto, ESP Screens tiene que estar en marcha."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Disparar evento manual"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"El texto es libre; el límite es en bytes, y una letra acentuada cuenta como dos. Lo que no cabe acaba en puntos suspensivos (título) o se descarta (subtítulo)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Campo"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Tipo"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Qué hace"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Ejemplo"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Límite"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"texto"}},int:{t:0,b:{t:2,i:[{t:3}],s:"número"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"activado / desactivado"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entidad"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"de 0 a 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Escribe el nombre en "},{t:4,k:"field"},{t:3,v:", por ejemplo "},{t:4,k:"example"},{t:3,v:". También funcionan "},{t:4,k:"mdi"},{t:3,v:" y el código hexadecimal ("},{t:4,k:"hex"},{t:3,v:"). El firmware solo incluye estos iconos; cualquier otro nombre muestra el triángulo de advertencia. Toca un icono para copiar su nombre."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Útiles para notificaciones"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Buscar un icono"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca por nombre o descripción…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"También disponibles: iconos de control y del tiempo"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copiar "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"No hay ningún icono para «"},{t:4,k:"query"},{t:3,v:"». Los nombres desconocidos muestran el triángulo de advertencia ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Escribe el nombre en "},{t:4,k:"field"},{t:3,v:". Son los tonos pastel de los mosaicos, con texto oscuro. Vacío o desconocido da la tarjeta blanca. Toca para copiar."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Una alerta despierta al instante una pantalla atenuada u oscura y aparece por encima de cualquier página, de cualquier tarjeta de luz abierta y de la capa de reposo."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Despierta la pantalla."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Mientras se muestra la tarjeta, la retroiluminación se mantiene al brillo normal. El reposo y el modo noche quedan en pausa. Tras pulsar el botón, el tiempo de reposo normal vuelve a empezar."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Encendida hasta pulsar el botón."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" espera al botón, tarde lo que tarde. Con "},{t:4,k:"minute"},{t:3,v:" la tarjeta desaparece al cabo de un minuto, pero el botón la cierra antes."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tiempo de espera."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" hace parpadear la retroiluminación cuatro veces al llegar la alerta (alrededor de un segundo) y luego deja la pantalla encendida."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Parpadeo."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Una alerta nueva sustituye a la actual; no se apilan. La alerta sustituida se notifica como "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Sustitución."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" quita la tarjeta, por ejemplo si la puerta ya está abierta. Sin alerta, esa acción no hace nada."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Cierre remoto."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" no hace nada; solo el botón la cierra. Así, un toque para despertar la pantalla nunca descarta la alerta por accidente."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tocar fuera de la tarjeta"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Cada vez que termina una alerta se dispara el evento "},{t:4,k:"event"},{t:3,v:" con "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (el nombre del dispositivo) y el "},{t:4,k:"device_id"},{t:3,v:" que añade Home Assistant. Se puede ver en Configuración → Herramientas → Eventos."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Cuándo"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Esperar a que alguien pulse el botón"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Usa un "},{t:4,k:"bold"},{t:3,v:": naranja para la puerta, rojo para humo o agua, verde para «hecho». El texto siempre se queda oscuro y legible."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"color para cada tipo de notificación"}},short:{t:0,b:{t:2,i:[{t:3,v:"Mantén el título "},{t:4,k:"bold"},{t:3,v:"; una pantalla muestra unos veinte caracteres en una línea y termina un título más largo con puntos suspensivos. Pon los detalles en el subtítulo."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"corto"}},button:{t:0,b:{t:2,i:[{t:3,v:"Un "},{t:4,k:"bold"},{t:3,v:" convierte la notificación en una pregunta: «Voy», «Visto», «Apagar». Después, el evento te dice quién respondió."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"texto de botón propio"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Para una alerta que se resuelve sola (se abre la puerta, alguien saca la ropa de la lavadora), ciérrala en la misma automatización con "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"¿Todas las pantallas? Dispara "},{t:4,k:"event"},{t:3,v:" una vez (consulta «Todas las pantallas a la vez»). Las pantallas siguen funcionando por separado y cada una informa con su propio "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"¿Prefieres "},{t:4,k:"bold"},{t:3,v:" que te haga la automatización? Instala la habilidad de ESP Screens en Configuración → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"pedirle a Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Timbre: muestra la alerta y espera a que alguien pulse el botón."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Alguien va a abrir la puerta."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avanzado · personalización local"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML personalizado · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Este pequeño archivo es tuyo. Se carga después del paquete común de las pantallas y se mantiene cuando ESP Screens se actualiza. Cambia aquí detalles propios del hardware, como el modelo de pantalla."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"¿Qué se puede cambiar sin riesgo?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Las secciones display, touchscreen y substitutions, los pines y otros detalles del dispositivo. El nombre, la Wi-Fi, la API, OTA y los enlaces a los paquetes los sigue gestionando ESP Screens."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Activo"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Listo para vincular"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado local"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Usar ejemplo"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Vaciar"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 carácter"},{t:2,i:[{t:4,k:"n"},{t:3,v:" caracteres"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 línea"},{t:2,i:[{t:4,k:"n"},{t:3,v:" líneas"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Guardar y comprobar"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Guardar YAML"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ningún perfil de ESPHome para esta pantalla."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Los cambios de aquí se aplican en la próxima compilación."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Guarda una vez para vincular este archivo al perfil."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Comprobando y guardando…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. El YAML personalizado se conserva en las actualizaciones de firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado guardado."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. ESPHome está comprobando el perfil completo…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome está comprobando el perfil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome está comprobando el perfil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"El perfil completo es válido. Ya puedes compilar e instalar sin riesgo."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome ha rechazado el perfil completo. Consulta Firmware y USB para ver el registro completo."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"¿Sustituir el texto actual por el ejemplo?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Ejemplo cargado. Guárdalo cuando estés listo."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"¿Vaciar el YAML personalizado local?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"El YAML personalizado quedará vacío cuando guardes."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Casa"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Desconocido"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Encendido"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"No disponible"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Calor"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Frío"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Calor/Frío"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Seco"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Solo ventilador"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Calefacción"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Refrigeración"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactivo"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Secando"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilador"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Precalentamiento"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Antihielo"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Abriendo"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Cerrando"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Reproduciendo"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"En pausa"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactivo"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"En espera"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"En casa"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Fuera"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Sobre el horizonte"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Bajo el horizonte"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"En la base"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Limpiando"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"En pausa"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Volviendo a la base"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactivo"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Soleado"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Despejado, de noche"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Nublado"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Parcialmente nublado"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Lluvioso"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Lluvia torrencial"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Nevado"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Nevado, lluvioso"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Niebla"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Granizo"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Relámpagos"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Relámpagos, lluvioso"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Ventoso"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Excepcional"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Bajo"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Cargando"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"No está cargando"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Frío"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Conectado"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Desconectado"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Caliente"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Luz detectada"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Sin luz"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Desbloqueado"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Bloqueado"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Húmedo"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Seco"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"En movimiento"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"No se mueve"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Enchufado"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Desenchufado"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Encendido"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"En casa"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Fuera"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problema"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"Ejecutando"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"No se está ejecutando"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Inseguro"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Seguro"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Manipulación detectada"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Actualización disponible"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Actualizado"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Activar"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Ejecutar"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Pulsa"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Bajo"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Medio"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Alto"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Moderado"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Enfoque"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Difuso"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Parte superior"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Encendido"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Encendido"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Ambos"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Vertical"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Justo ahora"}},minutes_ago:{t:0,b:{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" min"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 hora"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" horas"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Ayer"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 día"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" días"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 semana"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" semanas"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 mes"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" meses"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 año"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" años"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"En "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En 1 hora"},{t:2,i:[{t:3,v:"En "},{t:4,k:"n"},{t:3,v:" horas"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Mañana"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En 1 día"},{t:2,i:[{t:3,v:"En "},{t:4,k:"n"},{t:3,v:" días"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"a. m."}},pm:{t:0,b:{t:2,i:[{t:3}],s:"p. m."}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"domingo"}},{t:0,b:{t:2,i:[{t:3}],s:"lunes"}},{t:0,b:{t:2,i:[{t:3}],s:"martes"}},{t:0,b:{t:2,i:[{t:3}],s:"miércoles"}},{t:0,b:{t:2,i:[{t:3}],s:"jueves"}},{t:0,b:{t:2,i:[{t:3}],s:"viernes"}},{t:0,b:{t:2,i:[{t:3}],s:"sábado"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"dom"}},{t:0,b:{t:2,i:[{t:3}],s:"lun"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"mié"}},{t:0,b:{t:2,i:[{t:3}],s:"jue"}},{t:0,b:{t:2,i:[{t:3}],s:"vie"}},{t:0,b:{t:2,i:[{t:3}],s:"sáb"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"lu"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"mi"}},{t:0,b:{t:2,i:[{t:3}],s:"ju"}},{t:0,b:{t:2,i:[{t:3}],s:"vi"}},{t:0,b:{t:2,i:[{t:3}],s:"sá"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"enero"}},{t:0,b:{t:2,i:[{t:3}],s:"febrero"}},{t:0,b:{t:2,i:[{t:3}],s:"marzo"}},{t:0,b:{t:2,i:[{t:3}],s:"abril"}},{t:0,b:{t:2,i:[{t:3}],s:"mayo"}},{t:0,b:{t:2,i:[{t:3}],s:"junio"}},{t:0,b:{t:2,i:[{t:3}],s:"julio"}},{t:0,b:{t:2,i:[{t:3}],s:"agosto"}},{t:0,b:{t:2,i:[{t:3}],s:"septiembre"}},{t:0,b:{t:2,i:[{t:3}],s:"octubre"}},{t:0,b:{t:2,i:[{t:3}],s:"noviembre"}},{t:0,b:{t:2,i:[{t:3}],s:"diciembre"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"ene"}},{t:0,b:{t:2,i:[{t:3}],s:"feb"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"abr"}},{t:0,b:{t:2,i:[{t:3}],s:"may"}},{t:0,b:{t:2,i:[{t:3}],s:"jun"}},{t:0,b:{t:2,i:[{t:3}],s:"jul"}},{t:0,b:{t:2,i:[{t:3}],s:"ago"}},{t:0,b:{t:2,i:[{t:3}],s:"sept"}},{t:0,b:{t:2,i:[{t:3}],s:"oct"}},{t:0,b:{t:2,i:[{t:3}],s:"nov"}},{t:0,b:{t:2,i:[{t:3}],s:"dic"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" de "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:"."}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"2"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Página "},{t:4,k:"n"}]}}}}};export{t as default}; +const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Deshacer"}},online:{t:0,b:{t:2,i:[{t:3}],s:"En línea"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Sin conexión"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"desconocido"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Cambios no guardados"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Cancelar"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Abrir Dispositivos y servicios"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Guardar y enviar"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Guardando…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Leer datos actuales"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 resultado. Sigue escribiendo para acotar."},{t:2,i:[{t:4,k:"n"},{t:3,v:" resultados. Sigue escribiendo para acotar."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Cerrar"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Eliminar"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Cambiar"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Cargando…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Volver"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copiar"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nueva pantalla"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware y USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alertas"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Configuración"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Conectar e instalar"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"No ha funcionado. Recarga la página y vuelve a intentarlo."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Clave API copiada."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"La clave API está seleccionada. Cópiala con Ctrl+C o Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON del diseño copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El JSON del diseño está seleccionado. Cópialo con Ctrl+C o Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nombre de la acción copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El nombre de la acción está seleccionado. Cópialo con Ctrl+C o Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El YAML está seleccionado. Cópialo con Ctrl+C o Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nombre del icono copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El nombre del icono está seleccionado. Cópialo con Ctrl+C o Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Color vacío copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El color vacío está seleccionado. Cópialo con Ctrl+C o Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nombre del color copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"El nombre del color está seleccionado. Cópialo con Ctrl+C o Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Página de gestión inaccesible · reintentando…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Conectado a Home Assistant"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Reconectando con Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Buscar"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Pantallas"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Más"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Recargar"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"En cola para actualizar"}},available:{t:0,b:{t:2,i:[{t:3,v:"Actualización a "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ningún perfil de ESPHome con este nombre de dispositivo."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Novedades"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Registro completo"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"La dirección IP, solo esta vez; el firmware nuevo la comunica por sí mismo."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Dirección IP, p. ej. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Dirección IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Iniciar"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Instalada, pero aún no está en Home Assistant. Añade el dispositivo ESPHome descubierto en Configuración → Dispositivos y servicios, pega allí la clave API y activa «Permite que el dispositivo realice acciones de Home Assistant» en Configurar."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware descargado; aún no está en Home Assistant. Instálalo en la pantalla con ESPHome Web y luego añade el dispositivo ESPHome descubierto en Configuración → Dispositivos y servicios, pega allí la clave API y permite las acciones de Home Assistant en Configurar."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Aún no está en Home Assistant. ¿Ya has instalado el firmware? Añade el dispositivo ESPHome en Configuración → Dispositivos y servicios y luego permite las acciones de Home Assistant en Configurar. ¿Todavía no? Firmware y USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copiar clave API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Pantallas"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Acciones"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Añadir a esta pantalla"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Guía rápida y una alerta de prueba"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Actualizaciones, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nada que guardar"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificar esta pantalla"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Hace parpadear la retroiluminación y muestra una tarjeta"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Necesita un firmware más reciente"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exportar diseño"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Descargar y copiar como JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Busca pantallas, entidades, acciones…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"No hay coincidencias. Escribe parte del nombre de una pantalla, entidad o acción."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Elige una pantalla"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Elige una de tus pantallas a la izquierda para cambiar sus mosaicos, su barra superior y su configuración."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Empieza con una pantalla"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Conecta un CYD o un Guition por USB al equipo de Home Assistant. El perfil, el firmware y la primera instalación se hacen de una vez."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Instalar pantalla nueva"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Tienes cambios sin guardar. ¿Abrir otra pantalla de todos modos?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"¿Sustituir el diseño sin guardar por una copia del de la otra pantalla?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"¿Sustituir el diseño sin guardar por el importado?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. Tu pantalla se está actualizando."}},other:{t:0,b:{t:2,i:[{t:3,v:"Guardado. "},{t:4,k:"name"},{t:3,v:" se está actualizando."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. La pantalla se está actualizando."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. Tu último cambio aún no se ha enviado: vuelve a pulsar Guardar y enviar."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" parpadea y muestra una tarjeta durante unos segundos."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Sin conexión · los cambios se guardan"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Diseño"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Configuración de pantalla"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Guardado · enviado a la pantalla"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Todo guardado"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Más"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificar"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"hace parpadear la pantalla"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Necesita el firmware 0.2.31 o posterior"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"de Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copiar diseño de…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" pantalla"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pantallas"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"no hay otra pantalla"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" mosaico"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" mosaicos"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exportar diseño"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importar diseño…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"avanzado"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ningún perfil de ESPHome para esta pantalla"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Se ha eliminado "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"No hay sitio para este mosaico en la página "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"No hay ninguna página libre para un mosaico de página completa. Libera antes una página."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Esta pantalla ya tiene un mosaico que lleva a la página "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Diseño de "},{t:4,k:"name"},{t:3,v:" copiado. Pulsa Guardar y enviar cuando te parezca bien."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Diseño de "},{t:4,k:"name"},{t:3,v:" copiado: "},{t:4,k:"kept"},{t:3,v:" de "},{t:4,k:"total"},{t:3,v:" mosaicos son compatibles con el firmware de esta pantalla. Pulsa Guardar y enviar cuando te parezca bien."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Diseño importado. Pulsa Guardar y enviar cuando te parezca bien."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Diseño importado: "},{t:4,k:"kept"},{t:3,v:" de "},{t:4,k:"total"},{t:3,v:" mosaicos son compatibles con el firmware de esta pantalla. Pulsa Guardar y enviar cuando te parezca bien."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Eso no es JSON. Exporta antes un diseño o pega uno de otro ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Este archivo no tiene mosaicos. Se esperaba un diseño exportado desde ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" página · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" mosaicos"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" páginas · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" mosaicos"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Añade tu primera luz, escena o dispositivo desde la biblioteca."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Toca la barra superior o un mosaico para cambiarlo. Arrastra para mover; suelta en la página siguiente para crear una nueva."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Los huecos vacíos y las posiciones fijas funcionan a partir del firmware 0.2.26. Hasta esa actualización, esta pantalla (firmware "},{t:4,k:"firmware"},{t:3,v:") sube los mosaicos al primer hueco libre."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Diseño de la pantalla"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Añadir página"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Máximo 1 página"},{t:2,i:[{t:3,v:"Máximo "},{t:4,k:"n"},{t:3,v:" páginas"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Página "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Eliminar página"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Las páginas siguientes suben un puesto"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Editar barra superior"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Hueco vacío. Haz clic para añadir aquí un mosaico o arrastra uno hasta aquí."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Hueco vacío "},{t:4,k:"slot"},{t:3,v:" en la página "},{t:4,k:"page"},{t:3,v:": añade aquí el siguiente mosaico"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"El siguiente mosaico va aquí"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Vacío"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Biblioteca"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entidad"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entidades"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca por nombre, dispositivo o habitación…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Añadir una entidad"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Todo"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Luces"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatización"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruptores"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Estado"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Acciones"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventiladores"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Persianas"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Escenas"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspiradora"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensores"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Multimedia"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valores"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selectores"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personas"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Temporizadores"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Habitación"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Todas las habitaciones"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Ocultar añadidas"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Ocultar lo que ya está en esta pantalla"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Todo lo de aquí ya está en esta pantalla."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No se han encontrado entidades. Prueba con otro nombre, habitación o filtro."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En esta pantalla cabe 1 mosaico."},{t:2,i:[{t:3,v:"En esta pantalla caben "},{t:4,k:"n"},{t:3,v:" mosaicos."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En esta pantalla cabe 1 mosaico; actualiza su firmware para tener 48."},{t:2,i:[{t:3,v:"En esta pantalla caben "},{t:4,k:"n"},{t:3,v:" mosaicos; actualiza su firmware para tener 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Arrastra a una página o toca + para añadir al primer hueco libre. ⌘K busca en todo."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Luz"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatización"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspiradora"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilador"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Persiana"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Multimedia"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Estado"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruptor"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Interruptor"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Escena"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valor"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Valor"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selector"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Selector"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Acción"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Acción"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sol"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Temporizador"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Persona"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Cámara"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Imagen"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entidad"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"estándar"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"valor grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"previsión del tiempo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"gráfico"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"reloj digital"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"reloj analógico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"recorrido del sol"}},live:{t:0,b:{t:2,i:[{t:3}],s:"imagen en vivo"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"carátula"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"doble"}},full:{t:0,b:{t:2,i:[{t:3}],s:"página completa"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nombre en la pantalla"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automático (de Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automático (predeterminado)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla muestra el icono elegido a partir del firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Lleva a la página"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (vacía)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Los mosaicos de navegación necesitan el firmware 0.2.62: pulsa antes Actualizar en la lista de pantallas."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Esta pantalla no tiene página "},{t:4,k:"page"},{t:3,v:", así que un toque abre su última página. Elige otra página."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Al tocar el mosaico se abre esa página."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Presentación"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Reloj digital"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Reloj analógico"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nombre y estado"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Valor grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Previsión del tiempo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Gráfico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Recorrido del sol"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Imagen en vivo"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Una imagen pequeña de la cámara en el lugar del icono, actualizada al ritmo de abajo mientras la página está en pantalla. Un toque la sigue abriendo a pantalla completa."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Una imagen en vivo necesita el firmware 0.2.77 o más reciente: pulsa Actualizar en la pantalla después de guardar."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Carátula"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"La carátula de lo que suena en el lugar del icono, como en el propio mosaico de Home Assistant; un reproductor sin imagen conserva su icono. Un toque sigue abriendo la tarjeta."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La carátula en el mosaico necesita el firmware 0.2.78 o más reciente: pulsa Actualizar en la pantalla después de guardar."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no tiene valores numéricos para esta entidad, así que el gráfico queda vacío. Elige otra presentación."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Este servicio meteorológico no tiene previsión diaria en Home Assistant. Elige otra presentación."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Cada "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Tamaño"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Doble ancho"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Página completa"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Página completa: un botón grande en el color del propio mosaico; en la parte inferior va un control deslizante, unos controles o un gráfico."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Un mosaico de página completa necesita el firmware 0.2.62: pulsa antes Actualizar en la lista de pantallas."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Página"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Página nueva"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Control directo en el mosaico"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no ofrece este control para esta entidad, así que en la pantalla queda vacío. Elige otro."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"En la parte inferior del mosaico de página completa; un toque en cualquier otro sitio funciona como se indica más abajo."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"A la derecha del mosaico de doble ancho, como las filas de Home Assistant. Tocar el nombre funciona como se indica más abajo."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla muestra el control directo a partir del firmware 0.2.19; hasta entonces, el mosaico se queda como estaba."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Al tocar"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automático"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Abrir control"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Solo ver"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Encender / apagar"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Realizar una acción"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no puede encender y apagar esto, así que un toque no hace nada. Elige otra opción."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla lo enciende y apaga a partir del firmware 0.2.58: pulsa Actualizar en la lista de pantallas. Hasta entonces, un toque abre su tarjeta."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Mantén pulsado el mosaico para abrir su tarjeta."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Control deslizante pequeño en el mosaico"}},no:{t:0,b:{t:2,i:[{t:3}],s:"No"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Sí, control directo"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no tiene nada que un control deslizante pueda cambiar en esta entidad. Elige No."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Historial"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" hora"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" horas"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Fondo pastel"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Fondo: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", hueco "},{t:4,k:"slot"},{t:3,v:" de la página "},{t:4,k:"page"},{t:3,v:". Enter: configurar; teclas de flecha: mover"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Eliminar mosaico"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Eliminar "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Acción"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Preguntando a Home Assistant qué acciones tiene esta entidad…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant no responde ahora mismo. Vuelve a intentarlo en un momento."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Elige una acción"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca, por ejemplo alternar, posición o reproducir"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Buscar una acción"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ninguna acción."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ya no ofrece esta acción para esta entidad, así que un toque no hace nada. Elige otra."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (opcional)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Sin definir"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Activado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desactivado"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant necesita "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla realiza acciones a partir del firmware 0.2.58: pulsa Actualizar en la lista de pantallas. Hasta entonces, un toque funciona como Automático."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icono"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Sin icono"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca, por ejemplo lámpara, música o puerta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Buscar un icono"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Sin icono, solo texto"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icono: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ningún icono."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Datos actuales"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Conexión, estado y propiedades compatibles"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Leyendo…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Obteniendo el estado actual de HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Estado: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Control deslizante pequeño: "},{t:4,k:"slider"},{t:3,v:" · Presentación: "},{t:4,k:"display"},{t:3,v:" · Tamaño: "},{t:4,k:"size"},{t:3,v:" · Control: "},{t:4,k:"control"},{t:3,v:" · Fondo: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"sí"}},no:{t:0,b:{t:2,i:[{t:3}],s:"no"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"ninguno"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Predeterminado"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Volver a leer"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Se ha eliminado "},{t:4,k:"name"},{t:3,v:" de la barra superior"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En la barra superior cabe 1 elemento."},{t:2,i:[{t:3,v:"En la barra superior caben "},{t:4,k:"n"},{t:3,v:" elementos."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"Esto ya está en la barra superior."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Barra superior"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Barra superior: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"De la propia pantalla; también funciona sin Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" elemento"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" elementos"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Izquierda: nombre"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Por ejemplo: Salón"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Derecha: hora, sensores o un reloj"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", hueco "},{t:4,k:"slot"},{t:3,v:". Enter: configurar; flechas: mover"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Eliminar "},{t:4,k:"name"},{t:3,v:" de la barra superior"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Máximo 1 elemento"},{t:2,i:[{t:3,v:"Máximo "},{t:4,k:"n"},{t:3,v:" elementos"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Añade la hora, la fecha, el reloj analógico o una entidad"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Añadir hora, fecha o una entidad"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"No todo cabe junto al nombre: la pantalla omite los elementos con borde discontinuo. Elimina uno o elige un nombre más corto."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Arrastra para reordenar; toca un elemento para configurarlo."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Los sensores, la fecha y el reloj analógico aparecen a partir del firmware "},{t:4,k:"version"},{t:3,v:"; hasta esa actualización, esta pantalla muestra el nombre y, si la hora está en la barra, el reloj."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Oculto: ahora no está activo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"No cabe junto al nombre"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Esfera"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Oculto ahora mismo: no está activo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Ahora mismo no cabe junto al nombre"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Así se ve en la pantalla"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Esfera pequeña con la hora"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Qué mostrar"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Último cambio» sigue contando en la propia pantalla: «Justo ahora», «Hace 5 min», «Ayer»."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automático (como en Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mostrar"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Solo cuando está activo» oculta el elemento mientras está apagado, cerrado, fuera o en 0. Útil para una puerta abierta, una lavadora en marcha o quién está en casa."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Reloj de 24 horas · cámbialo en "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Reloj de 12 horas · cámbialo en "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Configuración → Idioma y región"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Hoy: "},{t:4,k:"date"},{t:3,v:". La fecha sigue el reloj de la propia pantalla."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Subir"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Bajar"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Añadir a la barra superior"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" hueco usado"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" huecos usados"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"De la propia pantalla"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Ya añadido"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Sugerencias de Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Una entidad"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca por nombre, habitación o entidad, p. ej. temperatura o puerta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Buscar una entidad para la barra superior"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No se han encontrado entidades."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brillo"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Noche"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brillo"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Modo oscuro"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Reposo automático"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Reposo tras"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brillo en reposo"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Modo noche"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Empieza"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Termina"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brillo nocturno"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Volver a la página 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Tras"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"También en reposo"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Deslizar entre páginas"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Botones de página"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotación"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" a. m."}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" p. m."}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Aún se está guardando la configuración de la otra pantalla. Vuelve a intentarlo en un momento."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Los botones de página y el deslizamiento están desactivados, así que solo los mosaicos «Ir a la página» cambian de página."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"la página "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"las páginas "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaico «Ir a la página», que lleva a "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir a la página», que llevan a "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaico «Ir a la página», que lleva a "},{t:4,k:"targets"},{t:3,v:", pero ninguno a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ella."}]},{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir a la página», que llevan a "},{t:4,k:"targets"},{t:3,v:", pero ninguno a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ella."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaico «Ir a la página», que lleva a "},{t:4,k:"targets"},{t:3,v:", pero ninguno a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ellas."}]},{t:2,i:[{t:3,v:"Tienes "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir a la página», que llevan a "},{t:4,k:"targets"},{t:3,v:", pero ninguno a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ellas."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"No tienes mosaicos «Ir a la página»."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"No tienes mosaicos «Ir a la página» que lleven a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ella."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"No tienes mosaicos «Ir a la página» que lleven a "},{t:4,k:"missing"},{t:3,v:", así que no puedes llegar a ellas."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Los mosaicos que llevan a "},{t:4,k:"pages"},{t:3,v:" solo están en páginas a las que no puedes llegar."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Desde "},{t:4,k:"pages"},{t:3,v:" ningún mosaico lleva de vuelta a la página 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Esta pantalla está sin conexión. Podrás cambiar su configuración cuando vuelva."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Los cambios se aplican al instante en la pantalla, y aparecen aquí cuando se cambian allí."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Los cambios se aplican al instante. Con el firmware 0.2.49, la pantalla los guarda ella misma."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Esta entidad está desactivada en Home Assistant o la pantalla se está reiniciando."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": menos"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": más"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Iniciando la actualización…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilando el firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Grabando el firmware por Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Compilando e instalando…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Esperando a que vuelva la pantalla…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Comprobando que se mantiene estable…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Idioma nuevo: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Ahora las pantallas se actualizarán automáticamente por la noche."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Las actualizaciones automáticas están desactivadas."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Actualizaciones de firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Actualizando al firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Aún no hay ninguna pantalla emparejada. Las pantallas nuevas reciben el firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"El firmware "},{t:4,k:"version"},{t:3,v:" está disponible para "},{t:4,k:"n"},{t:3,v:" pantalla."}]},{t:2,i:[{t:3,v:"El firmware "},{t:4,k:"version"},{t:3,v:" está disponible para "},{t:4,k:"n"},{t:3,v:" pantallas."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Todas las pantallas tienen el firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Actualizar 1 pantalla"},{t:2,i:[{t:3,v:"Actualizar las "},{t:4,k:"n"},{t:3,v:" pantallas"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Novedades del firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar automáticamente cada noche"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Entre las 03:00 y las 06:00, una pantalla cada vez. Se detiene si hay un error y lo notifica en Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Habilidad instalada. Claude Code la detecta al momento."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Habilidad instalada. Reinicia Claude Code una vez para que encuentre la nueva carpeta de habilidades."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Enseña a Claude a usar ESP Screens y luego pídele: «Muestra una alerta en todas mis pantallas cuando el buzón esté lleno». Claude conoce los eventos de alerta y cada campo, color e icono."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Instalar para Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Volver a instalar"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Actualizar la habilidad"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"No instalada"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Instalada"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Instalada · hay una versión más reciente"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Para Claude Code en Home Assistant. Escribe un archivo en "},{t:4,k:"path"},{t:3,v:"; al volver a instalar se sustituye."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descargar para claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Sube el zip en Claude, en Personalizar → Habilidades."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Todo lo que rodea a tus pantallas."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Mis pantallas"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Pantallas"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Añade una pantalla, o compila y reinstala el firmware de una que ya tengas."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar por USB o Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Idioma y región"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Idioma de las pantallas"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Idioma de Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Idioma de Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Las pantallas usan el inglés hasta que el idioma de Home Assistant esté disponible."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · aún sin revisar, se agradece ayuda"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" aún no está revisado; se agradece ayuda: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"cómo traducir"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Tras un cambio, cada pantalla necesita una actualización de firmware, una compilación por pantalla: con su botón Actualizar o en las actualizaciones nocturnas."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Formato de hora"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automático, según el idioma ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 horas"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 horas"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Formato numérico"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automático, según el idioma ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Tu perfil de Home Assistant: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Usar estos"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"El propio editor usa el idioma de tu perfil de Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Guardado."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. Cada pantalla adoptará el nuevo idioma con su próxima actualización."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Una tarjeta a pantalla completa desde una automatización, en una pantalla o en todas. La guía rápida tiene los nombres de las acciones, los campos, los iconos y los colores, y un formulario para probar una alerta."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Notificaciones a pantalla completa, desde una automatización"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar el firmware de las pantallas"}},intro:{t:0,b:{t:2,i:[{t:3,v:"La CLI de ESPHome integrada usa tu propio perfil (YAML con claves) y tus secretos. Elige el perfil de la pantalla y luego un puerto USB (pantalla conectada al equipo de Home Assistant), "},{t:4,k:"ota"},{t:3,v:" con el nombre de host, o "},{t:4,k:"download"},{t:3,v:" para instalar el firmware en la pantalla desde tu propio ordenador. "},{t:4,k:"check"},{t:3,v:" solo valida, "},{t:4,k:"build"},{t:3,v:" compila y "},{t:4,k:"install"},{t:3,v:" instala el firmware en la pantalla. Tus mosaicos se quedan como están en ESP Screens. La primera compilación tarda unos minutos."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descargar"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Comprobar"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Solo compilar"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Compilar y descargar"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Falta la CLI de ESPHome. Actualiza la aplicación a la versión 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Elige el perfil que corresponda y luego un puerto USB, una dirección IP o Descargar."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Perfil de ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Instalar en"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · aún no se ha encontrado ninguna placa en el equipo de Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Descargar · instalar desde tu propio ordenador"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Dirección IP o nombre de host"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Descargar "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Instálalo en la pantalla con "},{t:4,k:"esphome_web"},{t:3,v:" en Chrome o Edge: Connect, elige el puerto USB de la pantalla, Install y selecciona este archivo. Contiene tu contraseña de Wi-Fi y las claves de la pantalla: no lo compartas."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Conectar e instalar."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Perfil guardado."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Un momento…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Listo para descargar."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Hecho."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"No ha funcionado."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens crea el perfil propio de la pantalla con claves únicas y compila el firmware. Conecta la pantalla con un cable USB de datos al equipo donde se ejecuta Home Assistant, o descarga el firmware e instálalo en la pantalla desde tu propio ordenador."}},board:{t:0,b:{t:2,i:[{t:3}],s:"¿Qué pantalla tienes?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 pulgadas"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 pulgadas"}},board_elecrow:{t:0,b:{t:2,i:[{t:3}],s:"Elecrow CrowPanel · 7 pulgadas"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nombre"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla del salón"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nombre del dispositivo"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"personalizar"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cada pantalla tiene su propio perfil con sus propias claves. ¿Cuatro pantallas? Haz esto cuatro veces con un nombre distinto."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Letras minúsculas, números y guiones. Un nombre distinto para cada pantalla."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nombre de la red Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Contraseña de la Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Rellénalo una sola vez: ESP Screens lo guarda en el secrets.yaml de ESPHome y las siguientes pantallas lo usan automáticamente."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"A tu secrets.yaml de ESPHome aún le faltan los datos de la Wi-Fi. ESP Screens solo rellena las líneas que faltan."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"La Wi-Fi se toma de tu secrets.yaml de ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"El secrets.yaml de la carpeta de ESPHome no es un YAML válido. Corrige antes el archivo; no se sobrescribirá."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Instalar mediante"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Más tarde · solo guardar el perfil"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Conecta la pantalla con un cable USB de datos al equipo de Home Assistant; la lista se actualiza sola. O elige Descargar para usar tu propio ordenador."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descarga el firmware e instálalo en la pantalla desde tu propio ordenador, con Chrome o Edge. Después, las actualizaciones van por Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"El perfil se guarda en la carpeta de ESPHome. Puedes instalarlo más tarde desde Firmware y USB o desde ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Hay más de una placa conectada: elige el puerto de esta pantalla."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Una vez por USB; después, todo es inalámbrico."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Instalar"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Guardar perfil"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Ya hay una compilación o instalación en curso ("},{t:4,k:"file"},{t:3,v:"). Espera a que termine."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"A esta instalación le falta la CLI de ESPHome; solo se puede guardar el perfil."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" está en la carpeta de ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Grabando el firmware en "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilando el firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"El firmware para "},{t:4,k:"name"},{t:3,v:" está listo"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"El firmware ya está en "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Error en la compilación"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Error en la instalación"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Instálalo más tarde desde Firmware y USB: elige este perfil y luego el puerto USB del equipo de Home Assistant, o Descargar para instalar el firmware en la pantalla desde tu propio ordenador. Guarda la clave API para el emparejamiento:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"No desconectes todavía el cable USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"La primera compilación tarda unos minutos en una Raspberry Pi. Puedes salir de esta página: la instalación sigue en marcha y la volverás a encontrar en Nueva pantalla."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"La primera compilación tarda unos minutos en una Raspberry Pi. Puedes salir de esta página: la compilación sigue en marcha y la volverás a encontrar en Nueva pantalla."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Instálalo en la pantalla desde tu propio ordenador y luego empareja la pantalla con Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla arranca y se conecta a tu Wi-Fi. Empareja ahora la pantalla con Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"La pantalla arranca y se conecta a tu Wi-Fi. El CYD pide primero una calibración táctil: toca las cruces. Empareja ahora la pantalla con Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Consulta el registro de abajo."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" con un cable USB de datos."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Conecta la pantalla a tu ordenador"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" en Chrome o Edge, haz clic en Connect y elige el puerto USB de la pantalla."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Abre "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" y selecciona "},{t:4,k:"file"},{t:3,v:". La pantalla se reinicia y se conecta a tu Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" y selecciona "},{t:4,k:"file"},{t:3,v:". La pantalla se reinicia y se conecta a tu Wi-Fi. El CYD pide primero una calibración táctil: toca las cruces."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Haz clic en Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"El archivo contiene tu contraseña de Wi-Fi y las claves de la pantalla: no lo compartas."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Clave API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Esto se hace fuera de ESP Screens. Home Assistant descubre "},{t:4,k:"name"},{t:3,v:" como dispositivo ESPHome; haz clic en Añadir. ¿No aparece? Añade ESPHome manualmente con la dirección IP de la pantalla."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ve a Home Assistant → Configuración → Dispositivos y servicios."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" de arriba cuando Home Assistant pida la clave de cifrado."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Pega la clave API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" integración ESPHome → Configurar → «Permite que el dispositivo realice acciones de Home Assistant». Sin esto, la pantalla lo ve todo pero no controla nada."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Permite las acciones de HA:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" De vuelta en ESP Screens, la pantalla aparece en la lista de la izquierda en unos treinta segundos; hasta entonces se muestra ahí como «aún no está en Home Assistant»."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Elige tus mosaicos."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Registro de ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Reintentar"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Instalar otra pantalla"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Empezar de nuevo"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Hecho"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alertas · guía rápida"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Una notificación a pantalla completa, desde una automatización."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Cada pantalla tiene la acción "},{t:4,k:"action"},{t:3,v:". Coloca una tarjeta por encima de todo, despierta la pantalla y mantiene la retroiluminación al brillo normal hasta que alguien toque el botón o se agote el tiempo de espera. Home Assistant no muestra explicaciones ni desplegables para las acciones de ESPHome; aquí tienes todo lo que puedes rellenar."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"La guía rápida aún se está cargando; un momento."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Hay alguien en la puerta"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Puerta 3, trasera"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Voy"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Secciones"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Pruébalo"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Tus pantallas"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"En una automatización"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Todas las pantallas"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Los campos"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Iconos"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Colores"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Comportamiento"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Eventos"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Consejos"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Envía ahora una alerta, con los mismos campos que envía una automatización. La pantalla muestra la tarjeta y, con el parpadeo activado, hace parpadear la retroiluminación."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Pantalla"}},all:{t:0,b:{t:2,i:[{t:3,v:"Todas las pantallas (listas: "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · no está lista"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Título"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Subtítulo"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icono"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Color"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Texto del botón"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Tiempo de espera (segundos; 0 espera al botón)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Hacer parpadear la retroiluminación"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cuatro veces cuando llega la alerta."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Enviando…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Enviar alerta"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Enviada a "},{t:4,k:"n"},{t:3,v:" pantalla."}]},{t:2,i:[{t:3,v:"Enviada a "},{t:4,k:"n"},{t:3,v:" pantallas."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Enviada a "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Enviada a la pantalla."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Se ha omitido 1 pantalla (sin conexión o firmware antiguo)."},{t:2,i:[{t:3,v:"Se han omitido "},{t:4,k:"n"},{t:3,v:" pantallas (sin conexión o firmware antiguo)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Se dejaron vacíos: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Ninguna pantalla ha podido mostrarla: comprueba que haya una pantalla en línea con el firmware "},{t:4,k:"version"},{t:3,v:" o posterior."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Blanco (predeterminado)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Cada pantalla tiene su propia acción, con el nombre del dispositivo en ella. A partir del firmware "},{t:4,k:"version"},{t:3,v:"; actualiza una pantalla más antigua con su botón Actualizar en Pantallas."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Aún no hay ninguna pantalla emparejada. Instala una desde Nueva pantalla; la acción aparece en cuanto Home Assistant ve la pantalla."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Hay que actualizar · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nombre del dispositivo desconocido · actualiza la pantalla"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Mostrar alerta"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Descartar alerta"}}},howto:{add:{t:0,b:{t:2,i:[{t:3,v:"Pulsa "},{t:4,k:"add"},{t:3,v:" y busca "},{t:4,k:"esphome"},{t:3,v:". Elige la acción de tu pantalla: Home Assistant la llama «Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"»."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Añadir acción"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nombre del dispositivo"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant pide los siete; deja vacío lo que no uses ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", desactivado)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Rellena los campos."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"¿Prefieres YAML? Elige "},{t:4,k:"edit"},{t:3,v:" en la acción y pega el ejemplo de abajo."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Ejemplo para"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"una pantalla (aún sin emparejar)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Editar en YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copiar YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Todas las pantallas a la vez"}},text:{t:0,b:{t:2,i:[{t:3,v:"Dispara el evento "},{t:4,k:"show"},{t:3,v:" con los mismos campos y ESP Screens pasa la alerta a todas las pantallas en línea, incluidas las que añadas más tarde. "},{t:4,k:"dismiss"},{t:3,v:" la quita en todas. En una automatización, añade la acción "},{t:4,k:"event"},{t:3,v:" o pega el ejemplo en "},{t:4,k:"edit"},{t:3,v:". Omite los campos que no uses. Para esto, ESP Screens tiene que estar en marcha."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Disparar evento manual"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"El texto es libre; el límite es en bytes, y una letra acentuada cuenta como dos. Lo que no cabe acaba en puntos suspensivos (título) o se descarta (subtítulo)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Campo"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Tipo"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Qué hace"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Ejemplo"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Límite"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"texto"}},int:{t:0,b:{t:2,i:[{t:3}],s:"número"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"activado / desactivado"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entidad"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"de 0 a 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Escribe el nombre en "},{t:4,k:"field"},{t:3,v:", por ejemplo "},{t:4,k:"example"},{t:3,v:". También funcionan "},{t:4,k:"mdi"},{t:3,v:" y el código hexadecimal ("},{t:4,k:"hex"},{t:3,v:"). El firmware solo incluye estos iconos; cualquier otro nombre muestra el triángulo de advertencia. Toca un icono para copiar su nombre."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Útiles para notificaciones"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Buscar un icono"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Busca por nombre o descripción…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"También disponibles: iconos de control y del tiempo"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copiar "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"No hay ningún icono para «"},{t:4,k:"query"},{t:3,v:"». Los nombres desconocidos muestran el triángulo de advertencia ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Escribe el nombre en "},{t:4,k:"field"},{t:3,v:". Son los tonos pastel de los mosaicos, con texto oscuro. Vacío o desconocido da la tarjeta blanca. Toca para copiar."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Una alerta despierta al instante una pantalla atenuada u oscura y aparece por encima de cualquier página, de cualquier tarjeta de luz abierta y de la capa de reposo."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Despierta la pantalla."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Mientras se muestra la tarjeta, la retroiluminación se mantiene al brillo normal. El reposo y el modo noche quedan en pausa. Tras pulsar el botón, el tiempo de reposo normal vuelve a empezar."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Encendida hasta pulsar el botón."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" espera al botón, tarde lo que tarde. Con "},{t:4,k:"minute"},{t:3,v:" la tarjeta desaparece al cabo de un minuto, pero el botón la cierra antes."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tiempo de espera."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" hace parpadear la retroiluminación cuatro veces al llegar la alerta (alrededor de un segundo) y luego deja la pantalla encendida."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Parpadeo."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Una alerta nueva sustituye a la actual; no se apilan. La alerta sustituida se notifica como "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Sustitución."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" quita la tarjeta, por ejemplo si la puerta ya está abierta. Sin alerta, esa acción no hace nada."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Cierre remoto."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" no hace nada; solo el botón la cierra. Así, un toque para despertar la pantalla nunca descarta la alerta por accidente."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tocar fuera de la tarjeta"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Cada vez que termina una alerta se dispara el evento "},{t:4,k:"event"},{t:3,v:" con "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (el nombre del dispositivo) y el "},{t:4,k:"device_id"},{t:3,v:" que añade Home Assistant. Se puede ver en Configuración → Herramientas → Eventos."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Cuándo"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Esperar a que alguien pulse el botón"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Usa un "},{t:4,k:"bold"},{t:3,v:": naranja para la puerta, rojo para humo o agua, verde para «hecho». El texto siempre se queda oscuro y legible."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"color para cada tipo de notificación"}},short:{t:0,b:{t:2,i:[{t:3,v:"Mantén el título "},{t:4,k:"bold"},{t:3,v:"; una pantalla muestra unos veinte caracteres en una línea y termina un título más largo con puntos suspensivos. Pon los detalles en el subtítulo."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"corto"}},button:{t:0,b:{t:2,i:[{t:3,v:"Un "},{t:4,k:"bold"},{t:3,v:" convierte la notificación en una pregunta: «Voy», «Visto», «Apagar». Después, el evento te dice quién respondió."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"texto de botón propio"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Para una alerta que se resuelve sola (se abre la puerta, alguien saca la ropa de la lavadora), ciérrala en la misma automatización con "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"¿Todas las pantallas? Dispara "},{t:4,k:"event"},{t:3,v:" una vez (consulta «Todas las pantallas a la vez»). Las pantallas siguen funcionando por separado y cada una informa con su propio "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"¿Prefieres "},{t:4,k:"bold"},{t:3,v:" que te haga la automatización? Instala la habilidad de ESP Screens en Configuración → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"pedirle a Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Timbre: muestra la alerta y espera a que alguien pulse el botón."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Alguien va a abrir la puerta."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avanzado · personalización local"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML personalizado · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Este pequeño archivo es tuyo. Se carga después del paquete común de las pantallas y se mantiene cuando ESP Screens se actualiza. Cambia aquí detalles propios del hardware, como el modelo de pantalla."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"¿Qué se puede cambiar sin riesgo?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Las secciones display, touchscreen y substitutions, los pines y otros detalles del dispositivo. El nombre, la Wi-Fi, la API, OTA y los enlaces a los paquetes los sigue gestionando ESP Screens."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Activo"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Listo para vincular"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado local"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Usar ejemplo"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Vaciar"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 carácter"},{t:2,i:[{t:4,k:"n"},{t:3,v:" caracteres"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 línea"},{t:2,i:[{t:4,k:"n"},{t:3,v:" líneas"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Guardar y comprobar"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Guardar YAML"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"No se ha encontrado ningún perfil de ESPHome para esta pantalla."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Los cambios de aquí se aplican en la próxima compilación."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Guarda una vez para vincular este archivo al perfil."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Comprobando y guardando…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. El YAML personalizado se conserva en las actualizaciones de firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado guardado."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. ESPHome está comprobando el perfil completo…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome está comprobando el perfil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome está comprobando el perfil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"El perfil completo es válido. Ya puedes compilar e instalar sin riesgo."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome ha rechazado el perfil completo. Consulta Firmware y USB para ver el registro completo."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"¿Sustituir el texto actual por el ejemplo?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Ejemplo cargado. Guárdalo cuando estés listo."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"¿Vaciar el YAML personalizado local?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"El YAML personalizado quedará vacío cuando guardes."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Casa"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Desconocido"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Encendido"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"No disponible"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Calor"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Frío"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Calor/Frío"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Seco"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Solo ventilador"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Calefacción"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Refrigeración"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactivo"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Secando"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilador"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Precalentamiento"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Antihielo"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Abriendo"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Cerrando"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Reproduciendo"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"En pausa"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactivo"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"En espera"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"En casa"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Fuera"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Sobre el horizonte"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Bajo el horizonte"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"En la base"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Limpiando"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"En pausa"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Volviendo a la base"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactivo"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Soleado"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Despejado, de noche"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Nublado"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Parcialmente nublado"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Lluvioso"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Lluvia torrencial"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Nevado"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Nevado, lluvioso"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Niebla"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Granizo"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Relámpagos"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Relámpagos, lluvioso"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Ventoso"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Excepcional"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Bajo"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Cargando"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"No está cargando"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Frío"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Conectado"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Desconectado"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Caliente"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Luz detectada"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Sin luz"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Desbloqueado"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Bloqueado"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Húmedo"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Seco"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"En movimiento"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"No se mueve"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Enchufado"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Desenchufado"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Encendido"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"En casa"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Fuera"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problema"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"Ejecutando"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"No se está ejecutando"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Inseguro"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Seguro"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Manipulación detectada"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Actualización disponible"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Actualizado"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Detectado"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"No detectado"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Abierto"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Cerrado"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Activar"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Ejecutar"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Pulsa"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Bajo"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Medio"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Alto"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Moderado"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Enfoque"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Difuso"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Parte superior"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Encendido"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Encendido"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Apagado"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Ambos"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Vertical"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Justo ahora"}},minutes_ago:{t:0,b:{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" min"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 hora"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" horas"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Ayer"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 día"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" días"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 semana"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" semanas"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 mes"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" meses"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Hace 1 año"},{t:2,i:[{t:3,v:"Hace "},{t:4,k:"n"},{t:3,v:" años"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"En "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En 1 hora"},{t:2,i:[{t:3,v:"En "},{t:4,k:"n"},{t:3,v:" horas"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Mañana"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"En 1 día"},{t:2,i:[{t:3,v:"En "},{t:4,k:"n"},{t:3,v:" días"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"a. m."}},pm:{t:0,b:{t:2,i:[{t:3}],s:"p. m."}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"domingo"}},{t:0,b:{t:2,i:[{t:3}],s:"lunes"}},{t:0,b:{t:2,i:[{t:3}],s:"martes"}},{t:0,b:{t:2,i:[{t:3}],s:"miércoles"}},{t:0,b:{t:2,i:[{t:3}],s:"jueves"}},{t:0,b:{t:2,i:[{t:3}],s:"viernes"}},{t:0,b:{t:2,i:[{t:3}],s:"sábado"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"dom"}},{t:0,b:{t:2,i:[{t:3}],s:"lun"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"mié"}},{t:0,b:{t:2,i:[{t:3}],s:"jue"}},{t:0,b:{t:2,i:[{t:3}],s:"vie"}},{t:0,b:{t:2,i:[{t:3}],s:"sáb"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"lu"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"mi"}},{t:0,b:{t:2,i:[{t:3}],s:"ju"}},{t:0,b:{t:2,i:[{t:3}],s:"vi"}},{t:0,b:{t:2,i:[{t:3}],s:"sá"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"enero"}},{t:0,b:{t:2,i:[{t:3}],s:"febrero"}},{t:0,b:{t:2,i:[{t:3}],s:"marzo"}},{t:0,b:{t:2,i:[{t:3}],s:"abril"}},{t:0,b:{t:2,i:[{t:3}],s:"mayo"}},{t:0,b:{t:2,i:[{t:3}],s:"junio"}},{t:0,b:{t:2,i:[{t:3}],s:"julio"}},{t:0,b:{t:2,i:[{t:3}],s:"agosto"}},{t:0,b:{t:2,i:[{t:3}],s:"septiembre"}},{t:0,b:{t:2,i:[{t:3}],s:"octubre"}},{t:0,b:{t:2,i:[{t:3}],s:"noviembre"}},{t:0,b:{t:2,i:[{t:3}],s:"diciembre"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"ene"}},{t:0,b:{t:2,i:[{t:3}],s:"feb"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"abr"}},{t:0,b:{t:2,i:[{t:3}],s:"may"}},{t:0,b:{t:2,i:[{t:3}],s:"jun"}},{t:0,b:{t:2,i:[{t:3}],s:"jul"}},{t:0,b:{t:2,i:[{t:3}],s:"ago"}},{t:0,b:{t:2,i:[{t:3}],s:"sept"}},{t:0,b:{t:2,i:[{t:3}],s:"oct"}},{t:0,b:{t:2,i:[{t:3}],s:"nov"}},{t:0,b:{t:2,i:[{t:3}],s:"dic"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" de "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:"."}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"2"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Página "},{t:4,k:"n"}]}}}}};export{t as default}; diff --git a/screen_manager/app/static/assets/fr-uzS0ol44.js b/screen_manager/app/static/assets/fr-PLcoeSWe.js similarity index 57% rename from screen_manager/app/static/assets/fr-uzS0ol44.js rename to screen_manager/app/static/assets/fr-PLcoeSWe.js index 6c2c812..955e740 100644 --- a/screen_manager/app/static/assets/fr-uzS0ol44.js +++ b/screen_manager/app/static/assets/fr-PLcoeSWe.js @@ -1 +1 @@ -const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Annuler"}},online:{t:0,b:{t:2,i:[{t:3}],s:"En ligne"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Hors ligne"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"inconnu"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Modifications non enregistrées"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Annuler"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Ouvrir Appareils et services"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer et envoyer"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrement…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Lire les données actuelles"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" résultat. Continuez la saisie pour affiner la liste."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" résultats. Continuez la saisie pour affiner la liste."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Fermer"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Retirer"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Modifier"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Chargement…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Retour"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copier"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nouvel écran"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware et USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alertes"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Paramètres"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Connecter et installer"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Cela n'a pas fonctionné. Actualisez la page et réessayez."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Clé API copiée."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"La clé API est sélectionnée. Copiez-la avec Ctrl+C ou Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON de la mise en page copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le JSON de la mise en page est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nom de l'action copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le nom de l'action est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le YAML est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nom de l'icône copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le nom de l'icône est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Couleur vide copiée."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"La couleur vide est sélectionnée. Copiez-la avec Ctrl+C ou Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nom de la couleur copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le nom de la couleur est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Page de gestion injoignable · nouvelle tentative…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant connecté"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Reconnexion à Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Écrans"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Plus"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Actualiser"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Mise à jour"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"En attente de mise à jour"}},available:{t:0,b:{t:2,i:[{t:3,v:"Mise à jour "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Aucun profil ESPHome trouvé avec ce nom d'appareil."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Nouveautés"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Journal complet"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"L'adresse IP, une seule fois ; le nouveau firmware la communique ensuite lui-même."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Adresse IP, p. ex. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Adresse IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Démarrer"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Installé, mais pas encore dans Home Assistant. Ajoutez l'appareil ESPHome découvert dans Paramètres → Appareils et services, collez-y la clé API, puis activez « Autoriser l'appareil à effectuer des actions Home Assistant » sous Configurer."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware téléchargé, pas encore dans Home Assistant. Installez-le sur l'écran avec ESPHome Web, puis ajoutez l'appareil ESPHome découvert dans Paramètres → Appareils et services, collez-y la clé API et autorisez les actions Home Assistant sous Configurer."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Pas encore dans Home Assistant. Firmware déjà installé ? Ajoutez l'appareil ESPHome dans Paramètres → Appareils et services, puis autorisez les actions Home Assistant sous Configurer. Pas encore installé ? Firmware et USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copier la clé API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Écrans"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter à cet écran"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Aide-mémoire et alerte de test"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Mises à jour, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Rien à enregistrer"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifier cet écran"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Fait clignoter le rétroéclairage et affiche une carte"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Nécessite un firmware plus récent"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exporter la mise en page"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Télécharger et copier en JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher des écrans, entités, actions…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Aucun résultat. Saisissez une partie du nom d'un écran, d'une entité ou d'une action."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez un écran"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez un de vos écrans à gauche pour modifier ses tuiles, sa barre supérieure et ses paramètres."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Commencez par un écran"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Branchez un CYD ou un Guition en USB sur votre machine Home Assistant. Le profil, le firmware et la première installation se font en une seule fois."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Installer un nouvel écran"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Vous avez des modifications non enregistrées. Ouvrir quand même un autre écran ?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Remplacer la mise en page non enregistrée par une copie de celle de l'autre écran ?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Remplacer la mise en page non enregistrée par celle importée ?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. Votre écran est en cours de mise à jour."}},other:{t:0,b:{t:2,i:[{t:3,v:"Enregistré. "},{t:4,k:"name"},{t:3,v:" est en cours de mise à jour."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. L'écran est en cours de mise à jour."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. Votre dernière modification n'est pas encore envoyée : appuyez à nouveau sur Enregistrer et envoyer."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" clignote et affiche une carte pendant quelques secondes."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Hors ligne · modifications enregistrées"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Mise en page"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Paramètres de l'écran"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré · envoyé à l'écran"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Tout est enregistré"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Plus"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifier"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"faire clignoter l'écran"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Nécessite le firmware 0.2.31 ou plus récent"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"depuis Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copier la mise en page de…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" écran"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" écrans"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"aucun autre écran"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" tuile"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" tuiles"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exporter la mise en page"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importer une mise en page…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML personnalisé"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"avancé"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Aucun profil ESPHome trouvé pour cet écran"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour le firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Tuile retirée : "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Il n'y a pas de place pour cette tuile sur la page "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Aucune page n'est libre pour une tuile pleine page. Libérez d'abord une page."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Cet écran a déjà une tuile qui mène à la page "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Mise en page de "},{t:4,k:"name"},{t:3,v:" copiée. Appuyez sur Enregistrer et envoyer quand elle vous convient."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Mise en page de "},{t:4,k:"name"},{t:3,v:" copiée. Tuiles compatibles avec le firmware de cet écran : "},{t:4,k:"kept"},{t:3,v:" sur "},{t:4,k:"total"},{t:3,v:". Appuyez sur Enregistrer et envoyer quand elle vous convient."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Mise en page importée. Appuyez sur Enregistrer et envoyer quand elle vous convient."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Mise en page importée. Tuiles compatibles avec le firmware de cet écran : "},{t:4,k:"kept"},{t:3,v:" sur "},{t:4,k:"total"},{t:3,v:". Appuyez sur Enregistrer et envoyer quand elle vous convient."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Ce n'est pas du JSON. Exportez d'abord une mise en page, ou collez-en une d'un autre ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Aucune tuile dans ce fichier. Une mise en page exportée depuis ESP Screens était attendue."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" page · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tuiles"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pages · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tuiles"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Ajoutez votre première lumière, scène ou appareil depuis la bibliothèque."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Appuyez sur la barre supérieure ou sur une tuile pour la modifier. Faites glisser pour déplacer ; déposez sur la page suivante pour en créer une nouvelle."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Les emplacements vides et les positions fixes fonctionnent à partir du firmware 0.2.26. D'ici cette mise à jour, cet écran (firmware "},{t:4,k:"firmware"},{t:3,v:") décale les tuiles vers le premier emplacement libre."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Mise en page de l'écran"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Ajouter une page"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" page au maximum"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pages au maximum"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Page "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Supprimer la page"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Les pages suivantes remontent d'un rang"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Modifier la barre supérieure"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Emplacement vide. Cliquez pour ajouter une tuile ici, ou faites-en glisser une."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Emplacement vide "},{t:4,k:"slot"},{t:3,v:" sur la page "},{t:4,k:"page"},{t:3,v:" : ajouter la prochaine tuile ici"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"La prochaine tuile va ici"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Vide"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bibliothèque"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entité"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entités"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher par nom, appareil ou pièce…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter une entité"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Tout"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Lumières"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatisation"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interrupteurs"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"État"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilateurs"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Ouvertures"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scènes"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirateurs"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Capteurs"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Médias"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Météo"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valeurs"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Sélecteurs"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personnes"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Minuteurs"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Écran"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Pièce"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Toutes les pièces"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Masquer celles déjà placées"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Masquer ce qui est déjà sur cet écran"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Tout ce qui est ici est déjà sur cet écran."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Aucune entité trouvée. Essayez un autre nom, une autre pièce ou un autre filtre."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Cet écran peut contenir "},{t:4,k:"n"},{t:3,v:" tuile."}]},{t:2,i:[{t:3,v:"Cet écran peut contenir "},{t:4,k:"n"},{t:3,v:" tuiles."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Cet écran peut contenir "},{t:4,k:"n"},{t:3,v:" tuile ; mettez à jour son firmware pour en avoir 48."}]},{t:2,i:[{t:3,v:"Cet écran peut contenir "},{t:4,k:"n"},{t:3,v:" tuiles ; mettez à jour son firmware pour en avoir 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Faites glisser sur une page, ou appuyez sur + pour ajouter au premier emplacement libre. ⌘K recherche partout."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Lumière"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatisation"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirateur"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilateur"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Ouverture"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Média"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Capteur"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"État"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interrupteur"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Interrupteur"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scène"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Météo"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valeur"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Valeur"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Sélecteur"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Sélecteur"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Écran"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Soleil"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Minuteur"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personne"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Caméra"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Image"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entité"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"grande valeur"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"prévisions météo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"graphique"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"horloge numérique"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"horloge analogique"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"course du soleil"}},live:{t:0,b:{t:2,i:[{t:3}],s:"image en direct"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"pochette"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normale"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"double"}},full:{t:0,b:{t:2,i:[{t:3}],s:"pleine page"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nom sur l'écran"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatique (depuis Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatique (par défaut)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"L'écran affiche l'icône choisie à partir du firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mène à la page"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (vide)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Les tuiles de navigation nécessitent le firmware 0.2.62 : appuyez d'abord sur Mettre à jour pour cet écran."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Cet écran n'a pas de page "},{t:4,k:"page"},{t:3,v:" : toucher la tuile ouvre donc sa dernière page. Choisissez une autre page."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Toucher la tuile ouvre cette page."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Affichage"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Horloge numérique"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Horloge analogique"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nom et état"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Grande valeur"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Prévisions météo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Graphique"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Course du soleil"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Image en direct"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Une petite image de la caméra à la place de l'icône, rafraîchie au rythme ci-dessous tant que la page est affichée. Un appui l'ouvre toujours en plein écran."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Une image en direct demande le firmware 0.2.77 ou plus récent : appuyez sur Mettre à jour sur l'écran après l'enregistrement."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Pochette"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"La pochette de ce qui joue à la place de l'icône, comme la tuile de Home Assistant ; un lecteur sans image garde son icône. Un appui ouvre toujours la carte."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pochette sur la tuile demande le firmware 0.2.78 ou plus récent : appuyez sur Mettre à jour sur l'écran après l'enregistrement."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant n'a pas de valeurs numériques pour cette entité : le graphique reste donc vide. Choisissez un autre affichage."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Ce service météo n'a pas de prévisions journalières dans Home Assistant. Choisissez un autre affichage."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Rafraîchir"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Toutes les "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Taille"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Double largeur"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Pleine page"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Pleine page : un grand bouton dans la couleur de la tuile ; un curseur, des commandes ou un graphique se placent en bas."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Une tuile pleine page nécessite le firmware 0.2.62 : appuyez d'abord sur Mettre à jour pour cet écran."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Page"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nouvelle page"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Commande directe sur la tuile"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ne propose pas cette commande pour cette entité : elle reste donc vide sur l'écran. Choisissez-en une autre."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"En bas de la tuile pleine page ; toucher ailleurs agit comme réglé ci-dessous."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"À droite de la tuile double largeur, comme les lignes dans Home Assistant. Toucher le nom agit comme réglé ci-dessous."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"L'écran affiche la commande directe à partir du firmware 0.2.19 ; d'ici là, la tuile reste comme avant."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Au toucher"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatique"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Ouvrir les commandes"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Affichage seul"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Allumer / éteindre"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Effectuer une action"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ne peut pas allumer ni éteindre ceci : toucher la tuile ne fait donc rien. Choisissez une autre option."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"L'écran allume et éteint ceci à partir du firmware 0.2.58 : appuyez sur Mettre à jour pour cet écran. D'ici là, toucher la tuile ouvre sa carte."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Maintenez le doigt sur la tuile pour ouvrir sa carte."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Petit curseur sur la tuile"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Non"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Oui, commande directe"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant n'a rien qu'un curseur puisse régler pour cette entité. Choisissez Non."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Historique"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" heure"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" heures"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Fond pastel"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Fond : "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", emplacement "},{t:4,k:"slot"},{t:3,v:" de la page "},{t:4,k:"page"},{t:3,v:". Enter : configurer, touches fléchées : déplacer"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Retirer la tuile"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Retirer "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Récupération auprès de Home Assistant des actions de cette entité…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ne répond pas pour le moment. Réessayez dans un instant."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez une action"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher, par exemple allumer, position ou lecture"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher une action"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Aucune action trouvée."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ne propose plus cette action pour cette entité : toucher la tuile ne fait donc rien. Choisissez-en une autre."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (facultatif)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Non défini"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant a besoin de : "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"L'écran effectue une action à partir du firmware 0.2.58 : appuyez sur Mettre à jour pour cet écran. D'ici là, toucher la tuile agit comme Automatique."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icône"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Aucune icône"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher, par exemple lampe, musique ou porte"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher une icône"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Aucune icône, texte seul"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icône : "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Aucune icône trouvée."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Données actuelles"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Connexion, état et propriétés prises en charge"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Lecture…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Récupération de l'état actuel dans HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"État : "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Petit curseur : "},{t:4,k:"slider"},{t:3,v:" · Affichage : "},{t:4,k:"display"},{t:3,v:" · Taille : "},{t:4,k:"size"},{t:3,v:" · Commande : "},{t:4,k:"control"},{t:3,v:" · Fond : "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"oui"}},no:{t:0,b:{t:2,i:[{t:3}],s:"non"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"aucune"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Par défaut"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Relire"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Retiré de la barre supérieure : "},{t:4,k:"name"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"La barre supérieure a de la place pour "},{t:4,k:"n"},{t:3,v:" élément."}]},{t:2,i:[{t:3,v:"La barre supérieure a de la place pour "},{t:4,k:"n"},{t:3,v:" éléments."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"C'est déjà dans la barre supérieure."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Barre supérieure"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Barre supérieure : "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Fourni par l'écran lui-même, fonctionne aussi sans Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" sur "},{t:4,k:"n"},{t:3,v:" élément"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" sur "},{t:4,k:"n"},{t:3,v:" éléments"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Gauche : nom"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Par exemple : Salon"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Droite : heure, capteurs ou horloge"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", emplacement "},{t:4,k:"slot"},{t:3,v:". Enter : configurer, flèches : déplacer"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Retirer "},{t:4,k:"name"},{t:3,v:" de la barre supérieure"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" élément au maximum"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" éléments au maximum"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter l'heure, la date, l'horloge analogique ou une entité"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Ajouter l'heure, la date ou une entité"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Tout ne tient pas à côté du nom : l'écran laisse de côté les éléments en pointillés. Retirez-en un ou choisissez un nom plus court."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Faites glisser pour réorganiser ; appuyez sur un élément pour le configurer."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Les capteurs, la date et l'horloge analogique apparaissent à partir du firmware "},{t:4,k:"version"},{t:3,v:" ; d'ici cette mise à jour, cet écran affiche le nom et, si l'heure est dans la barre, l'horloge."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Masqué : pas actif en ce moment"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Ne tient pas à côté du nom"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Cadran"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Masqué en ce moment : pas actif"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Ne tient pas à côté du nom pour l'instant"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Aperçu sur l'écran"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Petit cadran avec l'heure"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Contenu affiché"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"« Dernière modification » continue de compter sur l'écran lui-même : « À l'instant », « Il y a 5 min », « Hier »."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatique (comme Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Afficher"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"« Seulement si actif » masque l'élément tant qu'il est éteint, fermé, absent ou à 0. Pratique pour une porte ouverte, un lave-linge en marche ou pour savoir qui est à la maison."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Horloge 24 heures · à modifier dans "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Horloge 12 heures · à modifier dans "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Paramètres → Langue et région"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Aujourd'hui : "},{t:4,k:"date"},{t:3,v:". La date suit l'horloge propre à l'écran."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Monter"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Descendre"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter à la barre supérieure"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" sur "},{t:4,k:"n"},{t:3,v:" emplacement utilisé"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" sur "},{t:4,k:"n"},{t:3,v:" emplacements utilisés"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Fourni par l'écran lui-même"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Déjà ajouté"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Suggestions de Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Une entité"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher par nom, pièce ou entité, p. ex. température ou porte"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher une entité pour la barre supérieure"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Aucune entité trouvée."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosité"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Nuit"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Écran"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosité"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Mode sombre"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Veille auto"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Veille après"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosité en veille"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Mode nuit"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Début"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Fin"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosité de nuit"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Retour à la page 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Après"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Aussi en veille"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Balayer entre les pages"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Boutons de page"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotation"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Les paramètres de l'autre écran sont encore en cours d'enregistrement. Réessayez dans un instant."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Les boutons de page et le balayage sont désactivés : seules les tuiles « Aller à la page » changent de page."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"la page "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"les pages "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuile « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuiles « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuile « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:", mais aucune vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas l'atteindre."}]},{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuiles « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:", mais aucune vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas l'atteindre."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuile « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:", mais aucune vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas les atteindre."}]},{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuiles « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:", mais aucune vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas les atteindre."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Vous n'avez aucune tuile « Aller à la page »."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Vous n'avez aucune tuile « Aller à la page » vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas l'atteindre."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Vous n'avez aucune tuile « Aller à la page » vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas les atteindre."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Les tuiles vers "},{t:4,k:"pages"},{t:3,v:" se trouvent uniquement sur des pages que vous ne pouvez pas atteindre."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Depuis "},{t:4,k:"pages"},{t:3,v:", aucune tuile ne ramène à la page 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Cet écran est hors ligne. Ses paramètres pourront être modifiés à son retour."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Les modifications s'appliquent tout de suite sur l'écran, et celles faites sur l'écran s'affichent ici."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Les modifications s'appliquent tout de suite. À partir du firmware 0.2.49, l'écran les conserve lui-même."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Cette entité est désactivée dans Home Assistant, ou l'écran redémarre."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" : diminuer"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" : augmenter"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Démarrage de la mise à jour…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilation du firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Écriture du firmware via le Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Compilation et installation…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"En attente du retour de l'écran…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Vérification de la stabilité…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Nouvelle langue : "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Les écrans se mettront désormais à jour automatiquement la nuit."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Les mises à jour automatiques sont désactivées."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Mises à jour du firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Mise à jour vers le firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Aucun écran associé pour l'instant. Les nouveaux écrans reçoivent le firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Le firmware "},{t:4,k:"version"},{t:3,v:" est disponible pour "},{t:4,k:"n"},{t:3,v:" écran."}]},{t:2,i:[{t:3,v:"Le firmware "},{t:4,k:"version"},{t:3,v:" est disponible pour "},{t:4,k:"n"},{t:3,v:" écrans."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Tous les écrans ont le firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Mettre à jour "},{t:4,k:"n"},{t:3,v:" écran"}]},{t:2,i:[{t:3,v:"Mettre à jour les "},{t:4,k:"n"},{t:3,v:" écrans"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Nouveautés du firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour automatiquement chaque nuit"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Entre 03:00 et 06:00, un écran à la fois. S'arrête en cas d'erreur et la signale dans Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Compétence installée. Claude Code la prend en compte tout de suite."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Compétence installée. Redémarrez Claude Code une fois pour qu'il trouve le nouveau dossier de compétences."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Apprenez ESP Screens à Claude, puis demandez-lui : « Affiche une alerte sur tous mes écrans quand la boîte aux lettres est pleine. » Claude connaît les événements d'alerte, chaque champ, chaque couleur et chaque icône."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installer pour Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Réinstaller"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour la compétence"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Non installée"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Installée"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Installée · une version plus récente est prête"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Pour Claude Code dans Home Assistant. Écrit un fichier dans "},{t:4,k:"path"},{t:3,v:" ; une nouvelle installation le remplace."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Télécharger pour claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Importez le zip dans Claude sous Personnaliser → Compétences."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tout ce qui entoure vos écrans."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Mes écrans"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Écrans"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Ajoutez un écran, ou compilez et réinstallez le firmware d'un écran que vous avez déjà."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Compiler et installer via USB ou Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Langue et région"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Langue des écrans"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Langue de Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Langue de Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Les écrans utilisent l'anglais tant que la langue de Home Assistant n'est pas disponible."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · pas encore vérifié, aide bienvenue"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" n'est pas encore vérifié, votre aide est la bienvenue : "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"comment traduire"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Après un changement, chaque écran a besoin d'une mise à jour du firmware, soit une compilation par écran : avec son bouton Mettre à jour, ou lors des mises à jour nocturnes."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Format de l'heure"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatique, selon la langue ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 heures"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 heures"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Format de nombre"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatique, selon la langue ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Votre profil Home Assistant : "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Utiliser ceux-ci"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"L'éditeur suit la langue de votre profil Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. Chaque écran passe à la nouvelle langue lors de sa prochaine mise à jour."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Une carte sur tout l'écran, déclenchée par une automatisation, sur un écran ou sur tous. L'aide-mémoire donne les noms des actions, les champs, les icônes et les couleurs, avec un formulaire pour en essayer une."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Notifications plein écran, depuis une automatisation"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Compiler et installer le firmware des écrans"}},intro:{t:0,b:{t:2,i:[{t:3,v:"La CLI ESPHome intégrée utilise votre propre profil (YAML avec les clés) et vos secrets. Choisissez le profil de l'écran, puis un port USB (écran branché sur la machine Home Assistant), "},{t:4,k:"ota"},{t:3,v:" avec le nom d'hôte, ou "},{t:4,k:"download"},{t:3,v:" pour installer le firmware sur l'écran depuis votre propre ordinateur. "},{t:4,k:"check"},{t:3,v:" ne fait que valider, "},{t:4,k:"build"},{t:3,v:" compile, "},{t:4,k:"install"},{t:3,v:" installe le firmware sur l'écran. Vos tuiles restent telles quelles dans ESP Screens. La première compilation prend quelques minutes."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Télécharger"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Vérifier"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Compiler seulement"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Compiler et installer"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Compiler et télécharger"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"La CLI ESPHome est absente. Mettez à jour l'application vers la version 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez le profil voulu, puis un port USB, une adresse IP ou Télécharger."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Profil ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Installer sur"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · aucun écran détecté pour l'instant sur la machine Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Télécharger · installer depuis votre propre ordinateur"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Adresse IP ou nom d'hôte"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Télécharger "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Installez-le sur l'écran avec "},{t:4,k:"esphome_web"},{t:3,v:" dans Chrome ou Edge : Connect, choisissez le port USB de l'écran, Install, puis sélectionnez ce fichier. Il contient votre mot de passe Wi-Fi et les clés de l'écran : gardez-le pour vous."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Connecter et installer."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profil enregistré."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Un instant…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Prêt à télécharger."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Terminé."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Cela n'a pas fonctionné."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens crée le profil propre à l'écran, avec des clés uniques, et compile le firmware. Branchez l'écran avec un câble USB de données sur la machine qui fait tourner Home Assistant, ou téléchargez le firmware et installez-le sur l'écran depuis votre propre ordinateur."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Quel écran avez-vous ?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 pouces"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 pouces"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nom"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Écran du salon"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nom de l'appareil"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"personnaliser"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Chaque écran reçoit son propre profil avec ses propres clés. Quatre écrans ? Refaites ces étapes quatre fois avec un nom différent."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Lettres minuscules, chiffres et tirets. Un nom différent pour chaque écran."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nom du Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"À remplir une seule fois : ESP Screens l'enregistre dans le secrets.yaml d'ESPHome, et les écrans suivants l'utilisent automatiquement."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Il manque encore les informations Wi-Fi dans votre secrets.yaml d'ESPHome. ESP Screens ne remplit que les lignes manquantes."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Le Wi-Fi vient de votre secrets.yaml d'ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Le secrets.yaml du dossier ESPHome n'est pas un YAML valide. Corrigez d'abord le fichier ; il ne sera pas écrasé."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Installer via"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Plus tard · enregistrer seulement le profil"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Branchez l'écran avec un câble USB de données sur la machine Home Assistant ; la liste s'actualise d'elle-même. Ou choisissez Télécharger pour utiliser votre propre ordinateur."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Téléchargez le firmware et installez-le sur l'écran depuis votre propre ordinateur, dans Chrome ou Edge. Ensuite, les mises à jour passent par le Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Le profil va dans le dossier ESPHome. Vous pourrez l'installer plus tard via Firmware et USB, ou depuis ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Plusieurs écrans sont branchés : choisissez le port de cet écran."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Une seule fois en USB ; ensuite, tout se fait sans fil."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installer"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer le profil"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Une compilation ou une installation est déjà en cours ("},{t:4,k:"file"},{t:3,v:"). Attendez qu'elle se termine."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"La CLI ESPHome est absente de cette installation ; seul l'enregistrement du profil est possible."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" est dans le dossier ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Écriture du firmware sur "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilation du firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Le firmware pour "},{t:4,k:"name"},{t:3,v:" est prêt"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Le firmware est sur "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Échec de la compilation"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Échec de l'installation"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Installez-le plus tard depuis Firmware et USB : choisissez ce profil, puis le port USB de la machine Home Assistant, ou Télécharger pour installer le firmware sur l'écran depuis votre propre ordinateur. Conservez la clé API pour l'association :"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Ne débranchez pas encore le câble USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Une première compilation prend quelques minutes sur un Raspberry Pi. Vous pouvez quitter cette page : l'installation continue et vous la retrouverez sous Nouvel écran."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Une première compilation prend quelques minutes sur un Raspberry Pi. Vous pouvez quitter cette page : la compilation continue et vous la retrouverez sous Nouvel écran."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Installez-le sur l'écran depuis votre propre ordinateur, puis associez l'écran à Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"L'écran démarre et se connecte à votre Wi-Fi. Associez-le maintenant à Home Assistant :"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"L'écran démarre et se connecte à votre Wi-Fi. Le CYD demande d'abord un étalonnage tactile : touchez les croix. Associez-le maintenant à Home Assistant :"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Voir le journal ci-dessous."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" avec un câble USB de données."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Branchez l'écran sur votre ordinateur"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" dans Chrome ou Edge, cliquez sur Connect et choisissez le port USB de l'écran."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Ouvrez "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" et sélectionnez "},{t:4,k:"file"},{t:3,v:". L'écran redémarre et rejoint votre Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" et sélectionnez "},{t:4,k:"file"},{t:3,v:". L'écran redémarre et rejoint votre Wi-Fi. Le CYD demande d'abord un étalonnage tactile : touchez les croix."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Cliquez sur Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Le fichier contient votre mot de passe Wi-Fi et les clés de l'écran : gardez-le pour vous."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Clé API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Cela se passe en dehors d'ESP Screens. Home Assistant découvre "},{t:4,k:"name"},{t:3,v:" comme appareil ESPHome ; cliquez sur Ajouter. Pas découvert ? Ajoutez ESPHome manuellement avec l'adresse IP de l'écran."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Allez dans Home Assistant → Paramètres → Appareils et services."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ci-dessus quand Home Assistant demande une clé de chiffrement."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Collez la clé API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" intégration ESPHome → Configurer → « Autoriser l'appareil à effectuer des actions Home Assistant ». Sans cela, l'écran voit tout mais ne commande rien."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Autorisez les actions HA :"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" De retour dans ESP Screens, l'écran apparaît dans la liste à gauche en une trentaine de secondes ; d'ici là, il y figure comme « pas encore dans Home Assistant »."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez vos tuiles."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Journal ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Réessayer"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Installer un autre écran"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Recommencer"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Terminé"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alertes · aide-mémoire"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Une notification plein écran, depuis une automatisation."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Chaque écran a l'action "},{t:4,k:"action"},{t:3,v:". Elle place une carte par-dessus tout, réveille l'écran et garde le rétroéclairage à luminosité normale jusqu'à ce que quelqu'un touche le bouton ou que le délai expire. Home Assistant n'affiche lui-même ni explication ni listes déroulantes pour les actions ESPHome ; tout ce que vous pouvez remplir est listé ici."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"L'aide-mémoire est encore en cours de chargement ; un instant."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Quelqu'un est à la porte"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Porte 3, arrière"}},button:{t:0,b:{t:2,i:[{t:3}],s:"J'arrive"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Sections"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Essayer"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Vos écrans"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"Dans une automatisation"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Tous les écrans"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Les champs"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Icônes"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Couleurs"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Comportement"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Événements"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Astuces"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Envoyez une alerte maintenant, avec les mêmes champs qu'une automatisation. L'écran affiche la carte et, si le clignotement est activé, fait clignoter son rétroéclairage."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Écran"}},all:{t:0,b:{t:2,i:[{t:3,v:"Tous les écrans (prêts : "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · pas prêt"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Titre"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Sous-titre"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icône"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Couleur"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Texte du bouton"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Délai (secondes, 0 attend le bouton)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Faire clignoter le rétroéclairage"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Quatre fois à l'arrivée de l'alerte."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Envoi…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Envoyer l'alerte"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Envoyée à "},{t:4,k:"n"},{t:3,v:" écran."}]},{t:2,i:[{t:3,v:"Envoyée à "},{t:4,k:"n"},{t:3,v:" écrans."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Envoyée à "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Envoyée à l'écran."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" écran ignoré (hors ligne ou firmware trop ancien)."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" écrans ignorés (hors ligne ou firmware trop ancien)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Champs laissés vides : "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Aucun écran n'a pu l'afficher : vérifiez qu'un écran est en ligne avec le firmware "},{t:4,k:"version"},{t:3,v:" ou plus récent."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Blanc (par défaut)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Chaque écran a sa propre action, qui contient le nom de l'appareil. À partir du firmware "},{t:4,k:"version"},{t:3,v:" ; mettez à jour un écran plus ancien avec son bouton Mettre à jour, sous Écrans."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Aucun écran associé pour l'instant. Installez-en un via Nouvel écran ; l'action apparaît dès que Home Assistant voit l'écran."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Mise à jour nécessaire · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nom d'appareil inconnu · mettez à jour l'écran"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Afficher l'alerte"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Fermer l'alerte"}}},howto:{add:{t:0,b:{t:2,i:[{t:4,k:"add"},{t:3,v:" et recherchez "},{t:4,k:"esphome"},{t:3,v:". Choisissez l'action de votre écran : Home Assistant l'appelle « Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:" »."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter une action"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nom de l'appareil"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant les demande tous les sept ; laissez vide ce que vous n'utilisez pas ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", désactivé)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Remplissez les champs."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Vous préférez le YAML ? Choisissez "},{t:4,k:"edit"},{t:3,v:" sur l'action et collez l'exemple ci-dessous."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Exemple pour"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"un écran (pas encore associé)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Modifier en YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copier le YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Tous les écrans à la fois"}},text:{t:0,b:{t:2,i:[{t:3,v:"Déclenchez l'événement "},{t:4,k:"show"},{t:3,v:" avec les mêmes champs, et ESP Screens transmet l'alerte à chaque écran en ligne, y compris ceux que vous ajouterez plus tard. "},{t:4,k:"dismiss"},{t:3,v:" la retire partout. Dans une automatisation, ajoutez l'action "},{t:4,k:"event"},{t:3,v:" ou collez l'exemple sous "},{t:4,k:"edit"},{t:3,v:". Omettez les champs que vous n'utilisez pas. ESP Screens doit être en marche pour cela."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Déclencher un événement manuel"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Le texte est libre ; la limite est en octets, et une lettre accentuée compte pour deux. Ce qui ne tient pas se termine par des points de suspension (titre) ou est coupé (sous-titre)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Champ"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Type"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Ce qu'il fait"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Exemple"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limite"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"texte"}},int:{t:0,b:{t:2,i:[{t:3}],s:"nombre"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"activé / désactivé"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entité"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" octets"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"0 à 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Indiquez le nom dans "},{t:4,k:"field"},{t:3,v:", par exemple "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" et le code hexadécimal ("},{t:4,k:"hex"},{t:3,v:") fonctionnent aussi. Seules ces icônes sont incluses dans le firmware ; tout autre nom affiche le triangle d'avertissement. Appuyez sur une icône pour copier son nom."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Pratiques pour les notifications"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher une icône"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher par nom ou description…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Également disponibles : icônes de commande et de météo"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copier "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Aucune icône pour « "},{t:4,k:"query"},{t:3,v:" ». Les noms inconnus affichent le triangle d'avertissement ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Indiquez le nom dans "},{t:4,k:"field"},{t:3,v:". Ce sont les teintes pastel des tuiles, avec un texte foncé. Un nom vide ou inconnu donne la carte blanche. Appuyez pour copier."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Une alerte réveille immédiatement un écran assombri ou éteint et s'affiche par-dessus chaque page, chaque carte de lumière ouverte et la couche de veille."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Réveille l'écran."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Tant que la carte est affichée, le rétroéclairage reste à luminosité normale. La veille et les heures de nuit attendent. Après le bouton, le délai de veille habituel recommence."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Allumé jusqu'au bouton."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" attend le bouton, aussi longtemps qu'il le faut. Avec "},{t:4,k:"minute"},{t:3,v:", la carte disparaît au bout d'une minute, mais le bouton la ferme plus tôt."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Délai."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" fait clignoter le rétroéclairage quatre fois à l'arrivée de l'alerte (environ une seconde), puis laisse l'écran allumé."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Clignotement."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Une nouvelle alerte remplace l'actuelle ; il n'y a pas de pile. L'alerte remplacée se signale comme "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Remplacement."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" retire la carte, par exemple si la porte est déjà ouverte. Sans alerte, cette action ne fait rien."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fermeture à distance."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ne fait rien ; seul le bouton la ferme. Ainsi, toucher l'écran pour le réveiller ne ferme jamais l'alerte par accident."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Toucher à côté de la carte"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Chaque fin d'alerte déclenche l'événement "},{t:4,k:"event"},{t:3,v:" avec "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (le nom de l'appareil) et le "},{t:4,k:"device_id"},{t:3,v:" qu'ajoute Home Assistant. Visible dans Paramètres → Outils → Événements."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Quand"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Attendre que quelqu'un appuie sur le bouton"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Utilisez une "},{t:4,k:"bold"},{t:3,v:" : orange pour la porte, rouge pour la fumée ou l'eau, vert pour « terminé ». Le texte reste toujours foncé et lisible."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"couleur par type de notification"}},short:{t:0,b:{t:2,i:[{t:3,v:"Gardez un titre "},{t:4,k:"bold"},{t:3,v:" ; un écran affiche une vingtaine de caractères sur une ligne et termine un titre plus long par des points de suspension. Mettez les détails dans le sous-titre."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"court"}},button:{t:0,b:{t:2,i:[{t:3,v:"Un "},{t:4,k:"bold"},{t:3,v:" transforme la notification en question : « J'arrive », « Vu », « Éteindre ». L'événement vous dit alors qui a répondu."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"texte de bouton personnalisé"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Pour une alerte qui se règle d'elle-même (la porte s'ouvre, le linge est sorti), fermez-la dans la même automatisation avec "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Tous les écrans ? Déclenchez "},{t:4,k:"event"},{t:3,v:" une seule fois (voir Tous les écrans à la fois). Les écrans restent indépendants et chacun répond avec son propre "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Vous préférez "},{t:4,k:"bold"},{t:3,v:" pour l'automatisation ? Installez la compétence ESP Screens dans Paramètres → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"demander à Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Sonnette : afficher l’alerte et attendre qu’on appuie sur le bouton."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Quelqu’un arrive à la porte."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avancé · personnalisation locale"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML personnalisé"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML personnalisé · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Ce petit fichier est à vous. Il est chargé après le paquet commun des écrans et reste en place quand ESP Screens se met à jour. Modifiez ici les détails propres au matériel, comme un modèle d'écran."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Que peut-on modifier sans risque ?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Écran (display), tactile (touchscreen), substitutions, broches et autres détails de l'appareil. Le nom, le Wi-Fi, l'API, l'OTA et les liens vers les paquets restent gérés automatiquement."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Actif"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Prêt à être rattaché"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"YAML personnalisé local"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Utiliser l'exemple"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Effacer"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" caractère"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" caractères"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ligne"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" lignes"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer et vérifier"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer le YAML personnalisé"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Aucun profil ESPHome n'a été trouvé pour cet écran."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Les modifications faites ici s'appliquent à la prochaine compilation."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrez une fois pour rattacher ce fichier au profil."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Vérification et enregistrement…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. Le YAML personnalisé est conservé lors des mises à jour du firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML personnalisé enregistré."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. ESPHome vérifie le profil complet…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome vérifie le profil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome vérifie le profil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Le profil complet est valide. Vous pouvez compiler et installer sans risque."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome a refusé le profil complet. Consultez Firmware et USB pour le journal complet."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Remplacer le texte actuel par l'exemple ?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Exemple chargé. Enregistrez-le quand vous le souhaitez."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Effacer le YAML personnalisé local ?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Le YAML personnalisé sera vide après l'enregistrement."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Accueil"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Inconnu"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Indisponible"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Éteint"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Chauffage"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Climatisation"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Chauffage/Climatisation"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Déshumidification"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Ventilation uniquement"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Chauffe"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Rafraîchit"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactif"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Éteint"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Déshumidifie"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventile"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Préchauffage"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Dégivrage"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Ouverture"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Fermeture"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Lecture en cours"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"En pause"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactif"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"En veille"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Maison"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Absent"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Au-dessus de l'horizon"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Sous l'horizon"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"À la station d'accueil"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Nettoyage"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"En pause"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Retour à la station d'accueil"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactif"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Ensoleillé"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Nuit dégagée"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Nuageux"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Éclaircies"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Pluvieux"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Averses"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Neigeux"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Neigeux, pluvieux"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Brouillard"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Grêle"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Orage"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Orage / Pluie"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Venteux"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Exceptionnel"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Faible"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"En charge"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Pas en charge"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Froid"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Connecté"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Déconnecté"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Chaud"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Lumière détectée"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Pas de lumière"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Déverrouillé"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Verrouillé"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Humide"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Sec"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"En mouvement"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Immobile"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Branché"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Débranché"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Maison"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Absent"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problème"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"En cours"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Arrêté"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Dangereux"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Sûr"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Détectée"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détectée"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Manipulation détectée"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détectée"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Mise à jour disponible"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"À jour"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Détectée"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détectée"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Activer"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Exécuter"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Appuyer"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Faible"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Moyenne"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Élevée"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Milieu"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Focalisée"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffuse"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Haute"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Les deux"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Verticale"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontale"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"À l'instant"}},minutes_ago:{t:0,b:{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" min"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" heure"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" heures"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Hier"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" jour"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" jours"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" semaine"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" semaines"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" mois"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" mois"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" an"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" ans"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" heure"}]},{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" heures"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Demain"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" jour"}]},{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" jours"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"dimanche"}},{t:0,b:{t:2,i:[{t:3}],s:"lundi"}},{t:0,b:{t:2,i:[{t:3}],s:"mardi"}},{t:0,b:{t:2,i:[{t:3}],s:"mercredi"}},{t:0,b:{t:2,i:[{t:3}],s:"jeudi"}},{t:0,b:{t:2,i:[{t:3}],s:"vendredi"}},{t:0,b:{t:2,i:[{t:3}],s:"samedi"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"dim."}},{t:0,b:{t:2,i:[{t:3}],s:"lun."}},{t:0,b:{t:2,i:[{t:3}],s:"mar."}},{t:0,b:{t:2,i:[{t:3}],s:"mer."}},{t:0,b:{t:2,i:[{t:3}],s:"jeu."}},{t:0,b:{t:2,i:[{t:3}],s:"ven."}},{t:0,b:{t:2,i:[{t:3}],s:"sam."}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"di"}},{t:0,b:{t:2,i:[{t:3}],s:"lu"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"me"}},{t:0,b:{t:2,i:[{t:3}],s:"je"}},{t:0,b:{t:2,i:[{t:3}],s:"ve"}},{t:0,b:{t:2,i:[{t:3}],s:"sa"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"janvier"}},{t:0,b:{t:2,i:[{t:3}],s:"février"}},{t:0,b:{t:2,i:[{t:3}],s:"mars"}},{t:0,b:{t:2,i:[{t:3}],s:"avril"}},{t:0,b:{t:2,i:[{t:3}],s:"mai"}},{t:0,b:{t:2,i:[{t:3}],s:"juin"}},{t:0,b:{t:2,i:[{t:3}],s:"juillet"}},{t:0,b:{t:2,i:[{t:3}],s:"août"}},{t:0,b:{t:2,i:[{t:3}],s:"septembre"}},{t:0,b:{t:2,i:[{t:3}],s:"octobre"}},{t:0,b:{t:2,i:[{t:3}],s:"novembre"}},{t:0,b:{t:2,i:[{t:3}],s:"décembre"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"janv."}},{t:0,b:{t:2,i:[{t:3}],s:"févr."}},{t:0,b:{t:2,i:[{t:3}],s:"mars"}},{t:0,b:{t:2,i:[{t:3}],s:"avr."}},{t:0,b:{t:2,i:[{t:3}],s:"mai"}},{t:0,b:{t:2,i:[{t:3}],s:"juin"}},{t:0,b:{t:2,i:[{t:3}],s:"juil."}},{t:0,b:{t:2,i:[{t:3}],s:"août"}},{t:0,b:{t:2,i:[{t:3}],s:"sept."}},{t:0,b:{t:2,i:[{t:3}],s:"oct."}},{t:0,b:{t:2,i:[{t:3}],s:"nov."}},{t:0,b:{t:2,i:[{t:3}],s:"déc."}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:" "}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"1"}},percent:{t:0,b:{t:2,i:[{t:3}],s:" %"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Page "},{t:4,k:"n"}]}}}}};export{t as default}; +const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Annuler"}},online:{t:0,b:{t:2,i:[{t:3}],s:"En ligne"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Hors ligne"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"inconnu"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Modifications non enregistrées"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Annuler"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Ouvrir Appareils et services"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer et envoyer"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrement…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Lire les données actuelles"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" résultat. Continuez la saisie pour affiner la liste."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" résultats. Continuez la saisie pour affiner la liste."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Fermer"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Retirer"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Modifier"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Chargement…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Retour"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copier"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nouvel écran"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware et USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alertes"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Paramètres"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Connecter et installer"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Cela n'a pas fonctionné. Actualisez la page et réessayez."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Clé API copiée."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"La clé API est sélectionnée. Copiez-la avec Ctrl+C ou Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON de la mise en page copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le JSON de la mise en page est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nom de l'action copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le nom de l'action est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le YAML est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nom de l'icône copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le nom de l'icône est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Couleur vide copiée."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"La couleur vide est sélectionnée. Copiez-la avec Ctrl+C ou Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nom de la couleur copié."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Le nom de la couleur est sélectionné. Copiez-le avec Ctrl+C ou Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Page de gestion injoignable · nouvelle tentative…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant connecté"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Reconnexion à Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Écrans"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Plus"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Actualiser"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Mise à jour"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"En attente de mise à jour"}},available:{t:0,b:{t:2,i:[{t:3,v:"Mise à jour "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Aucun profil ESPHome trouvé avec ce nom d'appareil."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Nouveautés"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Journal complet"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"L'adresse IP, une seule fois ; le nouveau firmware la communique ensuite lui-même."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Adresse IP, p. ex. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Adresse IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Démarrer"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Installé, mais pas encore dans Home Assistant. Ajoutez l'appareil ESPHome découvert dans Paramètres → Appareils et services, collez-y la clé API, puis activez « Autoriser l'appareil à effectuer des actions Home Assistant » sous Configurer."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware téléchargé, pas encore dans Home Assistant. Installez-le sur l'écran avec ESPHome Web, puis ajoutez l'appareil ESPHome découvert dans Paramètres → Appareils et services, collez-y la clé API et autorisez les actions Home Assistant sous Configurer."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Pas encore dans Home Assistant. Firmware déjà installé ? Ajoutez l'appareil ESPHome dans Paramètres → Appareils et services, puis autorisez les actions Home Assistant sous Configurer. Pas encore installé ? Firmware et USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copier la clé API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Écrans"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter à cet écran"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Aide-mémoire et alerte de test"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Mises à jour, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Rien à enregistrer"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifier cet écran"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Fait clignoter le rétroéclairage et affiche une carte"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Nécessite un firmware plus récent"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exporter la mise en page"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Télécharger et copier en JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher des écrans, entités, actions…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Aucun résultat. Saisissez une partie du nom d'un écran, d'une entité ou d'une action."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez un écran"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez un de vos écrans à gauche pour modifier ses tuiles, sa barre supérieure et ses paramètres."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Commencez par un écran"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Branchez un CYD ou un Guition en USB sur votre machine Home Assistant. Le profil, le firmware et la première installation se font en une seule fois."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Installer un nouvel écran"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Vous avez des modifications non enregistrées. Ouvrir quand même un autre écran ?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Remplacer la mise en page non enregistrée par une copie de celle de l'autre écran ?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Remplacer la mise en page non enregistrée par celle importée ?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. Votre écran est en cours de mise à jour."}},other:{t:0,b:{t:2,i:[{t:3,v:"Enregistré. "},{t:4,k:"name"},{t:3,v:" est en cours de mise à jour."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. L'écran est en cours de mise à jour."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. Votre dernière modification n'est pas encore envoyée : appuyez à nouveau sur Enregistrer et envoyer."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" clignote et affiche une carte pendant quelques secondes."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Hors ligne · modifications enregistrées"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Mise en page"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Paramètres de l'écran"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré · envoyé à l'écran"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Tout est enregistré"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Plus"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifier"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"faire clignoter l'écran"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Nécessite le firmware 0.2.31 ou plus récent"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"depuis Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copier la mise en page de…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" écran"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" écrans"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"aucun autre écran"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" tuile"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" tuiles"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exporter la mise en page"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importer une mise en page…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML personnalisé"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"avancé"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Aucun profil ESPHome trouvé pour cet écran"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour le firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Tuile retirée : "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Il n'y a pas de place pour cette tuile sur la page "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Aucune page n'est libre pour une tuile pleine page. Libérez d'abord une page."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Cet écran a déjà une tuile qui mène à la page "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Mise en page de "},{t:4,k:"name"},{t:3,v:" copiée. Appuyez sur Enregistrer et envoyer quand elle vous convient."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Mise en page de "},{t:4,k:"name"},{t:3,v:" copiée. Tuiles compatibles avec le firmware de cet écran : "},{t:4,k:"kept"},{t:3,v:" sur "},{t:4,k:"total"},{t:3,v:". Appuyez sur Enregistrer et envoyer quand elle vous convient."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Mise en page importée. Appuyez sur Enregistrer et envoyer quand elle vous convient."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Mise en page importée. Tuiles compatibles avec le firmware de cet écran : "},{t:4,k:"kept"},{t:3,v:" sur "},{t:4,k:"total"},{t:3,v:". Appuyez sur Enregistrer et envoyer quand elle vous convient."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Ce n'est pas du JSON. Exportez d'abord une mise en page, ou collez-en une d'un autre ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Aucune tuile dans ce fichier. Une mise en page exportée depuis ESP Screens était attendue."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" page · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tuiles"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pages · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tuiles"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Ajoutez votre première lumière, scène ou appareil depuis la bibliothèque."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Appuyez sur la barre supérieure ou sur une tuile pour la modifier. Faites glisser pour déplacer ; déposez sur la page suivante pour en créer une nouvelle."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Les emplacements vides et les positions fixes fonctionnent à partir du firmware 0.2.26. D'ici cette mise à jour, cet écran (firmware "},{t:4,k:"firmware"},{t:3,v:") décale les tuiles vers le premier emplacement libre."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Mise en page de l'écran"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Ajouter une page"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" page au maximum"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pages au maximum"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Page "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Supprimer la page"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Les pages suivantes remontent d'un rang"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Modifier la barre supérieure"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Emplacement vide. Cliquez pour ajouter une tuile ici, ou faites-en glisser une."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Emplacement vide "},{t:4,k:"slot"},{t:3,v:" sur la page "},{t:4,k:"page"},{t:3,v:" : ajouter la prochaine tuile ici"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"La prochaine tuile va ici"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Vide"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bibliothèque"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entité"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entités"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher par nom, appareil ou pièce…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter une entité"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Tout"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Lumières"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatisation"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interrupteurs"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"État"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilateurs"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Ouvertures"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scènes"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirateurs"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Capteurs"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Médias"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Météo"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valeurs"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Sélecteurs"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personnes"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Minuteurs"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Écran"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Pièce"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Toutes les pièces"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Masquer celles déjà placées"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Masquer ce qui est déjà sur cet écran"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Tout ce qui est ici est déjà sur cet écran."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Aucune entité trouvée. Essayez un autre nom, une autre pièce ou un autre filtre."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Cet écran peut contenir "},{t:4,k:"n"},{t:3,v:" tuile."}]},{t:2,i:[{t:3,v:"Cet écran peut contenir "},{t:4,k:"n"},{t:3,v:" tuiles."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Cet écran peut contenir "},{t:4,k:"n"},{t:3,v:" tuile ; mettez à jour son firmware pour en avoir 48."}]},{t:2,i:[{t:3,v:"Cet écran peut contenir "},{t:4,k:"n"},{t:3,v:" tuiles ; mettez à jour son firmware pour en avoir 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Faites glisser sur une page, ou appuyez sur + pour ajouter au premier emplacement libre. ⌘K recherche partout."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Lumière"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatisation"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirateur"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilateur"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Ouverture"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Média"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Capteur"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"État"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interrupteur"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Interrupteur"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scène"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Météo"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valeur"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Valeur"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Sélecteur"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Sélecteur"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Écran"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Soleil"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Minuteur"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personne"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Caméra"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Image"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entité"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"grande valeur"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"prévisions météo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"graphique"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"horloge numérique"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"horloge analogique"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"course du soleil"}},live:{t:0,b:{t:2,i:[{t:3}],s:"image en direct"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"pochette"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normale"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"double"}},full:{t:0,b:{t:2,i:[{t:3}],s:"pleine page"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nom sur l'écran"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatique (depuis Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatique (par défaut)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"L'écran affiche l'icône choisie à partir du firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mène à la page"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (vide)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Les tuiles de navigation nécessitent le firmware 0.2.62 : appuyez d'abord sur Mettre à jour pour cet écran."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Cet écran n'a pas de page "},{t:4,k:"page"},{t:3,v:" : toucher la tuile ouvre donc sa dernière page. Choisissez une autre page."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Toucher la tuile ouvre cette page."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Affichage"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Horloge numérique"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Horloge analogique"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nom et état"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Grande valeur"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Prévisions météo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Graphique"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Course du soleil"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Image en direct"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Une petite image de la caméra à la place de l'icône, rafraîchie au rythme ci-dessous tant que la page est affichée. Un appui l'ouvre toujours en plein écran."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Une image en direct demande le firmware 0.2.77 ou plus récent : appuyez sur Mettre à jour sur l'écran après l'enregistrement."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Pochette"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"La pochette de ce qui joue à la place de l'icône, comme la tuile de Home Assistant ; un lecteur sans image garde son icône. Un appui ouvre toujours la carte."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La pochette sur la tuile demande le firmware 0.2.78 ou plus récent : appuyez sur Mettre à jour sur l'écran après l'enregistrement."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant n'a pas de valeurs numériques pour cette entité : le graphique reste donc vide. Choisissez un autre affichage."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Ce service météo n'a pas de prévisions journalières dans Home Assistant. Choisissez un autre affichage."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Rafraîchir"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Toutes les "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Taille"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Double largeur"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Pleine page"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Pleine page : un grand bouton dans la couleur de la tuile ; un curseur, des commandes ou un graphique se placent en bas."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Une tuile pleine page nécessite le firmware 0.2.62 : appuyez d'abord sur Mettre à jour pour cet écran."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Page"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nouvelle page"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Commande directe sur la tuile"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ne propose pas cette commande pour cette entité : elle reste donc vide sur l'écran. Choisissez-en une autre."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"En bas de la tuile pleine page ; toucher ailleurs agit comme réglé ci-dessous."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"À droite de la tuile double largeur, comme les lignes dans Home Assistant. Toucher le nom agit comme réglé ci-dessous."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"L'écran affiche la commande directe à partir du firmware 0.2.19 ; d'ici là, la tuile reste comme avant."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Au toucher"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatique"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Ouvrir les commandes"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Affichage seul"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Allumer / éteindre"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Effectuer une action"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ne peut pas allumer ni éteindre ceci : toucher la tuile ne fait donc rien. Choisissez une autre option."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"L'écran allume et éteint ceci à partir du firmware 0.2.58 : appuyez sur Mettre à jour pour cet écran. D'ici là, toucher la tuile ouvre sa carte."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Maintenez le doigt sur la tuile pour ouvrir sa carte."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Petit curseur sur la tuile"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Non"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Oui, commande directe"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant n'a rien qu'un curseur puisse régler pour cette entité. Choisissez Non."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Historique"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" heure"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" heures"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Fond pastel"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Fond : "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", emplacement "},{t:4,k:"slot"},{t:3,v:" de la page "},{t:4,k:"page"},{t:3,v:". Enter : configurer, touches fléchées : déplacer"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Retirer la tuile"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Retirer "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Récupération auprès de Home Assistant des actions de cette entité…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ne répond pas pour le moment. Réessayez dans un instant."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez une action"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher, par exemple allumer, position ou lecture"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher une action"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Aucune action trouvée."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant ne propose plus cette action pour cette entité : toucher la tuile ne fait donc rien. Choisissez-en une autre."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (facultatif)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Non défini"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant a besoin de : "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"L'écran effectue une action à partir du firmware 0.2.58 : appuyez sur Mettre à jour pour cet écran. D'ici là, toucher la tuile agit comme Automatique."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icône"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Aucune icône"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher, par exemple lampe, musique ou porte"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher une icône"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Aucune icône, texte seul"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icône : "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Aucune icône trouvée."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Données actuelles"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Connexion, état et propriétés prises en charge"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Lecture…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Récupération de l'état actuel dans HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"État : "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Petit curseur : "},{t:4,k:"slider"},{t:3,v:" · Affichage : "},{t:4,k:"display"},{t:3,v:" · Taille : "},{t:4,k:"size"},{t:3,v:" · Commande : "},{t:4,k:"control"},{t:3,v:" · Fond : "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"oui"}},no:{t:0,b:{t:2,i:[{t:3}],s:"non"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"aucune"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Par défaut"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Relire"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Retiré de la barre supérieure : "},{t:4,k:"name"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"La barre supérieure a de la place pour "},{t:4,k:"n"},{t:3,v:" élément."}]},{t:2,i:[{t:3,v:"La barre supérieure a de la place pour "},{t:4,k:"n"},{t:3,v:" éléments."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"C'est déjà dans la barre supérieure."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Barre supérieure"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Barre supérieure : "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Fourni par l'écran lui-même, fonctionne aussi sans Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" sur "},{t:4,k:"n"},{t:3,v:" élément"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" sur "},{t:4,k:"n"},{t:3,v:" éléments"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Gauche : nom"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Par exemple : Salon"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Droite : heure, capteurs ou horloge"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", emplacement "},{t:4,k:"slot"},{t:3,v:". Enter : configurer, flèches : déplacer"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Retirer "},{t:4,k:"name"},{t:3,v:" de la barre supérieure"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" élément au maximum"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" éléments au maximum"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter l'heure, la date, l'horloge analogique ou une entité"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Ajouter l'heure, la date ou une entité"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Tout ne tient pas à côté du nom : l'écran laisse de côté les éléments en pointillés. Retirez-en un ou choisissez un nom plus court."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Faites glisser pour réorganiser ; appuyez sur un élément pour le configurer."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Les capteurs, la date et l'horloge analogique apparaissent à partir du firmware "},{t:4,k:"version"},{t:3,v:" ; d'ici cette mise à jour, cet écran affiche le nom et, si l'heure est dans la barre, l'horloge."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Masqué : pas actif en ce moment"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Ne tient pas à côté du nom"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Cadran"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Masqué en ce moment : pas actif"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Ne tient pas à côté du nom pour l'instant"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Aperçu sur l'écran"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Petit cadran avec l'heure"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Contenu affiché"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"« Dernière modification » continue de compter sur l'écran lui-même : « À l'instant », « Il y a 5 min », « Hier »."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatique (comme Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Afficher"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"« Seulement si actif » masque l'élément tant qu'il est éteint, fermé, absent ou à 0. Pratique pour une porte ouverte, un lave-linge en marche ou pour savoir qui est à la maison."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Horloge 24 heures · à modifier dans "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Horloge 12 heures · à modifier dans "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Paramètres → Langue et région"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Aujourd'hui : "},{t:4,k:"date"},{t:3,v:". La date suit l'horloge propre à l'écran."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Monter"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Descendre"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter à la barre supérieure"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" sur "},{t:4,k:"n"},{t:3,v:" emplacement utilisé"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" sur "},{t:4,k:"n"},{t:3,v:" emplacements utilisés"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Fourni par l'écran lui-même"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Déjà ajouté"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Suggestions de Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Une entité"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher par nom, pièce ou entité, p. ex. température ou porte"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher une entité pour la barre supérieure"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Aucune entité trouvée."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosité"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Nuit"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Écran"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosité"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Mode sombre"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Veille auto"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Veille après"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosité en veille"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Mode nuit"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Début"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Fin"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosité de nuit"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Retour à la page 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Après"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Aussi en veille"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Balayer entre les pages"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Boutons de page"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotation"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Les paramètres de l'autre écran sont encore en cours d'enregistrement. Réessayez dans un instant."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Les boutons de page et le balayage sont désactivés : seules les tuiles « Aller à la page » changent de page."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"la page "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"les pages "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuile « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuiles « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuile « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:", mais aucune vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas l'atteindre."}]},{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuiles « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:", mais aucune vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas l'atteindre."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuile « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:", mais aucune vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas les atteindre."}]},{t:2,i:[{t:3,v:"Vous avez "},{t:4,k:"n"},{t:3,v:" tuiles « Aller à la page », vers "},{t:4,k:"targets"},{t:3,v:", mais aucune vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas les atteindre."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Vous n'avez aucune tuile « Aller à la page »."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Vous n'avez aucune tuile « Aller à la page » vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas l'atteindre."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Vous n'avez aucune tuile « Aller à la page » vers "},{t:4,k:"missing"},{t:3,v:" : vous ne pouvez donc pas les atteindre."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Les tuiles vers "},{t:4,k:"pages"},{t:3,v:" se trouvent uniquement sur des pages que vous ne pouvez pas atteindre."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Depuis "},{t:4,k:"pages"},{t:3,v:", aucune tuile ne ramène à la page 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Cet écran est hors ligne. Ses paramètres pourront être modifiés à son retour."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Les modifications s'appliquent tout de suite sur l'écran, et celles faites sur l'écran s'affichent ici."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Les modifications s'appliquent tout de suite. À partir du firmware 0.2.49, l'écran les conserve lui-même."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Cette entité est désactivée dans Home Assistant, ou l'écran redémarre."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" : diminuer"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" : augmenter"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Démarrage de la mise à jour…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilation du firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Écriture du firmware via le Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Compilation et installation…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"En attente du retour de l'écran…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Vérification de la stabilité…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Nouvelle langue : "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Les écrans se mettront désormais à jour automatiquement la nuit."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Les mises à jour automatiques sont désactivées."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Mises à jour du firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Mise à jour vers le firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Aucun écran associé pour l'instant. Les nouveaux écrans reçoivent le firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Le firmware "},{t:4,k:"version"},{t:3,v:" est disponible pour "},{t:4,k:"n"},{t:3,v:" écran."}]},{t:2,i:[{t:3,v:"Le firmware "},{t:4,k:"version"},{t:3,v:" est disponible pour "},{t:4,k:"n"},{t:3,v:" écrans."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Tous les écrans ont le firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Mettre à jour "},{t:4,k:"n"},{t:3,v:" écran"}]},{t:2,i:[{t:3,v:"Mettre à jour les "},{t:4,k:"n"},{t:3,v:" écrans"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Nouveautés du firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour automatiquement chaque nuit"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Entre 03:00 et 06:00, un écran à la fois. S'arrête en cas d'erreur et la signale dans Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Compétence installée. Claude Code la prend en compte tout de suite."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Compétence installée. Redémarrez Claude Code une fois pour qu'il trouve le nouveau dossier de compétences."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Apprenez ESP Screens à Claude, puis demandez-lui : « Affiche une alerte sur tous mes écrans quand la boîte aux lettres est pleine. » Claude connaît les événements d'alerte, chaque champ, chaque couleur et chaque icône."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installer pour Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Réinstaller"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Mettre à jour la compétence"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Non installée"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Installée"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Installée · une version plus récente est prête"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Pour Claude Code dans Home Assistant. Écrit un fichier dans "},{t:4,k:"path"},{t:3,v:" ; une nouvelle installation le remplace."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Télécharger pour claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Importez le zip dans Claude sous Personnaliser → Compétences."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tout ce qui entoure vos écrans."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Mes écrans"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Écrans"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Ajoutez un écran, ou compilez et réinstallez le firmware d'un écran que vous avez déjà."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Compiler et installer via USB ou Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Langue et région"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Langue des écrans"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Langue de Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Langue de Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Les écrans utilisent l'anglais tant que la langue de Home Assistant n'est pas disponible."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · pas encore vérifié, aide bienvenue"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" n'est pas encore vérifié, votre aide est la bienvenue : "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"comment traduire"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Après un changement, chaque écran a besoin d'une mise à jour du firmware, soit une compilation par écran : avec son bouton Mettre à jour, ou lors des mises à jour nocturnes."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Format de l'heure"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatique, selon la langue ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 heures"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 heures"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Format de nombre"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatique, selon la langue ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Votre profil Home Assistant : "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Utiliser ceux-ci"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"L'éditeur suit la langue de votre profil Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. Chaque écran passe à la nouvelle langue lors de sa prochaine mise à jour."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Une carte sur tout l'écran, déclenchée par une automatisation, sur un écran ou sur tous. L'aide-mémoire donne les noms des actions, les champs, les icônes et les couleurs, avec un formulaire pour en essayer une."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Notifications plein écran, depuis une automatisation"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Compiler et installer le firmware des écrans"}},intro:{t:0,b:{t:2,i:[{t:3,v:"La CLI ESPHome intégrée utilise votre propre profil (YAML avec les clés) et vos secrets. Choisissez le profil de l'écran, puis un port USB (écran branché sur la machine Home Assistant), "},{t:4,k:"ota"},{t:3,v:" avec le nom d'hôte, ou "},{t:4,k:"download"},{t:3,v:" pour installer le firmware sur l'écran depuis votre propre ordinateur. "},{t:4,k:"check"},{t:3,v:" ne fait que valider, "},{t:4,k:"build"},{t:3,v:" compile, "},{t:4,k:"install"},{t:3,v:" installe le firmware sur l'écran. Vos tuiles restent telles quelles dans ESP Screens. La première compilation prend quelques minutes."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Télécharger"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Vérifier"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Compiler seulement"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Compiler et installer"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Compiler et télécharger"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"La CLI ESPHome est absente. Mettez à jour l'application vers la version 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez le profil voulu, puis un port USB, une adresse IP ou Télécharger."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Profil ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Installer sur"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · aucun écran détecté pour l'instant sur la machine Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Télécharger · installer depuis votre propre ordinateur"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Adresse IP ou nom d'hôte"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Télécharger "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Installez-le sur l'écran avec "},{t:4,k:"esphome_web"},{t:3,v:" dans Chrome ou Edge : Connect, choisissez le port USB de l'écran, Install, puis sélectionnez ce fichier. Il contient votre mot de passe Wi-Fi et les clés de l'écran : gardez-le pour vous."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Connecter et installer."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profil enregistré."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Un instant…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Prêt à télécharger."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Terminé."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Cela n'a pas fonctionné."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens crée le profil propre à l'écran, avec des clés uniques, et compile le firmware. Branchez l'écran avec un câble USB de données sur la machine qui fait tourner Home Assistant, ou téléchargez le firmware et installez-le sur l'écran depuis votre propre ordinateur."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Quel écran avez-vous ?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 pouces"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 pouces"}},board_elecrow:{t:0,b:{t:2,i:[{t:3}],s:"Elecrow CrowPanel · 7 pouces"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nom"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Écran du salon"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nom de l'appareil"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"personnaliser"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Chaque écran reçoit son propre profil avec ses propres clés. Quatre écrans ? Refaites ces étapes quatre fois avec un nom différent."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Lettres minuscules, chiffres et tirets. Un nom différent pour chaque écran."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nom du Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Mot de passe Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"À remplir une seule fois : ESP Screens l'enregistre dans le secrets.yaml d'ESPHome, et les écrans suivants l'utilisent automatiquement."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Il manque encore les informations Wi-Fi dans votre secrets.yaml d'ESPHome. ESP Screens ne remplit que les lignes manquantes."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Le Wi-Fi vient de votre secrets.yaml d'ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Le secrets.yaml du dossier ESPHome n'est pas un YAML valide. Corrigez d'abord le fichier ; il ne sera pas écrasé."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Installer via"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Plus tard · enregistrer seulement le profil"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Branchez l'écran avec un câble USB de données sur la machine Home Assistant ; la liste s'actualise d'elle-même. Ou choisissez Télécharger pour utiliser votre propre ordinateur."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Téléchargez le firmware et installez-le sur l'écran depuis votre propre ordinateur, dans Chrome ou Edge. Ensuite, les mises à jour passent par le Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Le profil va dans le dossier ESPHome. Vous pourrez l'installer plus tard via Firmware et USB, ou depuis ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Plusieurs écrans sont branchés : choisissez le port de cet écran."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Une seule fois en USB ; ensuite, tout se fait sans fil."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installer"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer le profil"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Une compilation ou une installation est déjà en cours ("},{t:4,k:"file"},{t:3,v:"). Attendez qu'elle se termine."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"La CLI ESPHome est absente de cette installation ; seul l'enregistrement du profil est possible."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" est dans le dossier ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Écriture du firmware sur "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilation du firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Le firmware pour "},{t:4,k:"name"},{t:3,v:" est prêt"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Le firmware est sur "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Échec de la compilation"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Échec de l'installation"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Installez-le plus tard depuis Firmware et USB : choisissez ce profil, puis le port USB de la machine Home Assistant, ou Télécharger pour installer le firmware sur l'écran depuis votre propre ordinateur. Conservez la clé API pour l'association :"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Ne débranchez pas encore le câble USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Une première compilation prend quelques minutes sur un Raspberry Pi. Vous pouvez quitter cette page : l'installation continue et vous la retrouverez sous Nouvel écran."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Une première compilation prend quelques minutes sur un Raspberry Pi. Vous pouvez quitter cette page : la compilation continue et vous la retrouverez sous Nouvel écran."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Installez-le sur l'écran depuis votre propre ordinateur, puis associez l'écran à Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"L'écran démarre et se connecte à votre Wi-Fi. Associez-le maintenant à Home Assistant :"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"L'écran démarre et se connecte à votre Wi-Fi. Le CYD demande d'abord un étalonnage tactile : touchez les croix. Associez-le maintenant à Home Assistant :"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Voir le journal ci-dessous."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" avec un câble USB de données."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Branchez l'écran sur votre ordinateur"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" dans Chrome ou Edge, cliquez sur Connect et choisissez le port USB de l'écran."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Ouvrez "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" et sélectionnez "},{t:4,k:"file"},{t:3,v:". L'écran redémarre et rejoint votre Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" et sélectionnez "},{t:4,k:"file"},{t:3,v:". L'écran redémarre et rejoint votre Wi-Fi. Le CYD demande d'abord un étalonnage tactile : touchez les croix."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Cliquez sur Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Le fichier contient votre mot de passe Wi-Fi et les clés de l'écran : gardez-le pour vous."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Clé API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Cela se passe en dehors d'ESP Screens. Home Assistant découvre "},{t:4,k:"name"},{t:3,v:" comme appareil ESPHome ; cliquez sur Ajouter. Pas découvert ? Ajoutez ESPHome manuellement avec l'adresse IP de l'écran."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Allez dans Home Assistant → Paramètres → Appareils et services."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ci-dessus quand Home Assistant demande une clé de chiffrement."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Collez la clé API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" intégration ESPHome → Configurer → « Autoriser l'appareil à effectuer des actions Home Assistant ». Sans cela, l'écran voit tout mais ne commande rien."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Autorisez les actions HA :"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" De retour dans ESP Screens, l'écran apparaît dans la liste à gauche en une trentaine de secondes ; d'ici là, il y figure comme « pas encore dans Home Assistant »."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Choisissez vos tuiles."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Journal ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Réessayer"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Installer un autre écran"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Recommencer"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Terminé"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alertes · aide-mémoire"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Une notification plein écran, depuis une automatisation."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Chaque écran a l'action "},{t:4,k:"action"},{t:3,v:". Elle place une carte par-dessus tout, réveille l'écran et garde le rétroéclairage à luminosité normale jusqu'à ce que quelqu'un touche le bouton ou que le délai expire. Home Assistant n'affiche lui-même ni explication ni listes déroulantes pour les actions ESPHome ; tout ce que vous pouvez remplir est listé ici."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"L'aide-mémoire est encore en cours de chargement ; un instant."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Quelqu'un est à la porte"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Porte 3, arrière"}},button:{t:0,b:{t:2,i:[{t:3}],s:"J'arrive"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Sections"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Essayer"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Vos écrans"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"Dans une automatisation"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Tous les écrans"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Les champs"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Icônes"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Couleurs"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Comportement"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Événements"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Astuces"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Envoyez une alerte maintenant, avec les mêmes champs qu'une automatisation. L'écran affiche la carte et, si le clignotement est activé, fait clignoter son rétroéclairage."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Écran"}},all:{t:0,b:{t:2,i:[{t:3,v:"Tous les écrans (prêts : "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · pas prêt"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Titre"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Sous-titre"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icône"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Couleur"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Texte du bouton"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Délai (secondes, 0 attend le bouton)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Faire clignoter le rétroéclairage"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Quatre fois à l'arrivée de l'alerte."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Envoi…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Envoyer l'alerte"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Envoyée à "},{t:4,k:"n"},{t:3,v:" écran."}]},{t:2,i:[{t:3,v:"Envoyée à "},{t:4,k:"n"},{t:3,v:" écrans."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Envoyée à "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Envoyée à l'écran."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" écran ignoré (hors ligne ou firmware trop ancien)."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" écrans ignorés (hors ligne ou firmware trop ancien)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Champs laissés vides : "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Aucun écran n'a pu l'afficher : vérifiez qu'un écran est en ligne avec le firmware "},{t:4,k:"version"},{t:3,v:" ou plus récent."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Blanc (par défaut)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Chaque écran a sa propre action, qui contient le nom de l'appareil. À partir du firmware "},{t:4,k:"version"},{t:3,v:" ; mettez à jour un écran plus ancien avec son bouton Mettre à jour, sous Écrans."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Aucun écran associé pour l'instant. Installez-en un via Nouvel écran ; l'action apparaît dès que Home Assistant voit l'écran."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Mise à jour nécessaire · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nom d'appareil inconnu · mettez à jour l'écran"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Afficher l'alerte"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Fermer l'alerte"}}},howto:{add:{t:0,b:{t:2,i:[{t:4,k:"add"},{t:3,v:" et recherchez "},{t:4,k:"esphome"},{t:3,v:". Choisissez l'action de votre écran : Home Assistant l'appelle « Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:" »."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ajouter une action"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nom de l'appareil"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant les demande tous les sept ; laissez vide ce que vous n'utilisez pas ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", désactivé)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Remplissez les champs."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Vous préférez le YAML ? Choisissez "},{t:4,k:"edit"},{t:3,v:" sur l'action et collez l'exemple ci-dessous."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Exemple pour"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"un écran (pas encore associé)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Modifier en YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copier le YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Tous les écrans à la fois"}},text:{t:0,b:{t:2,i:[{t:3,v:"Déclenchez l'événement "},{t:4,k:"show"},{t:3,v:" avec les mêmes champs, et ESP Screens transmet l'alerte à chaque écran en ligne, y compris ceux que vous ajouterez plus tard. "},{t:4,k:"dismiss"},{t:3,v:" la retire partout. Dans une automatisation, ajoutez l'action "},{t:4,k:"event"},{t:3,v:" ou collez l'exemple sous "},{t:4,k:"edit"},{t:3,v:". Omettez les champs que vous n'utilisez pas. ESP Screens doit être en marche pour cela."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Déclencher un événement manuel"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Le texte est libre ; la limite est en octets, et une lettre accentuée compte pour deux. Ce qui ne tient pas se termine par des points de suspension (titre) ou est coupé (sous-titre)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Champ"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Type"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Ce qu'il fait"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Exemple"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limite"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"texte"}},int:{t:0,b:{t:2,i:[{t:3}],s:"nombre"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"activé / désactivé"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entité"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" octets"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"0 à 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Indiquez le nom dans "},{t:4,k:"field"},{t:3,v:", par exemple "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" et le code hexadécimal ("},{t:4,k:"hex"},{t:3,v:") fonctionnent aussi. Seules ces icônes sont incluses dans le firmware ; tout autre nom affiche le triangle d'avertissement. Appuyez sur une icône pour copier son nom."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Pratiques pour les notifications"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher une icône"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Rechercher par nom ou description…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Également disponibles : icônes de commande et de météo"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copier "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Aucune icône pour « "},{t:4,k:"query"},{t:3,v:" ». Les noms inconnus affichent le triangle d'avertissement ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Indiquez le nom dans "},{t:4,k:"field"},{t:3,v:". Ce sont les teintes pastel des tuiles, avec un texte foncé. Un nom vide ou inconnu donne la carte blanche. Appuyez pour copier."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Une alerte réveille immédiatement un écran assombri ou éteint et s'affiche par-dessus chaque page, chaque carte de lumière ouverte et la couche de veille."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Réveille l'écran."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Tant que la carte est affichée, le rétroéclairage reste à luminosité normale. La veille et les heures de nuit attendent. Après le bouton, le délai de veille habituel recommence."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Allumé jusqu'au bouton."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" attend le bouton, aussi longtemps qu'il le faut. Avec "},{t:4,k:"minute"},{t:3,v:", la carte disparaît au bout d'une minute, mais le bouton la ferme plus tôt."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Délai."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" fait clignoter le rétroéclairage quatre fois à l'arrivée de l'alerte (environ une seconde), puis laisse l'écran allumé."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Clignotement."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Une nouvelle alerte remplace l'actuelle ; il n'y a pas de pile. L'alerte remplacée se signale comme "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Remplacement."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" retire la carte, par exemple si la porte est déjà ouverte. Sans alerte, cette action ne fait rien."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fermeture à distance."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ne fait rien ; seul le bouton la ferme. Ainsi, toucher l'écran pour le réveiller ne ferme jamais l'alerte par accident."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Toucher à côté de la carte"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Chaque fin d'alerte déclenche l'événement "},{t:4,k:"event"},{t:3,v:" avec "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (le nom de l'appareil) et le "},{t:4,k:"device_id"},{t:3,v:" qu'ajoute Home Assistant. Visible dans Paramètres → Outils → Événements."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Quand"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Attendre que quelqu'un appuie sur le bouton"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Utilisez une "},{t:4,k:"bold"},{t:3,v:" : orange pour la porte, rouge pour la fumée ou l'eau, vert pour « terminé ». Le texte reste toujours foncé et lisible."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"couleur par type de notification"}},short:{t:0,b:{t:2,i:[{t:3,v:"Gardez un titre "},{t:4,k:"bold"},{t:3,v:" ; un écran affiche une vingtaine de caractères sur une ligne et termine un titre plus long par des points de suspension. Mettez les détails dans le sous-titre."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"court"}},button:{t:0,b:{t:2,i:[{t:3,v:"Un "},{t:4,k:"bold"},{t:3,v:" transforme la notification en question : « J'arrive », « Vu », « Éteindre ». L'événement vous dit alors qui a répondu."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"texte de bouton personnalisé"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Pour une alerte qui se règle d'elle-même (la porte s'ouvre, le linge est sorti), fermez-la dans la même automatisation avec "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Tous les écrans ? Déclenchez "},{t:4,k:"event"},{t:3,v:" une seule fois (voir Tous les écrans à la fois). Les écrans restent indépendants et chacun répond avec son propre "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Vous préférez "},{t:4,k:"bold"},{t:3,v:" pour l'automatisation ? Installez la compétence ESP Screens dans Paramètres → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"demander à Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Sonnette : afficher l’alerte et attendre qu’on appuie sur le bouton."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Quelqu’un arrive à la porte."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avancé · personnalisation locale"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML personnalisé"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML personnalisé · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Ce petit fichier est à vous. Il est chargé après le paquet commun des écrans et reste en place quand ESP Screens se met à jour. Modifiez ici les détails propres au matériel, comme un modèle d'écran."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Que peut-on modifier sans risque ?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Écran (display), tactile (touchscreen), substitutions, broches et autres détails de l'appareil. Le nom, le Wi-Fi, l'API, l'OTA et les liens vers les paquets restent gérés automatiquement."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Actif"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Prêt à être rattaché"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"YAML personnalisé local"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Utiliser l'exemple"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Effacer"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" caractère"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" caractères"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ligne"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" lignes"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer et vérifier"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrer le YAML personnalisé"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Aucun profil ESPHome n'a été trouvé pour cet écran."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Les modifications faites ici s'appliquent à la prochaine compilation."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Enregistrez une fois pour rattacher ce fichier au profil."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Vérification et enregistrement…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. Le YAML personnalisé est conservé lors des mises à jour du firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML personnalisé enregistré."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Enregistré. ESPHome vérifie le profil complet…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome vérifie le profil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome vérifie le profil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Le profil complet est valide. Vous pouvez compiler et installer sans risque."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome a refusé le profil complet. Consultez Firmware et USB pour le journal complet."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Remplacer le texte actuel par l'exemple ?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Exemple chargé. Enregistrez-le quand vous le souhaitez."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Effacer le YAML personnalisé local ?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Le YAML personnalisé sera vide après l'enregistrement."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Accueil"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Inconnu"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Indisponible"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Éteint"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Chauffage"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Climatisation"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Chauffage/Climatisation"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Déshumidification"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Ventilation uniquement"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Chauffe"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Rafraîchit"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactif"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Éteint"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Déshumidifie"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventile"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Préchauffage"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Dégivrage"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Ouverture"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Fermeture"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Lecture en cours"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"En pause"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactif"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"En veille"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Maison"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Absent"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Au-dessus de l'horizon"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Sous l'horizon"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"À la station d'accueil"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Nettoyage"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"En pause"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Retour à la station d'accueil"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactif"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Ensoleillé"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Nuit dégagée"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Nuageux"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Éclaircies"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Pluvieux"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Averses"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Neigeux"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Neigeux, pluvieux"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Brouillard"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Grêle"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Orage"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Orage / Pluie"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Venteux"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Exceptionnel"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Faible"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"En charge"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Pas en charge"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Froid"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Connecté"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Déconnecté"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Chaud"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Lumière détectée"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Pas de lumière"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Déverrouillé"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Verrouillé"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Humide"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Sec"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"En mouvement"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Immobile"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Branché"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Débranché"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Maison"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Absent"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problème"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"En cours"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Arrêté"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Dangereux"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Sûr"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Détectée"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détectée"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Détecté"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détecté"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Manipulation détectée"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détectée"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Mise à jour disponible"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"À jour"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Détectée"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Non détectée"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Ouvert"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Fermé"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Activer"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Exécuter"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Appuyer"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Faible"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Moyenne"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Élevée"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Milieu"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Focalisée"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffuse"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Haute"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Activé"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Désactivé"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Les deux"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Verticale"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontale"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"À l'instant"}},minutes_ago:{t:0,b:{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" min"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" heure"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" heures"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Hier"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" jour"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" jours"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" semaine"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" semaines"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" mois"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" mois"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" an"}]},{t:2,i:[{t:3,v:"Il y a "},{t:4,k:"n"},{t:3,v:" ans"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" heure"}]},{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" heures"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Demain"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" jour"}]},{t:2,i:[{t:3,v:"Dans "},{t:4,k:"n"},{t:3,v:" jours"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"dimanche"}},{t:0,b:{t:2,i:[{t:3}],s:"lundi"}},{t:0,b:{t:2,i:[{t:3}],s:"mardi"}},{t:0,b:{t:2,i:[{t:3}],s:"mercredi"}},{t:0,b:{t:2,i:[{t:3}],s:"jeudi"}},{t:0,b:{t:2,i:[{t:3}],s:"vendredi"}},{t:0,b:{t:2,i:[{t:3}],s:"samedi"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"dim."}},{t:0,b:{t:2,i:[{t:3}],s:"lun."}},{t:0,b:{t:2,i:[{t:3}],s:"mar."}},{t:0,b:{t:2,i:[{t:3}],s:"mer."}},{t:0,b:{t:2,i:[{t:3}],s:"jeu."}},{t:0,b:{t:2,i:[{t:3}],s:"ven."}},{t:0,b:{t:2,i:[{t:3}],s:"sam."}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"di"}},{t:0,b:{t:2,i:[{t:3}],s:"lu"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"me"}},{t:0,b:{t:2,i:[{t:3}],s:"je"}},{t:0,b:{t:2,i:[{t:3}],s:"ve"}},{t:0,b:{t:2,i:[{t:3}],s:"sa"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"janvier"}},{t:0,b:{t:2,i:[{t:3}],s:"février"}},{t:0,b:{t:2,i:[{t:3}],s:"mars"}},{t:0,b:{t:2,i:[{t:3}],s:"avril"}},{t:0,b:{t:2,i:[{t:3}],s:"mai"}},{t:0,b:{t:2,i:[{t:3}],s:"juin"}},{t:0,b:{t:2,i:[{t:3}],s:"juillet"}},{t:0,b:{t:2,i:[{t:3}],s:"août"}},{t:0,b:{t:2,i:[{t:3}],s:"septembre"}},{t:0,b:{t:2,i:[{t:3}],s:"octobre"}},{t:0,b:{t:2,i:[{t:3}],s:"novembre"}},{t:0,b:{t:2,i:[{t:3}],s:"décembre"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"janv."}},{t:0,b:{t:2,i:[{t:3}],s:"févr."}},{t:0,b:{t:2,i:[{t:3}],s:"mars"}},{t:0,b:{t:2,i:[{t:3}],s:"avr."}},{t:0,b:{t:2,i:[{t:3}],s:"mai"}},{t:0,b:{t:2,i:[{t:3}],s:"juin"}},{t:0,b:{t:2,i:[{t:3}],s:"juil."}},{t:0,b:{t:2,i:[{t:3}],s:"août"}},{t:0,b:{t:2,i:[{t:3}],s:"sept."}},{t:0,b:{t:2,i:[{t:3}],s:"oct."}},{t:0,b:{t:2,i:[{t:3}],s:"nov."}},{t:0,b:{t:2,i:[{t:3}],s:"déc."}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:" "}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"1"}},percent:{t:0,b:{t:2,i:[{t:3}],s:" %"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Page "},{t:4,k:"n"}]}}}}};export{t as default}; diff --git a/screen_manager/app/static/assets/index-C4Uqwn3z.js b/screen_manager/app/static/assets/index-C4Uqwn3z.js new file mode 100644 index 0000000..10bbcea --- /dev/null +++ b/screen_manager/app/static/assets/index-C4Uqwn3z.js @@ -0,0 +1,28 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const l of i)if(l.type==="childList")for(const r of l.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(i){const l={};return i.integrity&&(l.integrity=i.integrity),i.referrerPolicy&&(l.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?l.credentials="include":i.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function s(i){if(i.ep)return;i.ep=!0;const l=n(i);fetch(i.href,l)}})();function Xo(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Re={},Un=[],Kt=()=>{},mr=()=>!1,Ei=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ai=e=>e.startsWith("onUpdate:"),tt=Object.assign,Zo=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Du=Object.prototype.hasOwnProperty,Ee=(e,t)=>Du.call(e,t),pe=Array.isArray,wn=e=>Hs(e)==="[object Map]",rn=e=>Hs(e)==="[object Set]",Ll=e=>Hs(e)==="[object Date]",_e=e=>typeof e=="function",We=e=>typeof e=="string",qt=e=>typeof e=="symbol",Pe=e=>e!==null&&typeof e=="object",br=e=>(Pe(e)||_e(e))&&_e(e.then)&&_e(e.catch),vr=Object.prototype.toString,Hs=e=>vr.call(e),Uu=e=>Hs(e).slice(8,-1),gr=e=>Hs(e)==="[object Object]",Qo=e=>We(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ys=Xo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Pi=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ju=/-\w/g,ct=Pi(e=>e.replace(ju,t=>t.slice(1).toUpperCase())),Hu=/\B([A-Z])/g,En=Pi(e=>e.replace(Hu,"-$1").toLowerCase()),Oi=Pi(e=>e.charAt(0).toUpperCase()+e.slice(1)),Gi=Pi(e=>e?`on${Oi(e)}`:""),Bt=(e,t)=>!Object.is(e,t),si=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Ii=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Ml;const Li=()=>Ml||(Ml=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ue(e){if(pe(e)){const t={};for(let n=0;nn.startsWith("/*")?"":n).split(Vu).forEach(n=>{if(n){const s=n.split(Wu);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function he(e){let t="";if(We(e))t=e;else if(pe(e))for(let n=0;nRt(n,t))}const wr=e=>!!(e&&e.__v_isRef===!0),d=e=>We(e)?e:e==null?"":pe(e)||Pe(e)&&(e.toString===vr||!_e(e.toString))?wr(e)?d(e.value):JSON.stringify(e,kr,2):String(e),kr=(e,t)=>wr(t)?kr(e,t.value):wn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,i],l)=>(n[Ji(s,l)+" =>"]=i,n),{})}:rn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Ji(n))}:qt(t)?Ji(t):Pe(t)&&!pe(t)&&!gr(t)?String(t):t,Ji=(e,t="")=>{var n;return qt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};let Je;class $r{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Je&&(Je.active?(this.parent=Je,this.index=(Je.scopes||(Je.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes){const s=this.scopes.slice();for(t=0,n=s.length;t0&&--this._on===0){if(Je===this)Je=this.prevScope;else{let t=Je;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(ks){let t=ks;for(ks=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;ws;){let t=ws;for(ws=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Er(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ar(e){let t,n=e.depsTail,s=n;for(;s;){const i=s.prevDep;s.version===-1?(s===n&&(n=i),sl(s),Zu(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=i}e.deps=t,e.depsTail=n}function wo(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Pr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Pr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ts)||(e.globalVersion=Ts,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!wo(e))))return;e.flags|=2;const t=e.dep,n=Ne,s=Mt;Ne=e,Mt=!0;try{Er(e);const i=e.fn(e._value);(t.version===0||Bt(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{Ne=n,Mt=s,Ar(e),e.flags&=-3}}function sl(e,t=!1){const{dep:n,prevSub:s,nextSub:i}=e;if(s&&(s.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let l=n.computed.deps;l;l=l.nextDep)sl(l,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Zu(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Mt=!0;const Or=[];function cn(){Or.push(Mt),Mt=!1}function un(){const e=Or.pop();Mt=e===void 0?!0:e}function Fl(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Ne;Ne=void 0;try{t()}finally{Ne=n}}}let Ts=0;class Qu{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class il{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Ne||!Mt||Ne===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Ne)n=this.activeLink=new Qu(Ne,this),Ne.deps?(n.prevDep=Ne.depsTail,Ne.depsTail.nextDep=n,Ne.depsTail=n):Ne.deps=Ne.depsTail=n,Ir(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=Ne.depsTail,n.nextDep=void 0,Ne.depsTail.nextDep=n,Ne.depsTail=n,Ne.deps===n&&(Ne.deps=s)}return n}trigger(t){this.version++,Ts++,this.notify(t)}notify(t){tl();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{nl()}}}function Ir(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ir(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const ko=new WeakMap,Hn=Symbol(""),$o=Symbol(""),Es=Symbol("");function nt(e,t,n){if(Mt&&Ne){let s=ko.get(e);s||ko.set(e,s=new Map);let i=s.get(n);i||(s.set(n,i=new il),i.map=s,i.key=n),i.track()}}function en(e,t,n,s,i,l){const r=ko.get(e);if(!r){Ts++;return}const u=f=>{f&&f.trigger()};if(tl(),t==="clear")r.forEach(u);else{const f=pe(e),h=f&&Qo(n);if(f&&n==="length"){const p=Number(s);r.forEach((b,v)=>{(v==="length"||v===Es||!qt(v)&&v>=p)&&u(b)})}else switch((n!==void 0||r.has(void 0))&&u(r.get(n)),h&&u(r.get(Es)),t){case"add":f?h&&u(r.get("length")):(u(r.get(Hn)),wn(e)&&u(r.get($o)));break;case"delete":f||(u(r.get(Hn)),wn(e)&&u(r.get($o)));break;case"set":wn(e)&&u(r.get(Hn));break}}nl()}function Gn(e){const t=xe(e);return t===e||(nt(t,"iterate",Es),Ct(e))?t:Yt(e)?kn(e)?t.map(n=>$n(Pt(n))):t.map($n):t.map(Pt)}function Mi(e){return nt(e=xe(e),"iterate",Es),e}function Vt(e,t){return Yt(e)?$n(kn(e)?Pt(t):t):Pt(t)}const ed={__proto__:null,[Symbol.iterator](){return Zi(this,Symbol.iterator,e=>Vt(this,e))},concat(...e){return Gn(this).concat(...e.map(t=>pe(t)?Gn(t):t))},entries(){return Zi(this,"entries",e=>(e[1]=Vt(this,e[1]),e))},every(e,t){return Gt(this,"every",e,t,void 0,arguments)},filter(e,t){return Gt(this,"filter",e,t,n=>n.map(s=>Vt(this,s)),arguments)},find(e,t){return Gt(this,"find",e,t,n=>Vt(this,n),arguments)},findIndex(e,t){return Gt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Gt(this,"findLast",e,t,n=>Vt(this,n),arguments)},findLastIndex(e,t){return Gt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Gt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Qi(this,"includes",e)},indexOf(...e){return Qi(this,"indexOf",e)},join(e){return Gn(this).join(e)},lastIndexOf(...e){return Qi(this,"lastIndexOf",e)},map(e,t){return Gt(this,"map",e,t,void 0,arguments)},pop(){return ds(this,"pop")},push(...e){return ds(this,"push",e)},reduce(e,...t){return Dl(this,"reduce",e,t)},reduceRight(e,...t){return Dl(this,"reduceRight",e,t)},shift(){return ds(this,"shift")},some(e,t){return Gt(this,"some",e,t,void 0,arguments)},splice(...e){return ds(this,"splice",e)},toReversed(){return Gn(this).toReversed()},toSorted(e){return Gn(this).toSorted(e)},toSpliced(...e){return Gn(this).toSpliced(...e)},unshift(...e){return ds(this,"unshift",e)},values(){return Zi(this,"values",e=>Vt(this,e))}};function Zi(e,t,n){const s=Mi(e),i=s[t]();return s!==e&&!Ct(e)&&(i._next=i.next,i.next=()=>{const l=i._next();return l.done||(l.value=n(l.value)),l}),i}const td=Array.prototype;function Gt(e,t,n,s,i,l){const r=Mi(e),u=r!==e&&!Ct(e),f=r[t];if(f!==td[t]){const b=f.apply(e,l);return u?Pt(b):b}let h=n;r!==e&&(u?h=function(b,v){return n.call(this,Vt(e,b),v,e)}:n.length>2&&(h=function(b,v){return n.call(this,b,v,e)}));const p=f.call(r,h,s);return u&&i?i(p):p}function Dl(e,t,n,s){const i=Mi(e),l=i!==e&&!Ct(e);let r=n,u=!1;i!==e&&(l?(u=s.length===0,r=function(h,p,b){return u&&(u=!1,h=Vt(e,h)),n.call(this,h,Vt(e,p),b,e)}):n.length>3&&(r=function(h,p,b){return n.call(this,h,p,b,e)}));const f=i[t](r,...s);return u?Vt(e,f):f}function Qi(e,t,n){const s=xe(e);nt(s,"iterate",Es);const i=s[t](...n);return(i===-1||i===!1)&&al(n[0])?(n[0]=xe(n[0]),s[t](...n)):i}function ds(e,t,n=[]){cn(),tl();const s=xe(e)[t].apply(e,n);return nl(),un(),s}const nd=Xo("__proto__,__v_isRef,__isVue"),Lr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(qt));function sd(e){qt(e)||(e=String(e));const t=xe(this);return nt(t,"has",e),t.hasOwnProperty(e)}class Mr{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const i=this._isReadonly,l=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return l;if(n==="__v_raw")return s===(i?l?pd:Dr:l?Fr:Nr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const r=pe(t);if(!i){let f;if(r&&(f=ed[n]))return f;if(n==="hasOwnProperty")return sd}const u=Reflect.get(t,n,et(t)?t:s);if((qt(n)?Lr.has(n):nd(n))||(i||nt(t,"get",n),l))return u;if(et(u)){const f=r&&Qo(n)?u:u.value;return i&&Pe(f)?So(f):f}return Pe(u)?i?So(u):qn(u):u}}class Rr extends Mr{constructor(t=!1){super(!1,t)}set(t,n,s,i){let l=t[n];const r=pe(t)&&Qo(n);if(!this._isShallow){const h=Yt(l);if(!Ct(s)&&!Yt(s)&&(l=xe(l),s=xe(s)),!r&&et(l)&&!et(s))return h||(l.value=s),!0}const u=r?Number(n)e,Gs=e=>Reflect.getPrototypeOf(e);function rd(e,t,n){return function(...s){const i=this.__v_raw,l=xe(i),r=wn(l),u=e==="entries"||e===Symbol.iterator&&r,f=e==="keys"&&r,h=i[e](...s),p=n?xo:t?$n:Pt;return!t&&nt(l,"iterate",f?$o:Hn),tt(Object.create(h),{next(){const{value:b,done:v}=h.next();return v?{value:b,done:v}:{value:u?[p(b[0]),p(b[1])]:p(b),done:v}}})}}function Js(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function cd(e,t){const n={get(i){const l=this.__v_raw,r=xe(l),u=xe(i);e||(Bt(i,u)&&nt(r,"get",i),nt(r,"get",u));const{has:f}=Gs(r),h=t?xo:e?$n:Pt;if(f.call(r,i))return h(l.get(i));if(f.call(r,u))return h(l.get(u));l!==r&&l.get(i)},get size(){const i=this.__v_raw;return!e&&nt(xe(i),"iterate",Hn),i.size},has(i){const l=this.__v_raw,r=xe(l),u=xe(i);return e||(Bt(i,u)&&nt(r,"has",i),nt(r,"has",u)),i===u?l.has(i):l.has(i)||l.has(u)},forEach(i,l){const r=this,u=r.__v_raw,f=xe(u),h=t?xo:e?$n:Pt;return!e&&nt(f,"iterate",Hn),u.forEach((p,b)=>i.call(l,h(p),h(b),r))}};return tt(n,e?{add:Js("add"),set:Js("set"),delete:Js("delete"),clear:Js("clear")}:{add(i){const l=xe(this),r=Gs(l),u=xe(i),f=!t&&!Ct(i)&&!Yt(i)?u:i;return r.has.call(l,f)||Bt(i,f)&&r.has.call(l,i)||Bt(u,f)&&r.has.call(l,u)||(l.add(f),en(l,"add",f,f)),this},set(i,l){!t&&!Ct(l)&&!Yt(l)&&(l=xe(l));const r=xe(this),{has:u,get:f}=Gs(r);let h=u.call(r,i);h||(i=xe(i),h=u.call(r,i));const p=f.call(r,i);return r.set(i,l),h?Bt(l,p)&&en(r,"set",i,l):en(r,"add",i,l),this},delete(i){const l=xe(this),{has:r,get:u}=Gs(l);let f=r.call(l,i);f||(i=xe(i),f=r.call(l,i)),u&&u.call(l,i);const h=l.delete(i);return f&&en(l,"delete",i,void 0),h},clear(){const i=xe(this),l=i.size!==0,r=i.clear();return l&&en(i,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(i=>{n[i]=rd(i,e,t)}),n}function ol(e,t){const n=cd(e,t);return(s,i,l)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?s:Reflect.get(Ee(n,i)&&i in s?n:s,i,l)}const ud={get:ol(!1,!1)},dd={get:ol(!1,!0)},fd={get:ol(!0,!1)};const Nr=new WeakMap,Fr=new WeakMap,Dr=new WeakMap,pd=new WeakMap;function hd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function qn(e){return Yt(e)?e:ll(e,!1,od,ud,Nr)}function md(e){return ll(e,!1,ad,dd,Fr)}function So(e){return ll(e,!0,ld,fd,Dr)}function ll(e,t,n,s,i){if(!Pe(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const l=i.get(e);if(l)return l;const r=hd(Uu(e));if(r===0)return e;const u=new Proxy(e,r===2?s:n);return i.set(e,u),u}function kn(e){return Yt(e)?kn(e.__v_raw):!!(e&&e.__v_isReactive)}function Yt(e){return!!(e&&e.__v_isReadonly)}function Ct(e){return!!(e&&e.__v_isShallow)}function al(e){return e?!!e.__v_raw:!1}function xe(e){const t=e&&e.__v_raw;return t?xe(t):e}function bd(e){return!Ee(e,"__v_skip")&&Object.isExtensible(e)&&_r(e,"__v_skip",!0),e}const Pt=e=>Pe(e)?qn(e):e,$n=e=>Pe(e)?So(e):e;function et(e){return e?e.__v_isRef===!0:!1}function $e(e){return Ur(e,!1)}function vd(e){return Ur(e,!0)}function Ur(e,t){return et(e)?e:new gd(e,t)}class gd{constructor(t,n){this.dep=new il,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:xe(t),this._value=n?t:Pt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Ct(t)||Yt(t);t=s?t:xe(t),Bt(t,n)&&(this._rawValue=t,this._value=s?t:Pt(t),this.dep.trigger())}}function a(e){return et(e)?e.value:e}const _d={get:(e,t,n)=>t==="__v_raw"?e:a(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const i=e[t];return et(i)&&!et(n)?(i.value=n,!0):Reflect.set(e,t,n,s)}};function jr(e){return kn(e)?e:new Proxy(e,_d)}class yd{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new il(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ts-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&Ne!==this)return Tr(this,!0),!0}get value(){const t=this.dep.track();return Pr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function wd(e,t,n=!1){let s,i;return _e(e)?s=e:(s=e.get,i=e.set),new yd(s,i,n)}const Xs={},ai=new WeakMap;let Fn;function kd(e,t=!1,n=Fn){if(n){let s=ai.get(n);s||ai.set(n,s=[]),s.push(e)}}function $d(e,t,n=Re){const{immediate:s,deep:i,once:l,scheduler:r,augmentJob:u,call:f}=n,h=C=>i?C:Ct(C)||i===!1||i===0?tn(C,1):tn(C);let p,b,v,y,I=!1,T=!1;if(et(e)?(b=()=>e.value,I=Ct(e)):kn(e)?(b=()=>h(e),I=!0):pe(e)?(T=!0,I=e.some(C=>kn(C)||Ct(C)),b=()=>e.map(C=>{if(et(C))return C.value;if(kn(C))return h(C);if(_e(C))return f?f(C,2):C()})):_e(e)?t?b=f?()=>f(e,2):e:b=()=>{if(v){cn();try{v()}finally{un()}}const C=Fn;Fn=p;try{return f?f(e,3,[y]):e(y)}finally{Fn=C}}:b=Kt,t&&i){const C=b,K=i===!0?1/0:i;b=()=>tn(C(),K)}const k=xr(),A=()=>{p.stop(),k&&k.active&&Zo(k.effects,p)};if(l&&t){const C=t;t=(...K)=>{const O=C(...K);return A(),O}}let S=T?new Array(e.length).fill(Xs):Xs;const U=C=>{if(!(!(p.flags&1)||!p.dirty&&!C))if(t){const K=p.run();if(C||i||I||(T?K.some((O,E)=>Bt(O,S[E])):Bt(K,S))){v&&v();const O=Fn;Fn=p;try{const E=[K,S===Xs?void 0:T&&S[0]===Xs?[]:S,y];S=K,f?f(t,3,E):t(...E)}finally{Fn=O}}}else p.run()};return u&&u(U),p=new Sr(b),p.scheduler=r?()=>r(U,!1):U,y=C=>kd(C,!1,p),v=p.onStop=()=>{const C=ai.get(p);if(C){if(f)f(C,4);else for(const K of C)K();ai.delete(p)}},t?s?U(!0):S=p.run():r?r(U.bind(null,!0),!0):p.run(),A.pause=p.pause.bind(p),A.resume=p.resume.bind(p),A.stop=A,A}function tn(e,t=1/0,n){if(t<=0||!Pe(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,et(e))tn(e.value,t,n);else if(pe(e))for(let s=0;s{tn(s,t,n)});else if(gr(e)){for(const s in e)tn(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&tn(e[s],t,n)}return e}function Vs(e,t,n,s){try{return s?e(...s):e()}catch(i){Ri(i,t,n)}}function Nt(e,t,n,s){if(_e(e)){const i=Vs(e,t,n,s);return i&&br(i)&&i.catch(l=>{Ri(l,t,n)}),i}if(pe(e)){const i=[];for(let l=0;l>>1,i=rt[s],l=As(i);l=As(n)?rt.push(e):rt.splice(Sd(t),0,e),e.flags|=1,Vr()}}function Vr(){ri||(ri=Hr.then(Br))}function Cd(e){if(!pe(e))gn&&e.id===-1?gn.splice(Jn+1,0,e):e.flags&1||(Qn.push(e),e.flags|=1);else for(let t=0;tAs(n)-As(s));if(Qn.length=0,gn){for(let n=0;ne.id==null?e.flags&2?-1:1/0:e.id;function Br(e){try{for(jt=0;jt{s._d&&fi(-1);const l=ci(t),r=Vn.length;let u;try{u=e(...i)}finally{for(let f=Vn.length;f>r;f--)vc();ci(l),s._d&&fi(1)}return u};return s._n=!0,s._c=!0,s._d=!0,s}function Te(e,t){if(vt===null)return e;const n=ji(vt),s=e.dirs||(e.dirs=[]);for(let i=0;i1)return n&&_e(t)?t.call(s&&s.proxy):t}}const Ed=Symbol.for("v-scx"),Ad=()=>$s(Ed);function Tt(e,t,n){return zr(e,t,n)}function zr(e,t,n=Re){const{immediate:s,deep:i,flush:l,once:r}=n,u=tt({},n),f=t&&s||!t&&l!=="post";let h;if(Is){if(l==="sync"){const y=Ad();h=y.__watcherHandles||(y.__watcherHandles=[])}else if(!f){const y=()=>{};return y.stop=Kt,y.resume=Kt,y.pause=Kt,y}}const p=st;u.call=(y,I,T)=>Nt(y,p,I,T);let b=!1;l==="post"?u.scheduler=y=>{dt(y,p&&p.suspense)}:l!=="sync"&&(b=!0,u.scheduler=(y,I)=>{I?y():rl(y)}),u.augmentJob=y=>{t&&(y.flags|=4),b&&(y.flags|=2,p&&(y.id=p.uid,y.i=p))};const v=$d(e,t,u);return Is&&(h?h.push(v):f&&v()),v}function Pd(e,t,n){const s=this.proxy,i=We(e)?e.includes(".")?qr(s,e):()=>s[e]:e.bind(s,s);let l;_e(t)?l=t:(l=t.handler,n=t);const r=Ks(this),u=zr(i,l.bind(s),n);return r(),u}function qr(e,t){const n=t.split(".");return()=>{let s=e;for(let i=0;ie.__isTeleport,eo=Symbol("_leaveCb");function Id(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==dn){t=n;break}}return t}function Yr(e){if(!ul(e))return Fi(e.type)&&e.children?Id(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&_e(n.default))return n.default()}}function cl(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const n=e.component.subTree;cl(Fi(n.type)&&Yr(n)||n,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Le(e,t){return _e(e)?tt({name:e.name},t,{setup:e}):e}function Gr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function jl(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const ui=new WeakMap;function xs(e,t,n,s,i=!1){if(pe(e)){e.forEach((T,k)=>xs(T,t&&(pe(t)?t[k]:t),n,s,i));return}if(Ss(s)&&!i){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&xs(e,t,n,s.component.subTree);return}const l=s.shapeFlag&4?ji(s.component):s.el,r=i?null:l,{i:u,r:f}=e,h=t&&t.r,p=u.refs===Re?u.refs={}:u.refs,b=u.setupState,v=xe(b),y=b===Re?mr:T=>jl(p,T)?!1:Ee(v,T),I=(T,k)=>!(k&&jl(p,k));if(h!=null&&h!==f){if(Hl(t),We(h))p[h]=null,y(h)&&(b[h]=null);else if(et(h)){const T=t;I(h,T.k)&&(h.value=null),T.k&&(p[T.k]=null)}}if(_e(f))Vs(f,u,12,[r,p]);else{const T=We(f),k=et(f);if(T||k){const A=()=>{if(e.f){const S=T?y(f)?b[f]:p[f]:I()||!e.k?f.value:p[e.k];if(i)pe(S)&&Zo(S,l);else if(pe(S))S.includes(l)||S.push(l);else if(T)p[f]=[l],y(f)&&(b[f]=p[f]);else{const U=[l];I(f,e.k)&&(f.value=U),e.k&&(p[e.k]=U)}}else T?(p[f]=r,y(f)&&(b[f]=r)):k&&(I(f,e.k)&&(f.value=r),e.k&&(p[e.k]=r))};if(r){const S=()=>{A(),ui.delete(e)};S.id=-1,ui.set(e,S),dt(S,n)}else Hl(e),A()}}}function Hl(e){const t=ui.get(e);t&&(t.flags|=8,ui.delete(e))}Li().requestIdleCallback;Li().cancelIdleCallback;const Ss=e=>!!e.type.__asyncLoader,ul=e=>e.type.__isKeepAlive;function Ld(e,t){Jr(e,"a",t)}function Md(e,t){Jr(e,"da",t)}function Jr(e,t,n=st){const s=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Di(t,s,n),n){let i=n.parent;for(;i&&i.parent;)ul(i.parent.vnode)&&Rd(s,t,n,i),i=i.parent}}function Rd(e,t,n,s){const i=Di(t,e,s,!0);dl(()=>{Zo(s[t],i)},n)}function Di(e,t,n=st,s=!1){if(n){const i=n[e]||(n[e]=[]),l=t.__weh||(t.__weh=(...r)=>{cn();const u=Ks(n),f=Nt(t,n,e,r);return u(),un(),f});return s?i.unshift(l):i.push(l),l}}const mn=e=>(t,n=st)=>{(!Is||e==="sp")&&Di(e,(...s)=>t(...s),n)},Nd=mn("bm"),An=mn("m"),Fd=mn("bu"),Dd=mn("u"),rs=mn("bum"),dl=mn("um"),Ud=mn("sp"),jd=mn("rtg"),Hd=mn("rtc");function Vd(e,t=st){Di("ec",e,t)}const Xr="components";function Ws(e,t){return Qr(Xr,e,!0,t)||e}const Zr=Symbol.for("v-ndc");function Wd(e){return We(e)?Qr(Xr,e,!1)||e:e||Zr}function Qr(e,t,n=!0,s=!1){const i=vt||st;if(i){const l=i.type;{const u=Tf(l,!1);if(u&&(u===t||u===ct(t)||u===Oi(ct(t))))return l}const r=Vl(i[e]||l[e],t)||Vl(i.appContext[e],t);return!r&&s?l:r}}function Vl(e,t){return e&&(e[t]||e[ct(t)]||e[Oi(ct(t))])}function me(e,t,n,s){let i;const l=n,r=pe(e);if(r||We(e)){const u=r&&kn(e);let f=!1,h=!1;u&&(f=!Ct(e),h=Yt(e),e=Mi(e)),i=new Array(e.length);for(let p=0,b=e.length;pt(u,f,void 0,l));else{const u=Object.keys(e);i=new Array(u.length);for(let f=0,h=u.length;fe?wc(e)?ji(e):Co(e.parent):null,Cs=tt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Co(e.parent),$root:e=>Co(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>tc(e),$forceUpdate:e=>e.f||(e.f=()=>{rl(e.update)}),$nextTick:e=>e.n||(e.n=Ni.bind(e.proxy)),$watch:e=>Pd.bind(e)}),to=(e,t)=>e!==Re&&!e.__isScriptSetup&&Ee(e,t),Bd={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:i,props:l,accessCache:r,type:u,appContext:f}=e;if(t[0]!=="$"){const v=r[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return i[t];case 4:return n[t];case 3:return l[t]}else{if(to(s,t))return r[t]=1,s[t];if(i!==Re&&Ee(i,t))return r[t]=2,i[t];if(Ee(l,t))return r[t]=3,l[t];if(n!==Re&&Ee(n,t))return r[t]=4,n[t];To&&(r[t]=0)}}const h=Cs[t];let p,b;if(h)return t==="$attrs"&&nt(e.attrs,"get",""),h(e);if((p=u.__cssModules)&&(p=p[t]))return p;if(n!==Re&&Ee(n,t))return r[t]=4,n[t];if(b=f.config.globalProperties,Ee(b,t))return b[t]},set({_:e},t,n){const{data:s,setupState:i,ctx:l}=e;return to(i,t)?(i[t]=n,!0):s!==Re&&Ee(s,t)?(s[t]=n,!0):Ee(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:i,props:l,type:r}},u){let f;return!!(n[u]||e!==Re&&u[0]!=="$"&&Ee(e,u)||to(t,u)||Ee(l,u)||Ee(s,u)||Ee(Cs,u)||Ee(i.config.globalProperties,u)||(f=r.__cssModules)&&f[u])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Ee(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Wl(e){return pe(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let To=!0;function Kd(e){const t=tc(e),n=e.proxy,s=e.ctx;To=!1,t.beforeCreate&&Bl(t.beforeCreate,e,"bc");const{data:i,computed:l,methods:r,watch:u,provide:f,inject:h,created:p,beforeMount:b,mounted:v,beforeUpdate:y,updated:I,activated:T,deactivated:k,beforeDestroy:A,beforeUnmount:S,destroyed:U,unmounted:C,render:K,renderTracked:O,renderTriggered:E,errorCaptured:R,serverPrefetch:L,expose:D,inheritAttrs:M,components:Y,directives:te,filters:ye}=t;if(h&&zd(h,s,null),r)for(const ge in r){const we=r[ge];_e(we)&&(s[ge]=we.bind(n))}if(i){const ge=i.call(n,n);Pe(ge)&&(e.data=qn(ge))}if(To=!0,l)for(const ge in l){const we=l[ge],Ge=_e(we)?we.bind(n,n):_e(we.get)?we.get.bind(n,n):Kt,qe=!_e(we)&&_e(we.set)?we.set.bind(n):Kt,le=$({get:Ge,set:qe});Object.defineProperty(s,ge,{enumerable:!0,configurable:!0,get:()=>le.value,set:Z=>le.value=Z})}if(u)for(const ge in u)ec(u[ge],s,n,ge);if(f){const ge=_e(f)?f.call(n):f;Reflect.ownKeys(ge).forEach(we=>{Td(we,ge[we])})}p&&Bl(p,e,"c");function be(ge,we){pe(we)?we.forEach(Ge=>ge(Ge.bind(n))):we&&ge(we.bind(n))}if(be(Nd,b),be(An,v),be(Fd,y),be(Dd,I),be(Ld,T),be(Md,k),be(Vd,R),be(Hd,O),be(jd,E),be(rs,S),be(dl,C),be(Ud,L),pe(D))if(D.length){const ge=e.exposed||(e.exposed={});D.forEach(we=>{Object.defineProperty(ge,we,{get:()=>n[we],set:Ge=>n[we]=Ge,enumerable:!0})})}else e.exposed||(e.exposed={});K&&e.render===Kt&&(e.render=K),M!=null&&(e.inheritAttrs=M),Y&&(e.components=Y),te&&(e.directives=te),L&&Gr(e)}function zd(e,t,n=Kt){pe(e)&&(e=Eo(e));for(const s in e){const i=e[s];let l;Pe(i)?"default"in i?l=$s(i.from||s,i.default,!0):l=$s(i.from||s):l=$s(i),et(l)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>l.value,set:r=>l.value=r}):t[s]=l}}function Bl(e,t,n){Nt(pe(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function ec(e,t,n,s){let i=s.includes(".")?qr(n,s):()=>n[s];if(We(e)){const l=t[e];_e(l)&&Tt(i,l)}else if(_e(e))Tt(i,e.bind(n));else if(Pe(e))if(pe(e))e.forEach(l=>ec(l,t,n,s));else{const l=_e(e.handler)?e.handler.bind(n):t[e.handler];_e(l)&&Tt(i,l,e)}}function tc(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:i,optionsCache:l,config:{optionMergeStrategies:r}}=e.appContext,u=l.get(t);let f;return u?f=u:!i.length&&!n&&!s?f=t:(f={},i.length&&i.forEach(h=>di(f,h,r,!0)),di(f,t,r)),Pe(t)&&l.set(t,f),f}function di(e,t,n,s=!1){const{mixins:i,extends:l}=t;l&&di(e,l,n,!0),i&&i.forEach(r=>di(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const u=qd[r]||n&&n[r];e[r]=u?u(e[r],t[r]):t[r]}return e}const qd={data:Kl,props:zl,emits:zl,methods:ms,computed:ms,beforeCreate:lt,created:lt,beforeMount:lt,mounted:lt,beforeUpdate:lt,updated:lt,beforeDestroy:lt,beforeUnmount:lt,destroyed:lt,unmounted:lt,activated:lt,deactivated:lt,errorCaptured:lt,serverPrefetch:lt,components:ms,directives:ms,watch:Gd,provide:Kl,inject:Yd};function Kl(e,t){return t?e?function(){return tt(_e(e)?e.call(this,this):e,_e(t)?t.call(this,this):t)}:t:e}function Yd(e,t){return ms(Eo(e),Eo(t))}function Eo(e){if(pe(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${ct(t)}Modifiers`]||e[`${En(t)}Modifiers`];function Qd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Re;let i=n;const l=t.startsWith("update:"),r=l&&Zd(s,t.slice(7));r&&(r.trim&&(i=n.map(p=>We(p)?p.trim():p)),r.number&&(i=i.map(Ii)));let u,f=s[u=Gi(t)]||s[u=Gi(ct(t))];!f&&l&&(f=s[u=Gi(En(t))]),f&&Nt(f,e,6,i);const h=s[u+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[u])return;e.emitted[u]=!0,Nt(h,e,6,i)}}const ef=new WeakMap;function sc(e,t,n=!1){const s=n?ef:t.emitsCache,i=s.get(e);if(i!==void 0)return i;const l=e.emits;let r={},u=!1;if(!_e(e)){const f=h=>{const p=sc(h,t,!0);p&&(u=!0,tt(r,p))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!l&&!u?(Pe(e)&&s.set(e,null),null):(pe(l)?l.forEach(f=>r[f]=null):tt(r,l),Pe(e)&&s.set(e,r),r)}function Ui(e,t){return!e||!Ei(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),Ee(e,t[0].toLowerCase()+t.slice(1))||Ee(e,En(t))||Ee(e,t))}function ql(e){const{type:t,vnode:n,proxy:s,withProxy:i,propsOptions:[l],slots:r,attrs:u,emit:f,render:h,renderCache:p,props:b,data:v,setupState:y,ctx:I,inheritAttrs:T}=e,k=ci(e);let A,S;try{if(n.shapeFlag&4){const C=i||s,K=C;A=Wt(h.call(K,C,p,b,y,v,I)),S=u}else{const C=t;A=Wt(C.length>1?C(b,{attrs:u,slots:r,emit:f}):C(b,null)),S=t.props?u:tf(u)}}catch(C){Vn.length=0,Ri(C,e,1),A=ie(dn)}let U=A;if(S&&T!==!1){const C=Object.keys(S),{shapeFlag:K}=U;C.length&&K&7&&(l&&C.some(Ai)&&(S=nf(S,l)),U=ss(U,S,!1,!0))}if(n.dirs&&(U=ss(U,null,!1,!0),U.dirs=U.dirs?U.dirs.concat(n.dirs):n.dirs),n.transition){const C=Fi(U.type)&&Yr(U)||U;cl(C,n.transition)}return A=U,ci(k),A}const tf=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ei(n))&&((t||(t={}))[n]=e[n]);return t},nf=(e,t)=>{const n={};for(const s in e)(!Ai(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function sf(e,t,n){const{props:s,children:i,component:l}=e,{props:r,children:u,patchFlag:f}=t,h=l.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return s?Yl(s,r,h):!!r;if(f&8){const p=t.dynamicProps;for(let b=0;bObject.create(oc),ac=e=>Object.getPrototypeOf(e)===oc;function lf(e,t,n,s=!1){const i={},l=lc();e.propsDefaults=Object.create(null),rc(e,t,i,l);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);n?e.props=s?i:md(i):e.type.props?e.props=i:e.props=l,e.attrs=l}function af(e,t,n,s){const{props:i,attrs:l,vnode:{patchFlag:r}}=e,u=xe(i),[f]=e.propsOptions;let h=!1;if((s||r>0)&&!(r&16)){if(r&8){const p=e.vnode.dynamicProps;for(let b=0;b{f=!0;const[v,y]=cc(b,t,!0);tt(r,v),y&&u.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!l&&!f)return Pe(e)&&s.set(e,Un),Un;if(pe(l))for(let p=0;pe==="_"||e==="_ctx"||e==="$stable",pl=e=>pe(e)?e.map(Wt):[Wt(e)],cf=(e,t,n)=>{if(t._n)return t;const s=oe((...i)=>pl(t(...i)),n);return s._c=!1,s},uc=(e,t,n)=>{const s=e._ctx;for(const i in e){if(fl(i))continue;const l=e[i];if(_e(l))t[i]=cf(i,l,s);else if(l!=null){const r=pl(l);t[i]=()=>r}}},dc=(e,t)=>{const n=pl(t);e.slots.default=()=>n},fc=(e,t,n)=>{for(const s in t)(n||!fl(s))&&(e[s]=t[s])},uf=(e,t,n)=>{const s=e.slots=lc();if(e.vnode.shapeFlag&32){const i=t._;i?(fc(s,t,n),n&&_r(s,"_",i,!0)):uc(t,s)}else t&&dc(e,t)},df=(e,t,n)=>{const{vnode:s,slots:i}=e;let l=!0,r=Re;if(s.shapeFlag&32){const u=t._;u?n&&u===1?l=!1:fc(i,t,n):(l=!t.$stable,uc(t,i)),r=t}else t&&(dc(e,t),r={default:1});if(l)for(const u in i)!fl(u)&&r[u]==null&&delete i[u]},dt=bf;function ff(e){return pf(e)}function pf(e,t){const n=Li();n.__VUE__=!0;const{insert:s,remove:i,patchProp:l,createElement:r,createText:u,createComment:f,setText:h,setElementText:p,parentNode:b,nextSibling:v,setScopeId:y=Kt,insertStaticContent:I}=e,T=(w,x,N,z=null,j=null,W=null,X=void 0,J=null,G=!!x.dynamicChildren)=>{if(w===x)return;w&&!fs(w,x)&&(z=se(w),Z(w,j,W,!0),w=null),x.patchFlag===-2&&(G=!1,x.dynamicChildren=null),x.dynamicChildren&&w&&w.dynamicChildren&&w.dynamicChildren.hasOnce&&(x.dynamicChildren===Un&&(x.dynamicChildren=[]),x.dynamicChildren.hasOnce=!0);const{type:V,ref:de,shapeFlag:ee}=x;switch(V){case Bs:k(w,x,N,z);break;case dn:A(w,x,N,z);break;case so:w==null&&S(x,N,z,X);break;case q:Y(w,x,N,z,j,W,X,J,G);break;default:ee&1?K(w,x,N,z,j,W,X,J,G):ee&6?te(w,x,N,z,j,W,X,J,G):(ee&64||ee&128)&&V.process(w,x,N,z,j,W,X,J,G,Mn)}de!=null&&j?xs(de,w&&w.ref,W,x||w,!x):de==null&&w&&w.ref!=null&&xs(w.ref,null,W,w,!0)},k=(w,x,N,z)=>{if(w==null)s(x.el=u(x.children),N,z);else{const j=x.el=w.el;x.children!==w.children&&h(j,x.children)}},A=(w,x,N,z)=>{w==null?s(x.el=f(x.children||""),N,z):x.el=w.el},S=(w,x,N,z)=>{[w.el,w.anchor]=I(w.children,x,N,z,w.el,w.anchor)},U=({el:w,anchor:x},N,z)=>{let j;for(;w&&w!==x;)j=v(w),s(w,N,z),w=j;s(x,N,z)},C=({el:w,anchor:x})=>{let N;for(;w&&w!==x;)N=v(w),i(w),w=N;i(x)},K=(w,x,N,z,j,W,X,J,G)=>{if(x.type==="svg"?X="svg":x.type==="math"&&(X="mathml"),w==null)O(x,N,z,j,W,X,J,G);else{const V=w.el&&w.el._isVueCE?w.el:null;try{V&&V._beginPatch(),L(w,x,j,W,X,J,G)}finally{V&&V._endPatch()}}},O=(w,x,N,z,j,W,X,J)=>{let G,V;const{props:de,shapeFlag:ee,transition:Q,dirs:P}=w;if(G=w.el=r(w.type,W,de&&de.is,de),ee&8?p(G,w.children):ee&16&&R(w.children,G,null,z,j,no(w,W),X,J),P&&Rn(w,null,z,"created"),E(G,w,w.scopeId,X,z),de){for(const ce in de)ce!=="value"&&!ys(ce)&&l(G,ce,null,de[ce],W,z);"value"in de&&l(G,"value",null,de.value,W),(V=de.onVnodeBeforeMount)&&Ut(V,z,w)}P&&Rn(w,null,z,"beforeMount");const F=hf(j,Q);F&&Q.beforeEnter(G),s(G,x,N),((V=de&&de.onVnodeMounted)||F||P)&&dt(()=>{V&&Ut(V,z,w),F&&Q.enter(G),P&&Rn(w,null,z,"mounted")},j)},E=(w,x,N,z,j)=>{if(N&&y(w,N),z)for(let W=0;W{for(let V=G;V{const J=x.el=w.el;let{patchFlag:G,dynamicChildren:V,dirs:de}=x;G|=w.patchFlag&16;const ee=w.props||Re,Q=x.props||Re;let P;if(N&&Nn(N,!1),(P=Q.onVnodeBeforeUpdate)&&Ut(P,N,x,w),de&&Rn(x,w,N,"beforeUpdate"),N&&Nn(N,!0),V&&(!w.dynamicChildren||w.dynamicChildren.length!==V.length)&&(G=0,X=!1,V=null),(ee.innerHTML&&Q.innerHTML==null||ee.textContent&&Q.textContent==null)&&p(J,""),V?D(w.dynamicChildren,V,J,N,z,no(x,j),W):X||we(w,x,J,null,N,z,no(x,j),W,!1),G>0){if(G&16)M(J,ee,Q,N,j);else if(G&2&&ee.class!==Q.class&&l(J,"class",null,Q.class,j),G&4&&l(J,"style",ee.style,Q.style,j),G&8){const F=x.dynamicProps;for(let ce=0;ce{P&&Ut(P,N,x,w),de&&Rn(x,w,N,"updated")},z)},D=(w,x,N,z,j,W,X)=>{for(let J=0;J{if(x!==N){if(x!==Re)for(const W in x)!ys(W)&&!(W in N)&&l(w,W,x[W],null,j,z);for(const W in N){if(ys(W))continue;const X=N[W],J=x[W];X!==J&&W!=="value"&&l(w,W,J,X,j,z)}"value"in N&&l(w,"value",x.value,N.value,j)}},Y=(w,x,N,z,j,W,X,J,G)=>{const V=x.el=w?w.el:u(""),de=x.anchor=w?w.anchor:u("");let{patchFlag:ee,dynamicChildren:Q,slotScopeIds:P}=x;P&&(J=J?J.concat(P):P),w==null?(s(V,N,z),s(de,N,z),R(x.children||[],N,de,j,W,X,J,G)):ee>0&&ee&64&&Q&&w.dynamicChildren&&w.dynamicChildren.length===Q.length?(D(w.dynamicChildren,Q,N,j,W,X,J),(x.key!=null||j&&x===j.subTree)&&pc(w,x,!0)):we(w,x,N,de,j,W,X,J,G)},te=(w,x,N,z,j,W,X,J,G)=>{x.slotScopeIds=J,w==null?x.shapeFlag&512?j.ctx.activate(x,N,z,X,G):ye(x,N,z,j,W,X,G):re(w,x,G)},ye=(w,x,N,z,j,W,X)=>{const J=w.component=kf(w,z,j);if(ul(w)&&(J.ctx.renderer=Mn),$f(J,!1,X),J.asyncDep){if(j&&j.registerDep(J,be,X),!w.el){const G=J.subTree=ie(dn);A(null,G,x,N),w.placeholder=G.el}}else be(J,w,x,N,j,W,X)},re=(w,x,N)=>{const z=x.component=w.component;if(sf(w,x,N))if(z.asyncDep&&!z.asyncResolved){x.el=w.el,ge(z,x,N);return}else z.next=x,z.update();else x.el=w.el,z.vnode=x},be=(w,x,N,z,j,W,X)=>{const J=()=>{if(w.isMounted){let{next:ee,bu:Q,u:P,parent:F,vnode:ce}=w;{const kt=hc(w);if(kt){ee&&(ee.el=ce.el,ge(w,ee,X)),kt.asyncDep.then(()=>{dt(()=>{w.isUnmounted||V()},j)});return}}let fe=ee,Oe;Nn(w,!1),ee?(ee.el=ce.el,ge(w,ee,X)):ee=ce,Q&&si(Q),(Oe=ee.props&&ee.props.onVnodeBeforeUpdate)&&Ut(Oe,F,ee,ce),Nn(w,!0);const De=ql(w),Ve=w.subTree;w.subTree=De,T(Ve,De,b(Ve.el),se(Ve),w,j,W),ee.el=De.el,fe===null&&of(w,De.el),P&&dt(P,j),(Oe=ee.props&&ee.props.onVnodeUpdated)&&dt(()=>Ut(Oe,F,ee,ce),j)}else{let ee;const{el:Q,props:P}=x,{bm:F,m:ce,parent:fe,root:Oe,type:De}=w,Ve=Ss(x);Nn(w,!1),F&&si(F),!Ve&&(ee=P&&P.onVnodeBeforeMount)&&Ut(ee,fe,x),Nn(w,!0);{Oe.ce&&Oe.ce._hasShadowRoot()&&Oe.ce._injectChildStyle(De,w.parent?w.parent.type:void 0);const kt=w.subTree=ql(w);T(null,kt,N,z,w,j,W),x.el=kt.el}if(ce&&dt(ce,j),!Ve&&(ee=P&&P.onVnodeMounted)){const kt=x;dt(()=>Ut(ee,fe,kt),j)}(x.shapeFlag&256||fe&&Ss(fe.vnode)&&fe.vnode.shapeFlag&256)&&w.a&&dt(w.a,j),w.isMounted=!0,x=N=z=null}};w.scope.on();const G=w.effect=new Sr(J);w.scope.off();const V=w.update=G.run.bind(G),de=w.job=G.runIfDirty.bind(G);de.i=w,de.id=w.uid,G.scheduler=()=>rl(de),Nn(w,!0),V()},ge=(w,x,N)=>{x.component=w;const z=w.vnode.props;w.vnode=x,w.next=null,af(w,x.props,z,N),df(w,x.children,N),cn(),Ul(w),un()},we=(w,x,N,z,j,W,X,J,G=!1)=>{const V=w&&w.children,de=w?w.shapeFlag:0,ee=x.children,{patchFlag:Q,shapeFlag:P}=x;if(Q>0){if(Q&128){qe(V,ee,N,z,j,W,X,J,G);return}else if(Q&256){Ge(V,ee,N,z,j,W,X,J,G);return}}P&8?(de&16&&ne(V,j,W),ee!==V&&p(N,ee)):de&16?P&16?qe(V,ee,N,z,j,W,X,J,G):ne(V,j,W,!0):(de&8&&p(N,""),P&16&&R(ee,N,z,j,W,X,J,G))},Ge=(w,x,N,z,j,W,X,J,G)=>{w=w||Un,x=x||Un;const V=w.length,de=x.length,ee=Math.min(V,de);let Q;for(Q=0;Qde?ne(w,j,W,!0,!1,ee):R(x,N,z,j,W,X,J,G,ee)},qe=(w,x,N,z,j,W,X,J,G)=>{let V=0;const de=x.length;let ee=w.length-1,Q=de-1;for(;V<=ee&&V<=Q;){const P=w[V],F=x[V]=G?Zt(x[V]):Wt(x[V]);if(fs(P,F))T(P,F,N,null,j,W,X,J,G);else break;V++}for(;V<=ee&&V<=Q;){const P=w[ee],F=x[Q]=G?Zt(x[Q]):Wt(x[Q]);if(fs(P,F))T(P,F,N,null,j,W,X,J,G);else break;ee--,Q--}if(V>ee){if(V<=Q){const P=Q+1,F=PQ)for(;V<=ee;)Z(w[V],j,W,!0),V++;else{const P=V,F=V,ce=new Map;for(V=F;V<=Q;V++){const mt=x[V]=G?Zt(x[V]):Wt(x[V]);mt.key!=null&&ce.set(mt.key,V)}let fe,Oe=0;const De=Q-F+1;let Ve=!1,kt=0;const Yn=new Array(De);for(V=0;V=De){Z(mt,j,W,!0);continue}let Dt;if(mt.key!=null)Dt=ce.get(mt.key);else for(fe=F;fe<=Q;fe++)if(Yn[fe-F]===0&&fs(mt,x[fe])){Dt=fe;break}Dt===void 0?Z(mt,j,W,!0):(Yn[Dt-F]=V+1,Dt>=kt?kt=Dt:Ve=!0,T(mt,x[Dt],N,null,j,W,X,J,G),Oe++)}const Pl=Ve?mf(Yn):Un;for(fe=Pl.length-1,V=De-1;V>=0;V--){const mt=F+V,Dt=x[mt],Ol=x[mt+1],Il=mt+1{const{el:W,type:X,transition:J,children:G,shapeFlag:V}=w;if(V&6){le(w.component.subTree,x,N,z);return}if(V&128){w.suspense.move(x,N,z);return}if(V&64){X.move(w,x,N,Mn);return}if(X===q){s(W,x,N);for(let ee=0;eeJ.enter(W),j));else{const{leave:ee,delayLeave:Q,afterLeave:P}=J,F=()=>{w.ctx.isUnmounted?i(W):s(W,x,N)},ce=()=>{const fe=W._isLeaving||!!W[eo];W._isLeaving&&W[eo](!0),J.persisted&&!fe?F():ee(W,()=>{F(),P&&P()})};Q?Q(W,F,ce):ce()}else s(W,x,N)},Z=(w,x,N,z=!1,j=!1)=>{const{type:W,props:X,ref:J,children:G,dynamicChildren:V,shapeFlag:de,patchFlag:ee,dirs:Q,cacheIndex:P,memo:F}=w;if((ee===-2||V&&V.hasOnce)&&(j=!1),J!=null&&(cn(),xs(J,null,N,w,!0),un()),P!=null&&(!w.ctx||w.ctx===x)&&(x.renderCache[P]=void 0),de&256){x.ctx.deactivate(w);return}const ce=de&1&&Q,fe=!Ss(w);let Oe;if(fe&&(Oe=X&&X.onVnodeBeforeUnmount)&&Ut(Oe,x,w),de&6)H(w.component,N,z);else{if(de&128){w.suspense.unmount(N,z);return}ce&&Rn(w,null,x,"beforeUnmount"),de&64?w.type.remove(w,x,N,Mn,z):V&&!V.hasOnce&&(W!==q||ee>0&&ee&64)?ne(V,x,N,!1,!0):(W===q&&ee&384||!j&&de&16)&&ne(G,x,N),z&&ue(w)}const De=F!=null&&P==null;(fe&&(Oe=X&&X.onVnodeUnmounted)||ce||De)&&dt(()=>{Oe&&Ut(Oe,x,w),ce&&Rn(w,null,x,"unmounted"),De&&(w.el=null)},N)},ue=w=>{const{type:x,el:N,anchor:z,transition:j}=w;if(x===q){ke(N,z);return}if(x===so){C(w),j&&!j.persisted&&j.afterLeave&&j.afterLeave();return}const W=()=>{i(N),j&&!j.persisted&&j.afterLeave&&j.afterLeave()};if(w.shapeFlag&1&&j&&!j.persisted){const{leave:X,delayLeave:J}=j,G=()=>X(N,W);J?J(w.el,W,G):G()}else W()},ke=(w,x)=>{let N;for(;w!==x;)N=v(w),i(w),w=N;i(x)},H=(w,x,N)=>{const{bum:z,scope:j,job:W,subTree:X,um:J,m:G,a:V}=w;Jl(G),Jl(V),z&&si(z),j.stop(),W?(W.flags|=8,Z(X,w,x,N)):w.vnode.el&&X&&(X.transition=w.vnode.transition,Z(X,w,x,N)),J&&dt(J,x),dt(()=>{w.isUnmounted=!0},x)},ne=(w,x,N,z=!1,j=!1,W=0)=>{for(let X=W;X{if(w.shapeFlag&6)return se(w.component.subTree);if(w.shapeFlag&128)return w.suspense.next();const x=v(w.anchor||w.el),N=x&&x[Od];return N?v(N):x};let wt=!1;const Ln=(w,x,N)=>{let z;w==null?x._vnode&&(Z(x._vnode,null,null,!0),z=x._vnode.component):T(x._vnode||null,w,x,null,null,null,N),x._vnode=w,wt||(wt=!0,Ul(z),Wr(),wt=!1)},Mn={p:T,um:Z,m:le,r:ue,mt:ye,mc:R,pc:we,pbc:D,n:se,o:e};return{render:Ln,hydrate:void 0,createApp:Xd(Ln)}}function no({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Nn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function hf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function pc(e,t,n=!1){const s=e.children,i=t.children;if(pe(s)&&pe(i))for(let l=0;l>1,e[n[u]]0&&(t[s]=n[l-1]),n[l]=s)}}for(l=n.length,r=n[l-1];l-- >0;)n[l]=r,r=t[r];return n}function hc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:hc(t)}function Jl(e){if(e)for(let t=0;te.__isSuspense;function bf(e,t){t&&t.pendingBranch?pe(e)?t.effects.push(...e):t.effects.push(e):Cd(e)}const q=Symbol.for("v-fgt"),Bs=Symbol.for("v-txt"),dn=Symbol.for("v-cmt"),so=Symbol.for("v-stc"),Vn=[];let gt=null;function g(e=!1){Vn.push(gt=e?null:[])}function vc(){Vn.pop(),gt=Vn[Vn.length-1]||null}let Ps=1;function fi(e,t=!1){Ps+=e,e<0&>&&t&&(gt.hasOnce=!0)}function gc(e){return e.dynamicChildren=Ps>0?gt||Un:null,vc(),Ps>0&>&>.push(e),e}function _(e,t,n,s,i,l){return gc(o(e,t,n,s,i,l,!0))}function it(e,t,n,s,i){return gc(ie(e,t,n,s,i,!0))}function pi(e){return e?e.__v_isVNode===!0:!1}function fs(e,t){return e.type===t.type&&e.key===t.key}const _c=({key:e})=>e??null,ii=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?We(e)||et(e)||_e(e)?{i:vt,r:e,k:t,f:!!n}:e:null);function o(e,t=null,n=null,s=0,i=null,l=e===q?0:1,r=!1,u=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&_c(t),ref:t&&ii(t),scopeId:Kr,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:s,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:vt};return u?(hi(f,n),l&128&&e.normalize(f)):n&&(f.shapeFlag|=We(n)?8:16),Ps>0&&!r&>&&(f.patchFlag>0||l&6)&&f.patchFlag!==32&>.push(f),f}const ie=vf;function vf(e,t=null,n=null,s=0,i=null,l=!1){if((!e||e===Zr)&&(e=dn),pi(e)){const u=ss(e,t,!0);return n&&hi(u,n),Ps>0&&!l&>&&(u.shapeFlag&6?gt[gt.indexOf(e)]=u:gt.push(u)),u.patchFlag=-2,u}if(Ef(e)&&(e=e.__vccOpts),t){t=gf(t);let{class:u,style:f}=t;u&&!We(u)&&(t.class=he(u)),Pe(f)&&(al(f)&&!pe(f)&&(f=tt({},f)),t.style=Ue(f))}const r=We(e)?1:bc(e)?128:Fi(e)?64:Pe(e)?4:_e(e)?2:0;return o(e,t,n,s,i,r,l,!0)}function gf(e){return e?al(e)||ac(e)?tt({},e):e:null}function ss(e,t,n=!1,s=!1){const{props:i,ref:l,patchFlag:r,children:u,transition:f}=e,h=t?_f(i||{},t):i,p={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&_c(h),ref:t&&t.ref?n&&l?pe(l)?l.concat(ii(t)):[l,ii(t)]:ii(t):l,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:u,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==q?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ss(e.ssContent),ssFallback:e.ssFallback&&ss(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return f&&s&&cl(p,f.clone(p)),p}function Me(e=" ",t=0){return ie(Bs,null,e,t)}function B(e="",t=!1){return t?(g(),it(dn,null,e)):ie(dn,null,e)}function Wt(e){return e==null||typeof e=="boolean"?ie(dn):pe(e)?ie(q,null,e.slice()):pi(e)?Zt(e):ie(Bs,null,String(e))}function Zt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ss(e)}function hi(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(pe(t))n=16;else if(typeof t=="object")if(s&65){const i=t.default;i&&(i._c&&(i._d=!1),hi(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!ac(t)?t._ctx=vt:i===3&&vt&&(vt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(_e(t)){if(s&65){hi(e,{default:t});return}t={default:t,_ctx:vt},n=32}else t=String(t),s&64?(n=16,t=[Me(t)]):n=8;e.children=t,e.shapeFlag|=n}function _f(...e){const t={};for(let n=0;nst||vt;let mi,Os;{const e=Li(),t=(n,s)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(s),l=>{i.length>1?i.forEach(r=>r(l)):i[0](l)}};mi=t("__VUE_INSTANCE_SETTERS__",n=>st=n),Os=t("__VUE_SSR_SETTERS__",n=>Is=n)}const Ks=e=>{const t=st;return mi(e),e.scope.on(),()=>{e.scope.off(),mi(t)}},Xl=()=>{st&&st.scope.off(),mi(null)};function wc(e){return e.vnode.shapeFlag&4}let Is=!1;function $f(e,t=!1,n=!1){t&&Os(t);const{props:s,children:i}=e.vnode,l=wc(e);lf(e,s,l,t),uf(e,i,n||t);const r=l?xf(e,t):void 0;return t&&Os(!1),r}function xf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Bd);const{setup:s}=n;if(s){cn();const i=e.setupContext=s.length>1?Cf(e):null,l=Ks(e),r=Vs(s,e,0,[e.props,i]),u=br(r);if(un(),l(),(u||e.sp)&&!Ss(e)&&Gr(e),u){if(r.then(Xl,Xl),t)return r.then(f=>{Os(!0);try{Zl(e,f,t)}finally{Os(!1)}}).catch(f=>{Ri(f,e,0)});e.asyncDep=r}else Zl(e,r)}else kc(e)}function Zl(e,t,n){_e(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Pe(t)&&(e.setupState=jr(t)),kc(e)}function kc(e,t,n){const s=e.type;e.render||(e.render=s.render||Kt);{const i=Ks(e);cn();try{Kd(e)}finally{un(),i()}}}const Sf={get(e,t){return nt(e,"get",""),e[t]}};function Cf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Sf),slots:e.slots,emit:e.emit,expose:t}}function ji(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(jr(bd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Cs)return Cs[n](e)},has(t,n){return n in t||n in Cs}})):e.proxy}function Tf(e,t=!0){return _e(e)?e.displayName||e.name:e.name||t&&e.__name}function Ef(e){return _e(e)&&"__vccOpts"in e}const $=(e,t)=>wd(e,t,Is);function bi(e,t,n){try{fi(-1);const s=arguments.length;return s===2?Pe(t)&&!pe(t)?pi(t)?ie(e,null,[t]):ie(e,t):ie(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&pi(n)&&(n=[n]),ie(e,t,n))}finally{fi(1)}}const Af="3.5.43";let Po;const Ql=typeof window<"u"&&window.trustedTypes;if(Ql)try{Po=Ql.createPolicy("vue",{createHTML:e=>e})}catch{}const $c=Po?e=>Po.createHTML(e):e=>e,Pf="http://www.w3.org/2000/svg",Of="http://www.w3.org/1998/Math/MathML",Xt=typeof document<"u"?document:null,ea=Xt&&Xt.createElement("template"),If={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const i=t==="svg"?Xt.createElementNS(Pf,e):t==="mathml"?Xt.createElementNS(Of,e):n?Xt.createElement(e,{is:n}):Xt.createElement(e);return e==="select"&&s&&s.multiple!=null&&i.setAttribute("multiple",s.multiple),i},createText:e=>Xt.createTextNode(e),createComment:e=>Xt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Xt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,i,l){const r=n?n.previousSibling:t.lastChild;if(i&&(i===l||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===l||!(i=i.nextSibling)););else{ea.innerHTML=$c(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const u=ea.content;if(s==="svg"||s==="mathml"){const f=u.firstChild;for(;f.firstChild;)u.appendChild(f.firstChild);u.removeChild(f)}t.insertBefore(u,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Lf=Symbol("_vtc");function Mf(e,t,n){const s=e[Lf];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ta=Symbol("_vod"),Rf=Symbol("_vsh"),Nf=Symbol(""),Ff=/(?:^|;)\s*display\s*:/;function Df(e,t,n){const s=e.style,i=We(n);let l=!1;if(n&&!i){if(t)if(We(t))for(const r of t.split(";")){const u=r.slice(0,r.indexOf(":")).trim();n[u]==null&&bs(s,u,"")}else for(const r in t)n[r]==null&&bs(s,r,"");for(const r in n){r==="display"&&(l=!0);const u=n[r];u!=null?jf(e,r,!We(t)&&t?t[r]:void 0,u)||bs(s,r,u):bs(s,r,"")}}else if(i){if(t!==n){const r=s[Nf];r&&(n+=";"+r),s.cssText=n,l=Ff.test(n)}}else t&&e.removeAttribute("style");ta in e&&(e[ta]=l?s.display:"",e[Rf]&&(s.display="none"))}const Zs=/\s*!important$/;function bs(e,t,n){if(pe(n))n.forEach(s=>bs(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))Zs.test(n)?e.setProperty(t,n.replace(Zs,""),"important"):e.setProperty(t,n);else{const s=Uf(e,t);Zs.test(n)?e.setProperty(En(s),n.replace(Zs,""),"important"):e[s]=n}}const na=["Webkit","Moz","ms"],io={};function Uf(e,t){const n=io[t];if(n)return n;let s=ct(t);if(s!=="filter"&&s in e)return io[t]=s;s=Oi(s);for(let i=0;ioo||(zf.then(()=>oo=0),oo=Date.now());function Yf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;const i=n.value;if(pe(i)){const l=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{l.call(s),s._stopped=!0};const r=i.slice(),u=[s];for(let f=0;fe.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gf=(e,t,n,s,i,l)=>{const r=i==="svg";t==="class"?Mf(e,s,r):t==="style"?Df(e,n,s):Ei(t)?Ai(t)||Vf(e,t,n,s,l):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Jf(e,t,s,r))?(oa(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ia(e,t,s,r,l,t!=="value")):e._isVueCE&&(Xf(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!We(s)))?oa(e,ct(t),s,l,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ia(e,t,s,r))};function Jf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&aa(t)&&_e(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return aa(t)&&We(n)?!1:t in e}function Xf(e,t){const n=e._def.props;if(!n)return!1;const s=ct(t);return Array.isArray(n)?n.some(i=>ct(i)===s):Object.keys(n).some(i=>ct(i)===s)}const xn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return pe(t)?n=>si(t,n):t};function Zf(e){e.target.composing=!0}function ra(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const _t=Symbol("_assign"),Qs=Symbol("_initialValue");function lo(e,t,n){return t&&(e=e.trim()),n&&(e=Ii(e)),e}const Xe={created(e,{modifiers:{lazy:t,trim:n,number:s}},i){e.parentNode&&(e.type==="text"?e[Qs]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[Qs]=e.defaultValue.replace(/\r\n?/g,` +`))),e[_t]=xn(i);const l=s||i.props&&i.props.type==="number";nn(e,t?"change":"input",r=>{r.target.composing||e[_t](lo(e.value,n,l))}),(n||l)&&nn(e,"change",()=>{e.value=lo(e.value,n,l)}),t||(nn(e,"compositionstart",Zf),nn(e,"compositionend",ra),nn(e,"change",ra))},mounted(e,{value:t,modifiers:{trim:n,number:s}}){const i=t??"",l=e[Qs];delete e[Qs],l!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==l?e[_t](lo(e.value,n,s)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:i,number:l}},r){if(e[_t]=xn(r),e.composing)return;const u=(l||e.type==="number")&&!/^0\d/.test(e.value)?Ii(e.value):e.value,f=t??"";if(u===f)return;const h=e.getRootNode();(h instanceof Document||h instanceof ShadowRoot)&&h.activeElement===e&&e.type!=="range"&&(s&&t===n||i&&e.value.trim()===f)||(e.value=f)}},Qf={deep:!0,created(e,t,n){e[_t]=xn(n),nn(e,"change",()=>{const s=e._modelValue,i=is(e),l=e.checked,r=e[_t];if(pe(s)){const u=el(s,i),f=u!==-1;if(l&&!f)r(s.concat(i));else if(!l&&f){const h=[...s];h.splice(u,1),r(h)}}else if(rn(s)){const u=new Set(s);l?u.add(i):u.delete(i),r(u)}else r(xc(e,l))})},mounted:ca,beforeUpdate(e,t,n){e[_t]=xn(n),ca(e,t,n)}};function ca(e,{value:t,oldValue:n},s){e._modelValue=t;let i;if(pe(t))i=el(t,s.props.value)>-1;else if(rn(t))i=t.has(s.props.value);else{if(t===n)return;i=Rt(t,xc(e,!0))}e.checked!==i&&(e.checked=i)}const ao={created(e,{value:t},n){e.checked=Rt(t,n.props.value),e[_t]=xn(n),nn(e,"change",()=>{e[_t](is(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e[_t]=xn(s),t!==n&&(e.checked=Rt(t,s.props.value))}},Wn={deep:!0,created(e,{value:t,modifiers:{number:n}},s){e._modelValue=t,nn(e,"change",()=>{const i=Array.prototype.filter.call(e.options,f=>f.selected).map(f=>n?Ii(is(f)):is(f)),l=e.multiple,r=l?rn(e._modelValue)?new Set(i):i:i[0],u=e._pendingValue=[l,l?pe(r)?i.slice():i:r];try{e[_t](r)}finally{Ni(()=>{e._pendingValue===u&&(e._pendingValue=void 0)})}}),e[_t]=xn(s)},mounted(e,{value:t}){ua(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[_t]=xn(n)},updated(e,{value:t}){const n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!ep(t,n[1],n[0]))&&ua(e,t)}};function ep(e,t,n){if(!n||pe(e))return Rt(e,t);if(rn(e)){if(e.size!==t.length)return!1;for(const s of t)if(!e.has(s))return!1;return!0}return!1}function ua(e,t){const n=e.multiple,s=pe(t);if(!(n&&!s&&!rn(t))){for(let i=0,l=e.options.length;iString(h)===String(u)):r.selected=el(t,u)>-1}else r.selected=t.has(u);else if(Rt(is(r),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function is(e){return"_value"in e?e._value:e.value}function xc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const tp=["ctrl","shift","alt","meta"],np={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>tp.some(n=>e[`${n}Key`]&&!t.includes(n))},Ot=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((i,...l)=>{for(let r=0;r{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(i=>{if(!("key"in i))return;const l=En(i.key);if(t.some(r=>r===l||sp[r]===l))return e(i)}))},ip=tt({patchProp:Gf},If);let da;function op(){return da||(da=ff(ip))}const lp=((...e)=>{const t=op().createApp(...e),{mount:n}=t;return t.mount=s=>{const i=rp(s);if(!i)return;const l=t._component;!_e(l)&&!l.render&&!l.template&&(l.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const r=n(i,!1,ap(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),r},t});function ap(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function rp(e){return We(e)?document.querySelector(e):e}const cp="modulepreload",up=function(e,t){return new URL(e,t).href},fa={},bn=function(t,n,s){let i=Promise.resolve();if(n&&n.length>0){let h=function(p){return Promise.all(p.map(b=>Promise.resolve(b).then(v=>({status:"fulfilled",value:v}),v=>({status:"rejected",reason:v}))))};const r=document.getElementsByTagName("link"),u=document.querySelector("meta[property=csp-nonce]"),f=u?.nonce||u?.getAttribute("nonce");i=h(n.map(p=>{if(p=up(p,s),p in fa)return;fa[p]=!0;const b=p.endsWith(".css"),v=b?'[rel="stylesheet"]':"";if(s)for(let I=r.length-1;I>=0;I--){const T=r[I];if(T.href===p&&(!b||T.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${p}"]${v}`))return;const y=document.createElement("link");if(y.rel=b?"stylesheet":cp,b||(y.as="script"),y.crossOrigin="",y.href=p,f&&y.setAttribute("nonce",f),document.head.appendChild(y),b)return new Promise((I,T)=>{y.addEventListener("load",I),y.addEventListener("error",()=>T(new Error(`Unable to preload CSS for ${p}`)))})}))}function l(r){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=r,window.dispatchEvent(u),!u.defaultPrevented)throw r}return i.then(r=>{for(const u of r||[])u.status==="rejected"&&l(u.reason);return t().catch(l)})},dp={de:{name:"Deutsch",english:"German",script:"latin",plural:"one_other",clock:"24",checked:!1},"en-GB":{name:"English (UK)",english:"English (UK)",script:"latin",plural:"one_other",clock:"24",checked:!0},en:{name:"English (US)",english:"English (US)",script:"latin",plural:"one_other",clock:"12",checked:!0},es:{name:"Español",english:"Spanish",script:"latin",plural:"one_other",clock:"24",checked:!1},fr:{name:"Français",english:"French",script:"latin",plural:"one_upto_1",clock:"24",checked:!1},it:{name:"Italiano",english:"Italian",script:"latin",plural:"one_other",clock:"24",checked:!1},nl:{name:"Nederlands",english:"Dutch",script:"latin",plural:"one_other",clock:"24",checked:!1},pl:{name:"Polski",english:"Polish",script:"latin",plural:"slavic_pl",clock:"24",checked:!1},pt:{name:"Português",english:"Portuguese",script:"latin",plural:"one_other",clock:"24",checked:!1}};const vi=typeof window<"u",Pn=(e,t=!1)=>t?Symbol.for(e):Symbol(e),fp=(e,t,n)=>pp({l:e,k:t,s:n}),pp=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Ye=e=>typeof e=="number"&&isFinite(e),Cc=e=>ml(e)==="[object Date]",gi=e=>ml(e)==="[object RegExp]",hl=e=>Fe(e)&&Object.keys(e).length===0,ot=Object.assign,hp=Object.create,Ie=(e=null)=>hp(e);let pa;const mp=()=>pa||(pa=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:Ie()),bp=Object.prototype.hasOwnProperty;function St(e,t){return bp.call(e,t)}const je=Array.isArray,Be=e=>typeof e=="function",ae=e=>typeof e=="string",Ke=e=>typeof e=="boolean",Se=e=>e!==null&&typeof e=="object",vp=e=>Se(e)&&Be(e.then)&&Be(e.catch),Tc=Object.prototype.toString,ml=e=>Tc.call(e),Fe=e=>ml(e)==="[object Object]",gp=e=>e==null?"":je(e)||Fe(e)&&e.toString===Tc?JSON.stringify(e,null,2):String(e);function _p(e,t=""){return e.reduce((n,s,i)=>i===0?n+s:n+t+s,"")}function yp(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}function ha(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/").replace(/=/g,"=")}function wp(e){return e.replace(/&(?![a-z0-9#]{2,6};)/gi,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}const kp=/^javascript:/i,$p=/^(?:href|src|action|formaction)$/i,xp=/&#(?:x([0-9a-f]+)|(\d+));?/gi,Sp=/&(?:Tab|NewLine);/g,Cp=/:?/gi,Tp=/[\u0000-\u0020\u007f-\u009f]/g,Ep=/(?:^|[\s"'<>/])on\w+\s*=\s*["']?[^"'>]+["']?/i,Ap=/(^|[\s"'<>/])on(\w+\s*=)/gi,Pp=/(^|[\s"'<>/])((?:href|src|action|formaction)\s*=\s*)([^\s"'=<>`]+)/gi;function Op(e,t,n){const s=t||n;if(!s)return e;const i=Number.parseInt(s,t?16:10);return i<=127?String.fromCharCode(i):e}function bl(e){const t=e.replace(xp,Op).replace(Sp,"").replace(Cp,":").replace(Tp,"");return kp.test(t)}function Ip(e){const t=/url\s*\(/gi;let n="",s=0,i;for(;(i=t.exec(e))!==null;){const l=i.index,r=t.lastIndex-1;let u=r+1,f=1,h=null;for(;u`${n}="${ma(n,s)}"`),e=e.replace(/([\w:-]+)\s*=\s*'([^']*)'/g,(t,n,s)=>`${n}='${ma(n,s)}'`),Ep.test(e)&&(e=e.replace(Ap,"$1on$2")),e=e.replace(Pp,(t,n,s,i)=>bl(i)?`${n}${s}about:blank`:t),e}const ba=e=>!Se(e)||je(e);function oi(e,t){if(ba(e)||ba(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:s,des:i}=n.pop();Object.keys(s).forEach(l=>{if(l==="__proto__")return;const r=s[l];if(je(r)){const u=[];u.length=r.length,i[l]=u,n.push({src:r,des:u})}else Se(r)?((!Se(i[l])||je(i[l]))&&(i[l]=Ie()),n.push({src:r,des:i[l]})):i[l]=r})}}const Mp=17;function Ec(e,t,n={}){const{domain:s,messages:i,args:l}=n,r=e,u=new SyntaxError(String(r));return u.code=e,u.domain=s,u}function zt(e){return Se(e)&&vl(e)===0&&(St(e,"b")||St(e,"body"))}const Ac=["b","body"];function Rp(e){return On(e,Ac)}const Pc=["c","cases"];function Np(e){return On(e,Pc,[])}const Oc=["s","static"];function Fp(e){return On(e,Oc)}const Ic=["i","items"];function Dp(e){return On(e,Ic,[])}const Lc=["t","type"];function vl(e){return On(e,Lc)}const Mc=["v","value"];function ei(e,t){const n=On(e,Mc);if(n!=null)return n;throw Ls(t)}const Rc=["m","modifier"];function Up(e){return On(e,Rc)}const Nc=["k","key"];function jp(e){const t=On(e,Nc);if(t)return t;throw Ls(6)}function On(e,t,n){for(let s=0;sHp(n,e)}function Hp(e,t){const n=Rp(t);if(n==null)throw Ls(0);if(vl(n)===1){const l=Np(n);return e.plural(l.reduce((r,u)=>[...r,ga(e,u)],[]))}else return ga(e,n)}function ga(e,t){const n=Fp(t);if(n!=null)return e.type==="text"?n:e.normalize([n]);{const s=Dp(t).reduce((i,l)=>[...i,Oo(e,l)],[]);return e.normalize(s)}}function Oo(e,t){const n=vl(t);switch(n){case 3:return ei(t,n);case 9:return ei(t,n);case 4:{const s=t;if(St(s,"k")&&s.k)return e.interpolate(e.named(s.k));if(St(s,"key")&&s.key)return e.interpolate(e.named(s.key));throw Ls(n)}case 5:{const s=t;if(St(s,"i")&&Ye(s.i))return e.interpolate(e.list(s.i));if(St(s,"index")&&Ye(s.index))return e.interpolate(e.list(s.index));throw Ls(n)}case 6:{const s=t,i=Up(s),l=jp(s);return e.linked(Oo(e,l),i?Oo(e,i):void 0,e.type)}case 7:return ei(t,n);case 8:return ei(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}let _a=Ie();function Vp(e,t){{const n=e.cacheKey;if(n){const s=_a[n];return s||(_a[n]=va(e))}else return va(e)}}const sn={INVALID_ARGUMENT:Mp,INVALID_DATE_ARGUMENT:18,INVALID_ISO_DATE_ARGUMENT:19,NOT_SUPPORT_LOCALE_PROMISE_VALUE:21,NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:22,NOT_SUPPORT_LOCALE_TYPE:23},Wp=24;function on(e){return Ec(e,null,void 0)}function gl(e,t){return t.locale!=null?ya(t.locale):ya(e.locale)}let ro;function ya(e){if(ae(e))return e;if(Be(e)){if(e.resolvedOnce&&ro!=null)return ro;if(e.constructor.name==="Function"){const t=e();if(vp(t))throw on(sn.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return ro=t}else throw on(sn.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw on(sn.NOT_SUPPORT_LOCALE_TYPE)}function Bp(e,t,n){return[...new Set([n,...je(t)?t:Se(t)?Object.keys(t).filter(s=>s!=="default"):ae(t)?[t]:[n]])]}function Io(e,t,n){const s=ae(n)?n:_i,i=e;let l;Se(t)?(i.__localeChainObjectCache||(i.__localeChainObjectCache=new WeakMap),l=i.__localeChainObjectCache.get(t),l||(l=new Map,i.__localeChainObjectCache.set(t,l))):(i.__localeChainCache||(i.__localeChainCache=new Map),l=i.__localeChainCache.get(t),l||(l=new Map,i.__localeChainCache.set(t,l)));const r=l.get(s);if(r)return r;const u=[];let f=[n];for(;je(f);)f=wa(u,f,t);const h=je(t)||!Fe(t)?t:t.default?t.default:null;return f=ae(h)?[h]:h,je(f)&&wa(u,f,!1),l.set(s,u),u}function wa(e,t,n){let s=!0;for(let i=0;i{r===void 0?r=u:r+=u},v[1]=()=>{r!==void 0&&(t.push(r),r=void 0)},v[2]=()=>{v[0](),i++},v[3]=()=>{if(i>0)i--,s=4,v[0]();else{if(i=0,r===void 0||(r=Xp(r),r===!1))return!1;v[1]()}};function y(){const I=e[n+1];if(s===5&&I==="'"||s===6&&I==='"')return n++,u="\\"+I,v[0](),!0}for(;s!==null;)if(n++,l=e[n],!(l==="\\"&&y())){if(f=Jp(l),b=In[s],h=b[f]||b.l||8,h===8||(s=h[0],h[1]!==void 0&&(p=v[h[1]],p&&(u=l,p()===!1))))return;if(s===7)return t}}const ka=new Map;function Qp(e,t){return Se(e)?e[t]:null}function eh(e,t){if(!Se(e))return null;let n=ka.get(t);if(n||(n=Zp(t),n&&ka.set(t,n)),!n)return null;const s=n.length;let i=e,l=0;for(;l`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function nh(){return{upper:(e,t)=>t==="text"&&ae(e)?e.toUpperCase():t==="vnode"&&Se(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&ae(e)?e.toLowerCase():t==="vnode"&&Se(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&ae(e)?$a(e):t==="vnode"&&Se(e)&&"__v_isVNode"in e?$a(e.children):e}}let Dc;function sh(e){Dc=e}let Uc;function ih(e){Uc=e}let jc;function oh(e){jc=e}let Hc=null;const xa=e=>{Hc=e},Sa=()=>Hc;let Ca=0;function lh(e={}){const t=Be(e.onWarn)?e.onWarn:yp,n=ae(e.version)?e.version:th,s=ae(e.locale)||Be(e.locale)?e.locale:_i,i=Be(s)?_i:s,l=je(e.fallbackLocale)||Fe(e.fallbackLocale)||ae(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:i,r=Fe(e.messages)?e.messages:co(i),u=Fe(e.datetimeFormats)?e.datetimeFormats:co(i),f=Fe(e.numberFormats)?e.numberFormats:co(i),h=ot(Ie(),e.modifiers,nh()),p=e.pluralRules||Ie(),b=Be(e.missing)?e.missing:null,v=Ke(e.missingWarn)||gi(e.missingWarn)?e.missingWarn:!0,y=Ke(e.fallbackWarn)||gi(e.fallbackWarn)?e.fallbackWarn:!0,I=!!e.fallbackFormat,T=!!e.unresolving,k=Be(e.postTranslation)?e.postTranslation:null,A=Fe(e.processor)?e.processor:null,S=Ke(e.warnHtmlMessage)?e.warnHtmlMessage:!0,U=!!e.escapeParameter,C=Be(e.messageCompiler)?e.messageCompiler:Dc,K=Be(e.messageResolver)?e.messageResolver:Uc||Qp,O=Be(e.localeFallbacker)?e.localeFallbacker:jc||Bp,E=Se(e.fallbackContext)?e.fallbackContext:void 0,R=e,L=Se(R.__datetimeFormatters)?R.__datetimeFormatters:new Map,D=Se(R.__numberFormatters)?R.__numberFormatters:new Map,M=Se(R.__meta)?R.__meta:{};Ca++;const Y={version:n,cid:Ca,locale:s,fallbackLocale:l,messages:r,modifiers:h,pluralRules:p,missing:b,missingWarn:v,fallbackWarn:y,fallbackFormat:I,unresolving:T,postTranslation:k,processor:A,warnHtmlMessage:S,escapeParameter:U,messageCompiler:C,messageResolver:K,localeFallbacker:O,fallbackContext:E,onWarn:t,__meta:M};return Y.datetimeFormats=u,Y.numberFormats=f,Y.__datetimeFormatters=L,Y.__numberFormatters=D,Y}const co=e=>({[e]:Ie()});function Vc(e,t,n,s,i){const{missing:l,onWarn:r}=e;if(l!==null){const u=l(e,n,t,i);return ae(u)?u:t}else return t}function Ta(e,t){const n=e;Se(t)?n.__localeChainObjectCache?.delete(t):n.__localeChainCache?.delete(t)}function ti(e,t,n){Ta(e,n),e.fallbackContext&&Ta(e.fallbackContext,n),e.localeFallbacker(e,n,t)}function ah(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function rh(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let s=n+1;s{s.includes(f)?u[f]=i[f]:t[f]=i[f]}),ae(l)?t.locale=l:Fe(l)&&(u=l),Fe(r)&&(u=r),u}function Ea(e,...t){const{datetimeFormats:n,unresolving:s,onWarn:i}=e,{__datetimeFormatters:l}=e;if(!ae(t[0])&&!Cc(t[0])&&!Ye(t[0]))return yi;const[r,u,f,h]=Lo(...t),p=Ke(f.missingWarn)?f.missingWarn:e.missingWarn,b=Ke(f.fallbackWarn)?f.fallbackWarn:e.fallbackWarn,v=!!f.part,y=gl(e,f);if(!ae(r)||r===""){const S=new Intl.DateTimeFormat(y.replace(/!/g,""),h);return v?S.formatToParts(u):S.format(u)}const I=Wc(e,r,y,n,p,b,"datetime format");if(!ae(I))return s?Hi:r;const T=n[I][r],k=Bc(I,r,h);let A=l.get(k);return A||(A=new Intl.DateTimeFormat(I,ot({},T,h)),l.set(k,A)),v?A.formatToParts(u):A.format(u)}const qc=["localeMatcher","weekday","era","year","month","day","hour","minute","second","timeZoneName","formatMatcher","hour12","timeZone","dateStyle","timeStyle","calendar","dayPeriod","numberingSystem","hourCycle","fractionalSecondDigits"];function Lo(...e){const[t]=e,n=Ie(),s=Ie();let i;if(ae(t)){const r=t.match(/(\d{4}-\d{2}-\d{2})(T|\s)?(.*)/);if(!r)throw on(sn.INVALID_ISO_DATE_ARGUMENT);const u=r[3]?r[3].trim().startsWith("T")?`${r[1].trim()}${r[3].trim()}`:`${r[1].trim()}T${r[3].trim()}`:r[1].trim();i=new Date(u);try{i.toISOString()}catch{throw on(sn.INVALID_ISO_DATE_ARGUMENT)}}else if(Cc(t)){if(isNaN(t.getTime()))throw on(sn.INVALID_DATE_ARGUMENT);i=t}else if(Ye(t))i=t;else throw on(sn.INVALID_ARGUMENT);const l=zc(e,n,s,qc);return[n.key||"",i,n,l]}function Aa(e,t,n){Kc(e.__datetimeFormatters,t,n)}function Pa(e,...t){const{numberFormats:n,unresolving:s,onWarn:i}=e,{__numberFormatters:l}=e;if(!Ye(t[0]))return yi;const[r,u,f,h]=Mo(...t),p=Ke(f.missingWarn)?f.missingWarn:e.missingWarn,b=Ke(f.fallbackWarn)?f.fallbackWarn:e.fallbackWarn,v=!!f.part,y=gl(e,f);if(!ae(r)||r===""){const S=new Intl.NumberFormat(y.replace(/!/g,""),h);return v?S.formatToParts(u):S.format(u)}const I=Wc(e,r,y,n,p,b,"number format");if(!ae(I))return s?Hi:r;const T=n[I][r],k=Bc(I,r,h);let A=l.get(k);return A||(A=new Intl.NumberFormat(I,ot({},T,h)),l.set(k,A)),v?A.formatToParts(u):A.format(u)}const Yc=["localeMatcher","style","currency","currencyDisplay","currencySign","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","compactDisplay","notation","signDisplay","unit","unitDisplay","roundingMode","roundingPriority","roundingIncrement","trailingZeroDisplay"];function Mo(...e){const[t]=e,n=Ie(),s=Ie();if(!Ye(t))throw on(sn.INVALID_ARGUMENT);const i=t,l=zc(e,n,s,Yc);return[n.key||"",i,n,l]}function Oa(e,t,n){Kc(e.__numberFormatters,t,n)}const ch=e=>e,uh=e=>"",dh="text",fh=e=>e.length===0?"":_p(e),ph=gp;function uo(e,t){return e=Math.abs(e),t===2?e===1?0:1:Math.min(e,2)}function hh(e){const t=Ye(e.pluralIndex)?e.pluralIndex:-1;return Ye(e.named?.count)?e.named.count:Ye(e.named?.n)?e.named.n:t}function mh(e={}){const t=e.locale,n=hh(e),s=ae(t)&&Be(e.pluralRules?.[t])?e.pluralRules[t]:uo,i=s===uo?void 0:uo,l=A=>A[s(n,A.length,i)],r=e.list||[],u=A=>r[A],f=e.named||Ie();Ye(e.pluralIndex)&&(f.count||=e.pluralIndex,f.n||=e.pluralIndex);const h=A=>f[A];function p(A,S){const U=Be(e.messages)?e.messages(A,!!S):Se(e.messages)?e.messages[A]:!1;return U||(e.parent?e.parent.message(A):uh)}const b=A=>e.modifiers?e.modifiers[A]:ch,v=Be(e.processor?.normalize)?e.processor.normalize:fh,y=Be(e.processor?.interpolate)?e.processor.interpolate:ph,I=ae(e.processor?.type)?e.processor.type:dh,k={list:u,named:h,plural:l,linked:(A,...S)=>{const[U,C]=S;let K="text",O="";S.length===1?Se(U)?(O=U.modifier||O,K=U.type||K):ae(U)&&(O=U||O):S.length===2&&(ae(U)&&(O=U||O),ae(C)&&(K=C||K));const E=p(A,!0)(k),R=E===""||E===void 0?A:E,L=K==="vnode"&&je(R)&&O?R[0]:R;return O?b(O)(L,K):L},message:p,type:I,interpolate:y,normalize:v,values:ot(Ie(),r,f)};return k}const Ia=()=>"",ln=e=>Be(e);function La(e,...t){const{fallbackFormat:n,postTranslation:s,unresolving:i,messageCompiler:l,fallbackLocale:r,messages:u}=e,[f,h]=Ro(...t),p=Ke(h.missingWarn)?h.missingWarn:e.missingWarn,b=Ke(h.fallbackWarn)?h.fallbackWarn:e.fallbackWarn,v=Ke(h.escapeParameter)?h.escapeParameter:e.escapeParameter,y=!!h.resolvedMessage,I=ae(h.default)||Ke(h.default)?Ke(h.default)?l?f:()=>f:h.default:n?l?f:()=>f:null,T=n||I!=null&&(ae(I)||Be(I)),k=gl(e,h);v&&bh(h);let[A,S,U]=y?[f,k,u[k]||Ie()]:Gc(e,f,k,r,b,p),C=A,K=f;if(!y&&!(ae(C)||zt(C)||ln(C))&&T&&(C=I,K=C),!y&&(!(ae(C)||zt(C)||ln(C))||!ae(S)))return i?Hi:f;let O=!1;const E=()=>{O=!0},R=ln(C)?C:Jc(e,f,S,C,K,E);if(O)return C;const L=_h(e,S,U,h),D=mh(L),M=vh(e,R,D);let Y=s?s(M,f):M;return v&&ae(Y)&&(Y=Lp(Y)),Y}function bh(e){je(e.list)?e.list=e.list.map(t=>ae(t)?ha(t):t):Se(e.named)&&Object.keys(e.named).forEach(t=>{ae(e.named[t])&&(e.named[t]=ha(e.named[t]))})}function Gc(e,t,n,s,i,l){const{messages:r,onWarn:u,messageResolver:f,localeFallbacker:h}=e,p=h(e,s,n);let b=Ie(),v,y=null;const I="translate";for(let T=0;Ts);return h.locale=n,h.key=t,h}const f=r(s,gh(e,n,i,s,u,l));return f.locale=n,f.key=t,f.source=s,f}function vh(e,t,n){return t(n)}function Ro(...e){const[t,n,s]=e,i=Ie();if(!ae(t)&&!Ye(t)&&!ln(t)&&!zt(t))throw on(sn.INVALID_ARGUMENT);const l=Ye(t)?String(t):(ln(t),t);return Ye(n)?i.plural=n:ae(n)?i.default=n:Fe(n)&&!hl(n)?i.named=n:je(n)&&(i.list=n),Ye(s)?i.plural=s:ae(s)?i.default=s:Fe(s)&&ot(i,s),[l,i]}function gh(e,t,n,s,i,l){return{locale:t,key:n,warnHtmlMessage:i,onError:r=>{throw l&&l(r),r},onCacheKey:r=>fp(t,n,r)}}function _h(e,t,n,s){const{modifiers:i,pluralRules:l,messageResolver:r,fallbackLocale:u,fallbackWarn:f,missingWarn:h,fallbackContext:p}=e,v={locale:t,modifiers:i,pluralRules:l,messages:(y,I)=>{let T=r(n,y);if(T==null&&(p||I)){const[k,,A]=Gc(p||e,y,t,u,f,h);T=k??r(A,y)}if(ae(T)||zt(T)){let k=!1;const S=Jc(e,y,t,T,y,()=>{k=!0});return k?Ia:S}else return ln(T)?T:Ia}};return e.processor&&(v.processor=e.processor),s.list&&(v.list=s.list),s.named&&(v.named=s.named),Ye(s.plural)&&(v.pluralIndex=s.plural),v}const yh="11.4.12",yt={UNEXPECTED_RETURN_TYPE:Wp,INVALID_ARGUMENT:25,MUST_BE_CALL_SETUP_TOP:26,NOT_INSTALLED:27,REQUIRED_VALUE:28,INVALID_VALUE:29,NOT_INSTALLED_WITH_PROVIDE:31,UNEXPECTED_ERROR:32,NOT_AVAILABLE_COMPOSITION_IN_LEGACY:34};function Et(e,...t){return Ec(e,null,void 0)}const No=Pn("__translateVNode"),Fo=Pn("__datetimeParts"),Do=Pn("__numberParts"),wh=Pn("__setPluralRules"),kh=Pn("__injectWithOption"),Zn=Pn("__dispose");let Xc=null;{const e=mp().__VUE_INSTANCE_SETTERS__;je(e)&&e.push(t=>{Xc=t})}function Ms(e){if(!Se(e)||zt(e))return e;for(const t in e)if(St(e,t))if(!t.includes("."))Se(e[t])&&Ms(e[t]);else{const n=t.split("."),s=n.length-1;let i=e,l=!1;for(let r=0;r{if("locale"in u&&"resource"in u){const{locale:f,resource:h}=u;f?(r[f]=r[f]||Ie(),oi(h,r[f])):oi(h,r)}else ae(u)&&oi(JSON.parse(u),r)}),i==null&&l)for(const u in r)St(r,u)&&Ms(r[u]);return r}function $h(e){return e.type}function xh(e,t,n){let s=Se(t.messages)?t.messages:Ie();"__i18nGlobal"in n&&(s=Zc(e.locale.value,{messages:s,__i18n:n.__i18nGlobal}));const i=Object.keys(s);i.length&&i.forEach(l=>{e.mergeLocaleMessage(l,s[l])});{if(Se(t.datetimeFormats)){const l=Object.keys(t.datetimeFormats);l.length&&l.forEach(r=>{e.mergeDateTimeFormat(r,t.datetimeFormats[r])})}if(Se(t.numberFormats)){const l=Object.keys(t.numberFormats);l.length&&l.forEach(r=>{e.mergeNumberFormat(r,t.numberFormats[r])})}}}function Ma(e){return ie(Bs,null,e,0)}function Qc(){return Xc??yc()}const Ra=()=>[],Sh=()=>!1;let Na=0;function Fa(e){return((t,n,s,i)=>e(n,s,Qc()||void 0,i))}function Uo(e={}){const{__root:t,__injectWithOption:n}=e,s=t===void 0,i=e.flatJson,l=vi?$e:vd;let r=Ke(e.inheritLocale)?e.inheritLocale:!0;const u=l(t&&r?t.locale.value:ae(e.locale)?e.locale:_i),f=l(t&&r?t.fallbackLocale.value:ae(e.fallbackLocale)||je(e.fallbackLocale)||Fe(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:u.value),h=l(Zc(u.value,e)),p=l(Fe(e.datetimeFormats)?e.datetimeFormats:{[u.value]:{}}),b=l(Fe(e.numberFormats)?e.numberFormats:{[u.value]:{}});let v=t?t.missingWarn:Ke(e.missingWarn)||gi(e.missingWarn)?e.missingWarn:!0,y=t?t.fallbackWarn:Ke(e.fallbackWarn)||gi(e.fallbackWarn)?e.fallbackWarn:!0,I=t?t.fallbackRoot:Ke(e.fallbackRoot)?e.fallbackRoot:!0,T=!!e.fallbackFormat,k=Be(e.missing)?e.missing:null,A=Be(e.missing)?Fa(e.missing):null,S=Be(e.postTranslation)?e.postTranslation:null,U=t?t.warnHtmlMessage:Ke(e.warnHtmlMessage)?e.warnHtmlMessage:!0,C=!!e.escapeParameter;const K=t?t.modifiers:Fe(e.modifiers)?e.modifiers:{};let O=e.pluralRules||t&&t.pluralRules,E;E=(()=>{s&&xa(null);const P={version:yh,locale:u.value,fallbackLocale:f.value,messages:h.value,modifiers:K,pluralRules:O,missing:A===null?void 0:A,missingWarn:v,fallbackWarn:y,fallbackFormat:T,unresolving:!0,postTranslation:S===null?void 0:S,warnHtmlMessage:U,escapeParameter:C,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};P.datetimeFormats=p.value,P.numberFormats=b.value,P.__datetimeFormatters=Fe(E)?E.__datetimeFormatters:void 0,P.__numberFormatters=Fe(E)?E.__numberFormatters:void 0;const F=lh(P);return s&&xa(F),F})(),ti(E,u.value,f.value);function L(){return[u.value,f.value,h.value,p.value,b.value]}const D=$({get:()=>u.value,set:P=>{E.locale=P,u.value=P}});function M(P){s||(E.fallbackContext=t?Sa():void 0);try{ti(E,u.value,P)}finally{s||(E.fallbackContext=void 0)}}const Y=$({get:()=>f.value,set:P=>{f.value=P,E.fallbackLocale=f.value,M(f.value)}}),te=$(()=>h.value),ye=$(()=>p.value),re=$(()=>b.value);function be(){return Be(S)?S:null}function ge(P){S=P,E.postTranslation=P}function we(){return k}function Ge(P){P!==null&&(A=Fa(P)),k=P,E.missing=A}const qe=(P,F,ce,fe,Oe,De)=>{L();let Ve;try{s||(E.fallbackContext=t?Sa():void 0),Ve=P(E)}finally{s||(E.fallbackContext=void 0)}if(ce!=="translate exists"&&Ye(Ve)&&Ve===Hi||ce==="translate exists"&&!Ve){const[kt,Yn]=F();return t&&I?fe(t):Oe(kt)}else{if(De(Ve))return Ve;throw Et(yt.UNEXPECTED_RETURN_TYPE)}};function le(...P){return qe(F=>Reflect.apply(La,null,[F,...P]),()=>Ro(...P),"translate",F=>Reflect.apply(F.t,F,[...P]),F=>F,F=>ae(F))}function Z(...P){const[F,ce,fe]=P;if(fe&&!Se(fe))throw Et(yt.INVALID_ARGUMENT);return le(F,ce,ot({resolvedMessage:!0},fe||{}))}function ue(...P){return qe(F=>Reflect.apply(Ea,null,[F,...P]),()=>Lo(...P),"datetime format",F=>Reflect.apply(F.d,F,[...P]),()=>yi,F=>ae(F)||je(F))}function ke(...P){return qe(F=>Reflect.apply(Pa,null,[F,...P]),()=>Mo(...P),"number format",F=>Reflect.apply(F.n,F,[...P]),()=>yi,F=>ae(F)||je(F))}function H(P){return P.map(F=>ae(F)||Ye(F)||Ke(F)?Ma(String(F)):F)}const se={normalize:H,interpolate:P=>P,type:"vnode"};function wt(...P){return qe(F=>{let ce;const fe=F;try{fe.processor=se,ce=Reflect.apply(La,null,[fe,...P])}finally{fe.processor=null}return ce},()=>Ro(...P),"translate",F=>F[No](...P),F=>[Ma(F)],F=>je(F))}function Ln(...P){return qe(F=>Reflect.apply(Pa,null,[F,...P]),()=>Mo(...P),"number format",F=>F[Do](...P),Ra,F=>ae(F)||je(F))}function Mn(...P){return qe(F=>Reflect.apply(Ea,null,[F,...P]),()=>Lo(...P),"datetime format",F=>F[Fo](...P),Ra,F=>ae(F)||je(F))}function Al(P){O=P,E.pluralRules=O}function w(P,F){return qe(()=>{if(!P)return!1;const ce=ae(F)?F:u.value,fe=ae(F)?[ce]:Io(E,f.value,ce);for(let Oe=0;Oe[P],"translate exists",ce=>Reflect.apply(ce.te,ce,[P,F]),Sh,ce=>Ke(ce))}function x(P){let F=null;const ce=Io(E,f.value,u.value);for(let fe=0;feM(f.value),{deep:!0,flush:"sync"}),t&&vi&&(Tt(t.locale,P=>{r&&(u.value=P,E.locale=P,ti(E,u.value,f.value))}),Tt(t.fallbackLocale,P=>{r&&(f.value=P,E.fallbackLocale=f.value,ti(E,u.value,f.value))}));const Q={id:Na,locale:D,fallbackLocale:Y,get inheritLocale(){return r},set inheritLocale(P){r=P,P&&t&&(D.value=t.locale.value,Y.value=t.fallbackLocale.value)},get availableLocales(){return Object.keys(h.value).sort()},messages:te,get modifiers(){return K},get pluralRules(){return O||{}},get isGlobal(){return s},get missingWarn(){return v},set missingWarn(P){v=P,E.missingWarn=v},get fallbackWarn(){return y},set fallbackWarn(P){y=P,E.fallbackWarn=y},get fallbackRoot(){return I},set fallbackRoot(P){I=P},get fallbackFormat(){return T},set fallbackFormat(P){T=P,E.fallbackFormat=T},get warnHtmlMessage(){return U},set warnHtmlMessage(P){U=P,E.warnHtmlMessage=P},get escapeParameter(){return C},set escapeParameter(P){C=P,E.escapeParameter=P},t:le,getLocaleMessage:z,setLocaleMessage:j,mergeLocaleMessage:W,getPostTranslationHandler:be,setPostTranslationHandler:ge,getMissingHandler:we,setMissingHandler:Ge,[wh]:Al};return Q.datetimeFormats=ye,Q.numberFormats=re,Q.rt=Z,Q.te=w,Q.tm=N,Q.d=ue,Q.n=ke,Q.getDateTimeFormat=X,Q.setDateTimeFormat=J,Q.mergeDateTimeFormat=G,Q.getNumberFormat=V,Q.setNumberFormat=de,Q.mergeNumberFormat=ee,Q[kh]=n,Q[No]=wt,Q[Fo]=Mn,Q[Do]=Ln,Q}const _l={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function Ch({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((s,i)=>[...s,...i.type===q?i.children:[i]],[]):t.reduce((n,s)=>{const i=e[s];return i&&(n[s]=i()),n},Ie())}function eu(){return q}const Th=Le({name:"i18n-t",props:ot({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>Ye(e)||!isNaN(e)}},_l),setup(e,t){const{slots:n,attrs:s}=t,i=e.i18n||yl({useScope:e.scope,__useComponent:!0});return()=>{const l=()=>{const f=Object.keys(n).filter(b=>b[0]!=="_"),h=Ie();e.locale&&(h.locale=e.locale),e.plural!==void 0&&(h.plural=ae(e.plural)?+e.plural:e.plural);const p=Ch(t,f);return i[No](e.keypath,p,h)},r=ot(Ie(),s),u=ae(e.tag)||Se(e.tag)?e.tag:eu();return Se(u)?bi(u,r,{default:l}):bi(u,r,l())}}}),Da=Th;function Eh(e){return je(e)&&!ae(e[0])}function tu(e,t,n,s){const{slots:i,attrs:l}=t;return()=>{const r=()=>{const h={part:!0};let p=Ie();e.locale&&(h.locale=e.locale),ae(e.format)?h.key=e.format:Se(e.format)&&(ae(e.format.key)&&(h.key=e.format.key),p=Object.keys(e.format).reduce((y,I)=>n.includes(I)?ot(Ie(),y,{[I]:e.format[I]}):y,Ie()));const b=s(e.value,h,p);let v=[h.key];return je(b)?v=b.map((y,I)=>{const T=i[y.type],k=T?T({[y.type]:y.value,index:I,parts:b}):[y.value];return Eh(k)&&(k[0].key=`${y.type}-${I}`),k}):ae(b)&&(v=[b]),v},u=ot(Ie(),l),f=ae(e.tag)||Se(e.tag)?e.tag:eu();return Se(f)?bi(f,u,{default:r}):bi(f,u,r())}}const Ah=Le({name:"i18n-n",props:ot({value:{type:Number,required:!0},format:{type:[String,Object]}},_l),setup(e,t){const n=e.i18n||yl({useScope:e.scope,__useComponent:!0});return tu(e,t,Yc,(...s)=>n[Do](...s))}}),Ua=Ah;function Ph(e,t){const n=e;if(e.mode==="composition")return n.__getInstance(t)||e.global;{const s=n.__getInstance(t);return s!=null?s.__composer:e.global.__composer}}function Oh(e){const t=r=>{const{instance:u,value:f}=r;if(!u||!u.$)throw Et(yt.UNEXPECTED_ERROR);const h=Ph(e,u.$),p=ja(f);return[Reflect.apply(h.t,h,[...Ha(p)]),h]};return{created:(r,u)=>{const[f,h]=t(u);vi&&(r.__i18nWatcher=Tt(h.locale,()=>{u.instance&&u.instance.$forceUpdate()})),r.__composer=h,r.textContent=f},unmounted:r=>{vi&&r.__i18nWatcher&&(r.__i18nWatcher(),r.__i18nWatcher=void 0,delete r.__i18nWatcher),r.__composer&&(r.__composer=void 0,delete r.__composer)},beforeUpdate:(r,{value:u})=>{if(r.__composer){const f=r.__composer,h=ja(u);r.textContent=Reflect.apply(f.t,f,[...Ha(h)])}},getSSRProps:r=>{const[u]=t(r);return{textContent:u}}}}function ja(e){if(ae(e))return{path:e};if(Fe(e)){if(!("path"in e))throw Et(yt.REQUIRED_VALUE,"path");return e}else throw Et(yt.INVALID_VALUE)}function Ha(e){const{path:t,locale:n,args:s,choice:i,plural:l}=e,r={},u=s||{};return ae(n)&&(r.locale=n),Ye(i)&&(r.plural=i),Ye(l)&&(r.plural=l),[t,u,r]}function Ih(e,t,...n){const s=Fe(n[0])?n[0]:{};(!Ke(s.globalInstall)||s.globalInstall)&&([Da.name,"I18nT"].forEach(l=>e.component(l,Da)),[Ua.name,"I18nN"].forEach(l=>e.component(l,Ua)),[Ba.name,"I18nD"].forEach(l=>e.component(l,Ba))),e.directive("t",Oh(t))}const Lh=Pn("global-vue-i18n");function Mh(e={}){const t=Ke(e.globalInjection)?e.globalInjection:!0,n=new Map,[s,i]=Rh(e),l=Pn("");function r(p){return n.get(p)||null}function u(p,b){n.set(p,b)}function f(p){n.delete(p)}const h={get mode(){return"composition"},async install(p,...b){if(p.__VUE_I18N_SYMBOL__=l,p.provide(p.__VUE_I18N_SYMBOL__,h),Fe(b[0])){const I=b[0];h.__composerExtend=I.__composerExtend,h.__vueI18nExtend=I.__vueI18nExtend}let v=null;t&&(v=Vh(p,h.global)),Ih(p,h,...b);const y=p.unmount;p.unmount=()=>{v&&v(),h.dispose(),y()}},get global(){return i},dispose(){s.stop()},__instances:n,__getInstance:r,__setInstance:u,__deleteInstance:f};return h}function yl(e={}){const t=Qc();if(t==null)throw Et(yt.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw Et(yt.NOT_INSTALLED);const n=Nh(t),s=Dh(n),i=$h(t),l=Fh(e,i);if(l==="global")return xh(s,e,i),s;if(l==="parent"){let f=Va(n,t,e.__useComponent);return f==null&&(f=s),f}if(l==="isolated"){if(n.mode!=="composition")throw Et(yt.NOT_AVAILABLE_COMPOSITION_IN_LEGACY);const f=n,h=ot({},e),p=Va(n,t);h.__root=p||s;const b=Uo(h);return f.__composerExtend&&(b[Zn]=f.__composerExtend(b)),xr()&&Xu(()=>{const y=b[Zn];y&&(y(),delete b[Zn])}),b}const r=n;let u=r.__getInstance(t);if(u==null){const f=ot({},e);"__i18n"in i&&(f.__i18n=i.__i18n),s&&(f.__root=s),u=Uo(f),r.__composerExtend&&(u[Zn]=r.__composerExtend(u)),jh(r,t,u),r.__setInstance(t,u)}return u}function Rh(e,t){const n=Ju(),s=n.run(()=>Uo(e));if(s==null)throw Et(yt.UNEXPECTED_ERROR);return[n,s]}function Nh(e){const t=$s(e.isCE?Lh:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw Et(e.isCE?yt.NOT_INSTALLED_WITH_PROVIDE:yt.UNEXPECTED_ERROR);return t}function Fh(e,t){return hl(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function Dh(e){return e.mode==="composition"?e.global:e.global.__composer}function Va(e,t,n=!1){let s=null;const i=t.root;let l=Uh(t,n);for(;l!=null;){const r=e;if(e.mode==="composition"&&(s=r.__getInstance(l)),s!=null||i===l)break;l=l.parent}return s}function Uh(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function jh(e,t,n){An(()=>{},t),dl(()=>{const s=n;e.__deleteInstance(t);const i=s[Zn];i&&(i(),delete s[Zn])},t)}const Hh=["locale","fallbackLocale","availableLocales"],Wa=["t","rt","d","n","tm","te"];function Vh(e,t){const n=Object.create(null);return Hh.forEach(i=>{const l=Object.getOwnPropertyDescriptor(t,i);if(!l)throw Et(yt.UNEXPECTED_ERROR);const r=et(l.value)?{get(){return l.value.value},set(u){l.value.value=u}}:{get(){return l.get&&l.get()}};Object.defineProperty(n,i,r)}),e.config.globalProperties.$i18n=n,Wa.forEach(i=>{const l=Object.getOwnPropertyDescriptor(t,i);if(!l||!l.value)throw Et(yt.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${i}`,l)}),()=>{delete e.config.globalProperties.$i18n,Wa.forEach(i=>{delete e.config.globalProperties[`$${i}`]})}}const Wh=Le({name:"i18n-d",props:ot({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},_l),setup(e,t){const n=e.i18n||yl({useScope:e.scope,__useComponent:!0});return tu(e,t,qc,(...s)=>n[Fo](...s))}}),Ba=Wh;sh(Vp);ih(eh);oh(Io);const Bh={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Undo"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"unknown"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Unsaved changes"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Cancel"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Open Devices & services"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Save & send"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Saving…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Read current data"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 result. Keep typing to narrow it down."},{t:2,i:[{t:4,k:"n"},{t:3,v:" results. Keep typing to narrow it down."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Close"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remove"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Change"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Loading…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Back"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copy"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"New screen"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware & USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alerts"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Connect and install"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"That didn't work. Refresh the page and try again."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"API key copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"API key is selected. Copy with Ctrl+C or Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Layout JSON copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Layout JSON is selected. Copy with Ctrl+C or Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Action name copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Action name is selected. Copy with Ctrl+C or Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"YAML is selected. Copy with Ctrl+C or Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Icon name copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Icon name is selected. Copy with Ctrl+C or Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Empty color copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Empty color is selected. Copy with Ctrl+C or Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Color name copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Color name is selected. Copy with Ctrl+C or Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Management page unreachable · retrying…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant connected"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Reconnecting to Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Screens"}},more:{t:0,b:{t:2,i:[{t:3}],s:"More"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Update"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Update"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"Queued for the update"}},available:{t:0,b:{t:2,i:[{t:3,v:"Update "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"No ESPHome profile found with this device name."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"What's new"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Full log"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"The IP address, once; new firmware reports it itself."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"IP address, e.g. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"IP address"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Start"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Installed, but not yet in Home Assistant. Add the discovered ESPHome device under Settings → Devices & services, paste the API key there, and turn on “Allow the device to perform Home Assistant actions” under Configure."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware downloaded, not yet in Home Assistant. Put it on the screen with ESPHome Web, then add the discovered ESPHome device under Settings → Devices & services, paste the API key there, and allow the Home Assistant actions under Configure."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Not yet in Home Assistant. Already flashed? Add the ESPHome device under Settings → Devices & services, then allow the Home Assistant actions under Configure. Not flashed yet? Firmware & USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copy API key"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Screens"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Add to this screen"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Cheatsheet and a test alert"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Updates, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nothing to save"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identify this screen"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Blinks the backlight and shows a card"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Needs a newer firmware"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Export layout"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Download and copy as JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Search screens, entities, actions…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Nothing matches. Type part of a screen, entity or action."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Choose a screen"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Pick one of your screens on the left to change its tiles, top bar and settings."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Start with a screen"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Connect a CYD or Guition via USB to your Home Assistant machine. Profile, firmware, and the first flash happen in one go."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Install new screen"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"You have unsaved changes. Open a different screen anyway?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Replace the unsaved layout with a copy of the other screen's?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Replace the unsaved layout with the imported one?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Saved. Your screen is being updated."}},other:{t:0,b:{t:2,i:[{t:3,v:"Saved. "},{t:4,k:"name"},{t:3,v:" is being updated."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Saved. The screen is being updated."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Saved. Your newest change isn't sent yet: press Save & send again."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" blinks and shows a card for a few seconds."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · changes are saved"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Layout"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Screen settings"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Saved · sent to screen"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"All saved"}},more:{t:0,b:{t:2,i:[{t:3}],s:"More"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identify"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"blink the screen"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Needs firmware 0.2.31 or newer"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"from Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copy layout from…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" screen"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" screens"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"no other screen"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" tile"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" tiles"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Export layout"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Import layout…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"Override YAML"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"advanced"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"No ESPHome profile found for this screen"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Update firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" removed"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"There is no room for this tile on page "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"No page is free for a full-page tile. Free a page first."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"This screen already has a tile that goes to page "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Layout of "},{t:4,k:"name"},{t:3,v:" copied. Save & send when it looks right."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Layout of "},{t:4,k:"name"},{t:3,v:" copied: "},{t:4,k:"kept"},{t:3,v:" of "},{t:4,k:"total"},{t:3,v:" tiles fit this screen's firmware. Save & send when it looks right."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Layout imported. Save & send when it looks right."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Layout imported: "},{t:4,k:"kept"},{t:3,v:" of "},{t:4,k:"total"},{t:3,v:" tiles fit this screen's firmware. Save & send when it looks right."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"That isn't JSON. Export a layout first, or paste one from another ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"No tiles in this file. Expected a layout exported from ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" page · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tiles"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pages · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tiles"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Add your first light, scene, or device from the library."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Tap the top bar or a tile to change it. Drag to move; drop on the next page for a new one."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Empty slots and fixed positions work from firmware 0.2.26. This screen (firmware "},{t:4,k:"firmware"},{t:3,v:") shifts the tiles up to the first free slot until that update."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Screen layout"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Add page"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 page is the most"},{t:2,i:[{t:4,k:"n"},{t:3,v:" pages is the most"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Page "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remove page"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"The pages after this one shift up one slot"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Edit top bar"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Empty slot. Click to add a tile here, or drag one over."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Empty slot "},{t:4,k:"slot"},{t:3,v:" on page "},{t:4,k:"page"},{t:3,v:": add the next tile here"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Next tile goes here"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Empty"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Library"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entity"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entities"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search by name, device, or room…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Add an entity"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"All"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Lights"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climate"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Switches"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Fans"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Covers"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scenes"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Vacuum"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensors"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Weather"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Values"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selects"}},person:{t:0,b:{t:2,i:[{t:3}],s:"People"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timers"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Screen"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Room"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"All rooms"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Hide placed"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Hide what is already on this screen"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Everything here is already on this screen."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No entities found. Try a different name, room or filter."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"This screen holds 1 tile."},{t:2,i:[{t:3,v:"This screen holds "},{t:4,k:"n"},{t:3,v:" tiles."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"This screen holds 1 tile; update its firmware for 48."},{t:2,i:[{t:3,v:"This screen holds "},{t:4,k:"n"},{t:3,v:" tiles; update its firmware for 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Drag onto a page, or tap + to add to the first free slot. ⌘K searches everything."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Light"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climate"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Vacuum"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Fan"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Cover"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Switch"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Switch"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scene"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Weather"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Value"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Value"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Select"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Select"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Screen"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sun"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Person"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Camera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Image"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entity"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"large value"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"weather forecast"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"graph"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"digital clock"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"analog clock"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"sun path"}},live:{t:0,b:{t:2,i:[{t:3}],s:"live picture"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"album cover"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"double"}},full:{t:0,b:{t:2,i:[{t:3}],s:"full page"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Name on the screen"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatic (from Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatic (default)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The screen shows a chosen icon from firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Goes to page"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (empty)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Navigation tiles need firmware 0.2.62: press Update on the screen first."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"This screen has no page "},{t:4,k:"page"},{t:3,v:", so a tap opens its last page. Choose another page."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"A tap on the tile opens that page."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Display"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Digital clock"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Analog clock"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Name and status"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Large value"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Weather forecast"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Graph"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Sun path"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Live picture"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"A small picture of the camera in the icon's place, refreshed at the pace below while the page is on screen. A tap still opens it full screen."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"A live picture needs firmware 0.2.77 or newer: press Update on the screen after saving."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Album cover"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"The album cover of what plays in the icon's place, like Home Assistant's own tile; a player without a picture keeps its icon. A tap still opens the card."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The album cover on the tile needs firmware 0.2.78 or newer: press Update on the screen after saving."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant has no numbers for this entity, so the graph stays empty. Choose another display."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"This weather service has no daily forecast in Home Assistant. Choose another display."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Every "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Size"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Double-width"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Full page"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Full page: one big button in the tile's own colour; a slider, controls or a graph sit at the bottom of it."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"A full-page tile needs firmware 0.2.62: press Update on the screen first."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Page"}},new:{t:0,b:{t:2,i:[{t:3}],s:"New page"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Direct control on the tile"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant doesn't offer this control for this entity, so it stays empty on the screen. Choose another one."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"At the bottom of the full-page tile; a tap anywhere else works as set below."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"On the right of the double-width tile, like the rows in Home Assistant. Tapping the name works as set below."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The screen shows direct control from firmware 0.2.19; until then the tile stays as it was."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"On tap"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatic"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Open control"}},none:{t:0,b:{t:2,i:[{t:3}],s:"View only"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"On / off"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Perform action"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant can't turn this on and off, so a tap does nothing. Choose another option."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The screen switches this from firmware 0.2.58: press Update on the screen. Until then a tap opens its card."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Hold the tile to open its card."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Small slider on the tile"}},no:{t:0,b:{t:2,i:[{t:3}],s:"No"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Yes, control directly"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant has nothing a slider can change for this entity. Choose No."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"History"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" hour"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" hours"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pastel background"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Background: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", slot "},{t:4,k:"slot"},{t:3,v:" on page "},{t:4,k:"page"},{t:3,v:". Enter: configure, arrow keys: move"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remove tile"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Remove "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Asking Home Assistant which actions this entity has…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant isn't answering right now. Try again in a moment."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Choose an action"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search, for example toggle, position, or play"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Search for an action"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No action found."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant doesn't offer this action for this entity any more, so a tap does nothing. Choose another one."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (optional)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Not set"}},on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant needs "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The screen performs an action from firmware 0.2.58: press Update on the screen. Until then a tap works as Automatic."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icon"}},none:{t:0,b:{t:2,i:[{t:3}],s:"No icon"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search, for example lamp, music, or door"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Search for an icon"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"No icon, text only"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icon: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No icon found."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Current data"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Connection, status, and supported properties"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Reading…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Fetching current HA status…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Status: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Small slider: "},{t:4,k:"slider"},{t:3,v:" · Display: "},{t:4,k:"display"},{t:3,v:" · Size: "},{t:4,k:"size"},{t:3,v:" · Control: "},{t:4,k:"control"},{t:3,v:" · Background: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"yes"}},no:{t:0,b:{t:2,i:[{t:3}],s:"no"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"none"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Default"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Read again"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" removed from the top bar"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"The top bar has room for 1 item."},{t:2,i:[{t:3,v:"The top bar has room for "},{t:4,k:"n"},{t:3,v:" items."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"This is already in the top bar."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Top bar"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Top bar: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"From the screen itself, also works without Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" of "},{t:4,k:"n"},{t:3,v:" item"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" of "},{t:4,k:"n"},{t:3,v:" items"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Left: name"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"For example: Living room"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Right: time, sensors, or a clock"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", slot "},{t:4,k:"slot"},{t:3,v:". Enter: configure, arrows: move"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Remove "},{t:4,k:"name"},{t:3,v:" from the top bar"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maximum 1 item"},{t:2,i:[{t:3,v:"Maximum "},{t:4,k:"n"},{t:3,v:" items"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Add the time, date, analog clock, or an entity"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Add time, date, or an entity"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Not everything fits next to the name: the screen drops the dashed items. Remove one or choose a shorter name."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Drag to reorder; tap an item to configure it."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensors, the date, and the analog clock appear from firmware "},{t:4,k:"version"},{t:3,v:"; until that update, this screen shows the name and, if the time is in the bar, the clock."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Hidden: not active right now"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Doesn't fit next to the name"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Dial"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Hidden right now: not active"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Doesn't currently fit next to the name"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"How it looks on the screen"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Small dial with the time"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"What to show"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Last changed keeps counting on the screen itself: “Just now”, “5 min ago”, “Yesterday”."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatic (like Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Show"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Only when active hides the item as long as it's off, closed, away, or 0. Handy for an open door, a running washing machine, or who's home."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"24 hour clock · change under "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"12 hour clock · change under "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Settings → Language & region"}},date_hint:{t:0,b:{t:2,i:[{t:4,k:"date"},{t:3,v:" today. The date follows the screen's own clock."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Up"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Down"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Add to the top bar"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" of "},{t:4,k:"n"},{t:3,v:" slot used"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" of "},{t:4,k:"n"},{t:3,v:" slots used"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"From the screen itself"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Already added"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Suggestions from Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"An entity"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search by name, room, or entity, e.g. temperature or door"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Search for an entity for the top bar"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No entities found."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brightness"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Night"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Screen"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brightness"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Dark mode"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Auto standby"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Standby after"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Standby brightness"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Night mode"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Starts"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Ends"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Night brightness"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Back to page 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"After"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Also on standby"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Swipe between pages"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Page buttons"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotation"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" sec"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Still saving the other screen's settings. Try again in a moment."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Page buttons and swiping are off, so only Go to page tiles change the page."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"page "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"pages "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tile, to "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tiles, to "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tile, to "},{t:4,k:"targets"},{t:3,v:", but none to "},{t:4,k:"missing"},{t:3,v:", so you can't reach it."}]},{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tiles, to "},{t:4,k:"targets"},{t:3,v:", but none to "},{t:4,k:"missing"},{t:3,v:", so you can't reach it."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tile, to "},{t:4,k:"targets"},{t:3,v:", but none to "},{t:4,k:"missing"},{t:3,v:", so you can't reach them."}]},{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tiles, to "},{t:4,k:"targets"},{t:3,v:", but none to "},{t:4,k:"missing"},{t:3,v:", so you can't reach them."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"You have no Go to page tiles."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"You have no Go to page tiles to "},{t:4,k:"missing"},{t:3,v:", so you can't reach it."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"You have no Go to page tiles to "},{t:4,k:"missing"},{t:3,v:", so you can't reach them."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"The tiles to "},{t:4,k:"pages"},{t:3,v:" are only on pages you can't reach."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"From "},{t:4,k:"pages"},{t:3,v:" no tile leads back to page 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"This screen is offline. Its settings can change once it's back."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Changes apply on the screen at once, and show up here when they change there."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Changes apply at once. Firmware 0.2.49 lets the screen keep them itself."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"This entity is off in Home Assistant, or the screen is restarting."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" lower"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" higher"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Starting update…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Building the firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Writing the firmware over Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Building and installing…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Waiting for the screen to come back…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Checking that it stays stable…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"New language: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Screens will now update automatically at night."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Automatic updates are off."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Firmware updates"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Updating to firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"No screen paired yet. New screens get firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" is available for "},{t:4,k:"n"},{t:3,v:" screen."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" is available for "},{t:4,k:"n"},{t:3,v:" screens."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"All screens have firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Update 1 screen"},{t:2,i:[{t:3,v:"Update all "},{t:4,k:"n"},{t:3,v:" screens"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"What's new in firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Update automatically every night"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Between 03:00 and 06:00, one screen at a time. Stops on an error and reports it in Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Skill installed. Claude Code picks it up right away."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Skill installed. Restart Claude Code once so it finds the new skills folder."}},text:{t:0,b:{t:2,i:[{t:3}],s:'Teach Claude about ESP Screens, then ask: "Show an alert on all my screens when the mailbox is full." Claude knows the alert events, every field, color, and icon.'}},install:{t:0,b:{t:2,i:[{t:3}],s:"Install for Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Install again"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Update the skill"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Not installed"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Installed"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Installed · a newer version is ready"}},writes:{t:0,b:{t:2,i:[{t:3,v:"For Claude Code in Home Assistant. Writes one file to "},{t:4,k:"path"},{t:3,v:"; installing again replaces it."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download for claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Upload the zip in Claude under Customize → Skills."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Everything around your screens."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← My screens"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Screens"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Add a screen, or build and reinstall the firmware of one you already have."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Build and install via USB or Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Language & region"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Screen language"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant's language ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant's language"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"The screens use English until Home Assistant's language is available."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · not checked yet, help welcome"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" is not checked yet, help welcome: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"how to translate"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"After a change every screen needs a firmware update, one build each: with its Update button, or in the nightly updates."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Time format"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatic, follows the language ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 hour"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 hour"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Number format"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatic, follows the language ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Your Home Assistant profile: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Use these"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"The editor itself follows the language of your Home Assistant profile."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Saved."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Saved. Every screen takes the new language with its next update."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"A card over the whole screen from an automation, on one screen or on all of them. The cheatsheet has the action names, fields, icons, and colors, and a form to try one."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Full-screen notifications, from an automation"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Build and install screen firmware"}},intro:{t:0,b:{t:2,i:[{t:3,v:"The built-in ESPHome CLI uses your own profile (YAML with keys) and secrets. Choose the screen's profile, then a USB port (screen connected to the Home Assistant machine), "},{t:4,k:"ota"},{t:3,v:" with the hostname, or "},{t:4,k:"download"},{t:3,v:" to put the firmware on the screen from your own computer. "},{t:4,k:"check"},{t:3,v:" only validates, "},{t:4,k:"build"},{t:3,v:" compiles, "},{t:4,k:"install"},{t:3,v:" puts the firmware on the screen. Your tiles stay as they are in ESP Screens. The first build takes a few minutes."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Check"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Build only"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Build & install"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Build & download"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"The ESPHome CLI is missing. Update the app to 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Choose the intended profile, then a USB port, an IP address, or Download."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome profile"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Install to"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · no board found on the Home Assistant machine yet"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Download · flash from your own computer"}},host:{t:0,b:{t:2,i:[{t:3}],s:"IP address or hostname"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Download "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Put it on the screen with "},{t:4,k:"esphome_web"},{t:3,v:" in Chrome or Edge: Connect, choose the screen's USB port, Install, and select this file. It holds your Wi-Fi password and the screen's keys: keep it to yourself."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Connect and install."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profile saved."}},running:{t:0,b:{t:2,i:[{t:3}],s:"One moment…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Ready to download."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Done."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"That didn't work."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens creates the screen's own profile with unique keys and builds the firmware. Connect the screen with a USB data cable to the machine running Home Assistant, or download the firmware and put it on the screen from your own computer."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Which screen do you have?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2.8 inch"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 inch"}},board_elecrow:{t:0,b:{t:2,i:[{t:3}],s:"Elecrow CrowPanel · 7 inch"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Name"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Living room screen"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Device name"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"customize"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Every screen gets its own profile with its own keys. Four screens? Go through this four times with a different name."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Lowercase letters, digits, and dashes. A different name for each screen."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi name (2.4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi password"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Fill in once: ESP Screens saves this in ESPHome secrets.yaml, later screens use it automatically."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Your ESPHome secrets.yaml is still missing Wi-Fi details. ESP Screens only fills in the missing lines."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi comes from your ESPHome secrets.yaml."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"secrets.yaml in the ESPHome folder isn't valid YAML. Fix the file first; it won't be overwritten."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Install via"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Later · save profile only"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Connect the screen with a USB data cable to the Home Assistant machine; the list refreshes on its own. Or choose Download to use your own computer."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download the firmware and put it on the screen from your own computer, in Chrome or Edge. After that, updates go over Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"The profile goes into the ESPHome folder. You can install later via Firmware & USB, or from ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"More than one board connected: choose this screen's port."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Once over USB; after that, everything is wireless."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Install"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Save profile"}},busy:{t:0,b:{t:2,i:[{t:3,v:"A build or installation is already running ("},{t:4,k:"file"},{t:3,v:"). Wait for it to finish."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"The ESPHome CLI is missing from this installation; only saving the profile is possible."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" is in the ESPHome folder"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Writing firmware to "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Building firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Firmware for "},{t:4,k:"name"},{t:3,v:" is ready"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Firmware is on "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Build failed"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Install failed"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Install it later from Firmware & USB: choose this profile, then the USB port of the Home Assistant machine, or Download to put the firmware on the screen from your own computer. Save the API key for pairing:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Don't disconnect the USB cable yet."}},building:{t:0,b:{t:2,i:[{t:3}],s:"A first build takes a few minutes on a Raspberry Pi. You can leave this page: the installation keeps running and you'll find it again under New screen."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"A first build takes a few minutes on a Raspberry Pi. You can leave this page: the build keeps running and you'll find it again under New screen."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Put it on the screen from your own computer, then pair the screen with Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"The screen boots up and connects to your Wi-Fi. Pair it with Home Assistant now:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"The screen boots up and connects to your Wi-Fi. The CYD first asks for a touch calibration: tap the crosshairs. Pair it with Home Assistant now:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"See the log below."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" with a USB data cable."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Plug the screen into your computer"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" in Chrome or Edge, click Connect and choose the screen's USB port."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Open "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" and select "},{t:4,k:"file"},{t:3,v:". The screen restarts and joins your Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" and select "},{t:4,k:"file"},{t:3,v:". The screen restarts and joins your Wi-Fi. The CYD first asks for a touch calibration: tap the crosshairs."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Click Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"The file holds your Wi-Fi password and the screen's keys: keep it to yourself."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"API key"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" This happens outside ESP Screens. Home Assistant discovers "},{t:4,k:"name"},{t:3,v:" as an ESPHome device; click Add. Not discovered? Add ESPHome manually with the screen's IP address."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Go to Home Assistant → Settings → Devices & services."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" above when Home Assistant asks for an encryption key."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Paste the API key"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ESPHome integration → Configure → “Allow the device to perform Home Assistant actions”. Without this, the screen sees everything but controls nothing."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Allow HA actions:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Back in ESP Screens, the screen appears in the list on the left within about thirty seconds; until then it's shown there as “not yet in Home Assistant”."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Choose your tiles."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome log"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Retry"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Install another screen"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Start over"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Done"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alerts · cheatsheet"}},title:{t:0,b:{t:2,i:[{t:3}],s:"A full-screen notification, from an automation."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Every screen has the "},{t:4,k:"action"},{t:3,v:" action. It places a card over everything, wakes the screen, and keeps the backlight at normal brightness until someone taps the button or the timeout runs out. Home Assistant itself shows no explanation or dropdowns for ESPHome actions; everything you can fill in is listed here."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"The cheatsheet is still loading; one moment."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Someone is at the door"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Door 3, back"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Coming"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Sections"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Try it"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Your screens"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"In an automation"}},all:{t:0,b:{t:2,i:[{t:3}],s:"All screens"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"The fields"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Colors"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Behavior"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Events"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Tips"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Send one alert now, with the same fields an automation sends. The screen shows the card and, with blinking on, flashes its backlight."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Screen"}},all:{t:0,b:{t:2,i:[{t:3,v:"All screens ("},{t:4,k:"ready"},{t:3,v:" ready)"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · not ready"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Title"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Subtitle"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icon"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Color"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Button text"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Timeout (seconds, 0 waits for the button)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Blink the backlight"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Four times when the alert arrives."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Sending…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Send alert"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Sent to "},{t:4,k:"n"},{t:3,v:" screen."}]},{t:2,i:[{t:3,v:"Sent to "},{t:4,k:"n"},{t:3,v:" screens."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Sent to "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Sent to the screen."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 skipped (offline or old firmware)."},{t:2,i:[{t:4,k:"n"},{t:3,v:" skipped (offline or old firmware)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Left empty: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"No screen could show it: check that a screen is online with firmware "},{t:4,k:"version"},{t:3,v:" or newer."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"White (default)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Every screen has its own action, with the device name in it. From firmware "},{t:4,k:"version"},{t:3,v:"; update an older screen with its Update button under Screens."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"No screen paired yet. Install one via New screen; the action appears once Home Assistant sees the screen."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Update needed · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Device name unknown · update the screen"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Show alert"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Dismiss alert"}}},howto:{add:{t:0,b:{t:2,i:[{t:4,k:"add"},{t:3,v:" and search for "},{t:4,k:"esphome"},{t:3,v:`. Choose your screen's action: Home Assistant calls it "Performs the action show_alert of the node `},{t:4,k:"device"},{t:3,v:'".'}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Add action"}},device:{t:0,b:{t:2,i:[{t:3}],s:"device name"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant asks for all seven; leave what you don't use empty ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", off)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fill in the fields."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Prefer YAML? Choose "},{t:4,k:"edit"},{t:3,v:" on the action and paste the example below."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Example for"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"a screen (not paired yet)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Edit in YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copy YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"All screens at once"}},text:{t:0,b:{t:2,i:[{t:3,v:"Fire the event "},{t:4,k:"show"},{t:3,v:" with the same fields, and ESP Screens passes the alert on to every screen that is online, including screens you add later. "},{t:4,k:"dismiss"},{t:3,v:" clears it everywhere. In an automation, add the "},{t:4,k:"event"},{t:3,v:" action or paste the example under "},{t:4,k:"edit"},{t:3,v:". Leave out the fields you don't use. ESP Screens has to be running for this."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Fire manual event"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Text is free-form; the limit is in bytes, and an accented letter counts as two. What doesn't fit gets an ellipsis (title) or is dropped (subtitle)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Field"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Type"}},what:{t:0,b:{t:2,i:[{t:3}],s:"What it does"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Example"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limit"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"text"}},int:{t:0,b:{t:2,i:[{t:3}],s:"number"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"on / off"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entity"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"0 to 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Fill in the name in "},{t:4,k:"field"},{t:3,v:", for example "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" and the hex codepoint ("},{t:4,k:"hex"},{t:3,v:") also work. Only these icons are included in the firmware; any other name shows the warning triangle. Tap an icon to copy its name."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Handy for notifications"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Search for an icon"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search by name or description…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Also available: control and weather icons"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copy "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:'No icon for "'},{t:4,k:"query"},{t:3,v:'". Unknown names show the warning triangle ('},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Fill in the name in "},{t:4,k:"field"},{t:3,v:". These are the pastel shades of the tiles, with dark text. Empty or unknown gives the white card. Tap to copy."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" An alert immediately wakes a dimmed or dark screen and appears above every page, every open light card, and the standby layer."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wakes the screen."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" As long as the card is showing, the backlight stays at normal brightness. Standby and night hours wait. After the button, the regular standby time starts again."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"On until the button."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" waits for the button, however long that takes. With "},{t:4,k:"minute"},{t:3,v:" the card disappears after a minute, but the button closes it sooner."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Timeout."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" blinks the backlight four times when the alert arrives (about a second) and leaves the screen on afterward."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Blinking."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" A new alert replaces the current one; there's no stack. The replaced alert reports itself as "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Replacing."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" clears the card, for example if the door is already open. Without an alert, that action does nothing."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Closing remotely."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" does nothing; only the button closes it. That way a wake-up tap never accidentally dismisses the alert."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tapping beside the card"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Every end fires the event "},{t:4,k:"event"},{t:3,v:" with "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (the device name) and the "},{t:4,k:"device_id"},{t:3,v:" that Home Assistant adds. Visible under Settings → Tools → Events."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"When"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Waiting until someone presses the button"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Use a "},{t:4,k:"bold"},{t:3,v:': orange for the door, red for smoke or water, green for "done". The text always stays dark and readable.'}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"color per kind of notification"}},short:{t:0,b:{t:2,i:[{t:3,v:"Keep the title "},{t:4,k:"bold"},{t:3,v:"; a screen shows about twenty characters on one line and ends a longer title with an ellipsis. Put details in the subtitle."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"short"}},button:{t:0,b:{t:2,i:[{t:3,v:"A "},{t:4,k:"bold"},{t:3,v:' turns the notification into a question: "Coming", "Seen", "Turn off". The event then tells you who responded.'}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"custom button text"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"For an alert that resolves itself (the door opens, the laundry gets taken out) close it in the same automation with "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Every screen? Fire "},{t:4,k:"event"},{t:3,v:" once (see All screens at once). The screens still work independently and each reports with its own "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Rather "},{t:4,k:"bold"},{t:3,v:" for the automation? Install the ESP Screens skill under Settings → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"ask Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Doorbell: show the alert and wait until someone presses the button."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Someone is coming to the door."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Advanced · local override"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Override YAML"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"Override YAML · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"This small file is yours. It is loaded after the shared screen package and stays in place when ESP Screens updates. Change hardware-specific details here, such as a display model."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"What is safe to change?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Display, touchscreen, substitutions, pins and other device details. Name, Wi-Fi, API, OTA and package links remain managed."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Active"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Ready to attach"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"Local override YAML"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Use example"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 character"},{t:2,i:[{t:4,k:"n"},{t:3,v:" characters"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 line"},{t:2,i:[{t:4,k:"n"},{t:3,v:" lines"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Save & check"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Save override"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"No ESPHome profile was found for this screen."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Changes here apply on the next build."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Save once to attach this file to the profile."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Checking and saving…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Saved. The override is kept during firmware updates."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"Override YAML saved."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Saved. ESPHome is checking the complete profile…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome is checking the profile…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome is checking the profile… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"The complete profile is valid. Safe to build and install."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome rejected the complete profile. See Firmware & USB for the full log."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Replace the current text with the example?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Example loaded. Save it when you are ready."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Clear the local override?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"The override will be empty after you save."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Home"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Unknown"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Unavailable"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Heat"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Cool"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Heat/Cool"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Dry"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Fan only"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Heating"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Cooling"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Idle"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Drying"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Fan"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Preheating"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Defrosting"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Opening"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Closing"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Playing"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Paused"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Idle"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"Standby"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Home"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Away"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Above horizon"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Below horizon"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Docked"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Cleaning"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Paused"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Returning to dock"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Idle"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Sunny"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Clear, night"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Cloudy"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Partly cloudy"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Rainy"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Pouring"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Snowy"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Snowy, rainy"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Fog"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Hail"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Lightning"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Lightning, rainy"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Windy"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Exceptional"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Low"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Charging"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Not charging"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Cold"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Connected"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Disconnected"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Hot"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Light detected"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"No light"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Unlocked"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Locked"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Wet"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Dry"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"Moving"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Not moving"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Plugged in"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Unplugged"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Home"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Away"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problem"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"Running"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Not running"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Unsafe"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Safe"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Tampering detected"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Update available"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Up-to-date"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Activate"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Run"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Press"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Low"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Medium"}},high:{t:0,b:{t:2,i:[{t:3}],s:"High"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Middle"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Focus"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffuse"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Top"}},on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Both"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Vertical"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Just now"}},minutes_ago:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min ago"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 hour ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" hours ago"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Yesterday"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 day ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" days ago"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 week ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" weeks ago"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 month ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" months ago"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 year ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" years ago"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In 1 hour"},{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" hours"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Tomorrow"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In 1 day"},{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" days"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"Sunday"}},{t:0,b:{t:2,i:[{t:3}],s:"Monday"}},{t:0,b:{t:2,i:[{t:3}],s:"Tuesday"}},{t:0,b:{t:2,i:[{t:3}],s:"Wednesday"}},{t:0,b:{t:2,i:[{t:3}],s:"Thursday"}},{t:0,b:{t:2,i:[{t:3}],s:"Friday"}},{t:0,b:{t:2,i:[{t:3}],s:"Saturday"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"Sun"}},{t:0,b:{t:2,i:[{t:3}],s:"Mon"}},{t:0,b:{t:2,i:[{t:3}],s:"Tue"}},{t:0,b:{t:2,i:[{t:3}],s:"Wed"}},{t:0,b:{t:2,i:[{t:3}],s:"Thu"}},{t:0,b:{t:2,i:[{t:3}],s:"Fri"}},{t:0,b:{t:2,i:[{t:3}],s:"Sat"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"Su"}},{t:0,b:{t:2,i:[{t:3}],s:"Mo"}},{t:0,b:{t:2,i:[{t:3}],s:"Tu"}},{t:0,b:{t:2,i:[{t:3}],s:"We"}},{t:0,b:{t:2,i:[{t:3}],s:"Th"}},{t:0,b:{t:2,i:[{t:3}],s:"Fr"}},{t:0,b:{t:2,i:[{t:3}],s:"Sa"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"January"}},{t:0,b:{t:2,i:[{t:3}],s:"February"}},{t:0,b:{t:2,i:[{t:3}],s:"March"}},{t:0,b:{t:2,i:[{t:3}],s:"April"}},{t:0,b:{t:2,i:[{t:3}],s:"May"}},{t:0,b:{t:2,i:[{t:3}],s:"June"}},{t:0,b:{t:2,i:[{t:3}],s:"July"}},{t:0,b:{t:2,i:[{t:3}],s:"August"}},{t:0,b:{t:2,i:[{t:3}],s:"September"}},{t:0,b:{t:2,i:[{t:3}],s:"October"}},{t:0,b:{t:2,i:[{t:3}],s:"November"}},{t:0,b:{t:2,i:[{t:3}],s:"December"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"Jan"}},{t:0,b:{t:2,i:[{t:3}],s:"Feb"}},{t:0,b:{t:2,i:[{t:3}],s:"Mar"}},{t:0,b:{t:2,i:[{t:3}],s:"Apr"}},{t:0,b:{t:2,i:[{t:3}],s:"May"}},{t:0,b:{t:2,i:[{t:3}],s:"Jun"}},{t:0,b:{t:2,i:[{t:3}],s:"Jul"}},{t:0,b:{t:2,i:[{t:3}],s:"Aug"}},{t:0,b:{t:2,i:[{t:3}],s:"Sep"}},{t:0,b:{t:2,i:[{t:3}],s:"Oct"}},{t:0,b:{t:2,i:[{t:3}],s:"Nov"}},{t:0,b:{t:2,i:[{t:3}],s:"Dec"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday_min"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:"."}},group:{t:0,b:{t:2,i:[{t:3}],s:","}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"1"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Page "},{t:4,k:"n"}]}}}}},Kh=Bh,Ka=e=>e%10>=2&&e%10<=4&&(e%100<12||e%100>14),za={one_other:e=>e===1?0:1,one_upto_1:e=>Math.abs(e)<=1?0:1,slavic_pl:e=>e===1?0:Ka(e)?1:2,east_slavic:e=>e%10===1&&e%100!==11?0:Ka(e)?1:2,none:()=>0},zh=Object.assign({"../../screen_manager/translations/de.json":()=>bn(()=>import("./de-CMx0ATkh.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/en-GB.json":()=>bn(()=>import("./en-GB-v7qWKoyN.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/es.json":()=>bn(()=>import("./es-CiY4kmZ6.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/fr.json":()=>bn(()=>import("./fr-PLcoeSWe.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/it.json":()=>bn(()=>import("./it-VhrDkYVK.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/nl.json":()=>bn(()=>import("./nl-BvCFf3cV.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/pl.json":()=>bn(()=>import("./pl-B4qhbPaP.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/pt.json":()=>bn(()=>import("./pt-Cj4BVpRQ.js"),[],import.meta.url).then(e=>e.default)}),qh=Object.fromEntries(Object.entries(zh).map(([e,t])=>[e.slice(e.lastIndexOf("/")+1,-5),t])),Rs={...dp},nu=new Set(["en"]),wl={},su=e=>wl[e]=(t,n)=>Math.min((za[Rs[e]?.plural]||za.one_other)(t),n-1),kl=()=>["en",...Object.keys(Rs).filter(e=>e!=="en").sort()];kl().forEach(su);const cs=Mh({locale:"en",fallbackLocale:"en",messages:{en:Kh},pluralRules:wl,missingWarn:!1,fallbackWarn:!1,missing:(e,t)=>{}}),c=cs.global.t,Yh=(e,t="en")=>cs.global.te(e,t),$l=()=>cs.global.locale.value,Gh=e=>Rs[e];function Jh(e=window){try{if(e.parent!==e){const t=e.parent.document.documentElement.lang;if(t)return t}}catch{}return e.navigator.language||"en"}function iu(e,t=kl()){const n=i=>t.find(l=>l.toLowerCase()===i.toLowerCase()),s=(e||"").trim();return s?n(s)||n(s.split("-")[0]):void 0}const ou=(e,t=kl())=>iu(e,t)||"en";function Xh(e,t,n=Rs[e]){n&&(Rs[e]=n),wl[e]||su(e),cs.global.setLocaleMessage(e,t),nu.add(e)}const qa={};function lu(e){if(nu.has(e))return Promise.resolve(!0);const t=qh[e];return t?qa[e]??=t().then(n=>(Xh(e,n),!0),()=>(delete qa[e],!1)):Promise.resolve(!1)}async function Zh(e=ou(Jh())){const t=await lu(e)?e:"en";return cs.global.locale.value=t,document.documentElement.lang=t,t}const os={point:{decimal:".",group:",",from:4},comma:{decimal:",",group:".",from:4},space:{decimal:",",group:" ",from:4}};function au(e,t){const n=String(e),s=/^(-?)(\d+)(?:\.(\d+))?$/.exec(n);if(!s)return n;const i=s[2].length>=t.from?s[2].replace(/\B(?=(\d{3})+$)/g,t.group):s[2];return`${s[1]}${i}${s[3]!==void 0?t.decimal+s[3]:""}`}const Ya={comma_decimal:"point",decimal_comma:"comma",space_comma:"space"};function Qh(e=window){try{if(e.parent===e)return{};const t=e.parent.document.querySelector("home-assistant")?.hass?.locale,n=["12","24"].includes(t?.time_format)?t.time_format:void 0;return{...n?{clock:n}:{},...Ya[t?.number_format]?{numbers:Ya[t.number_format]}:{}}}catch{return{}}}const em=(e,t=$l())=>new Intl.ListFormat(t==="en"?"en-GB":t,{type:"conjunction"}).format(e.map(String)),ze=6,fn=8,Ns=fn*ze,ru=["single","wide","full"],Sn=e=>e===!0?"wide":e===!1?"single":e,us=e=>/^screen\.page_[1-8]$/.test(e)?Number(e.slice(-1)):0,ut=e=>ru.includes(e.options?.size)?e.options.size:"single",jo=e=>ut(e)!=="single",cu=e=>ut(e)==="full",uu=e=>e-e%ze,du=e=>e-e%2,At=e=>Math.floor(e/ze),xl=e=>Sn(e)==="full"?ze:Sn(e)==="wide"?2:1,Bn=(e,t)=>Sn(t)==="full"?Array.from({length:ze},(n,s)=>uu(e)+s):Sn(t)==="wide"?[e,e+1]:[e],Ga=(e,t)=>Sn(t)==="full"?uu(e):Sn(t)==="wide"?du(e):e,Ze=e=>e.tiles.map(t=>({tile:t,slot:t.slot}));function fu(e){let t=0;return e.map(n=>{const s=ut(n);s==="full"&&t%ze?t+=ze-t%ze:s==="wide"&&t%2===1&&t++;const i=t;return t+=xl(s),i})}function tm(e){const t=fu(e);return e.some((n,s)=>n.slot!==t[s])}function Vi(e){if(e.tiles.some(t=>!Number.isInteger(t.slot))){const t=fu(e.tiles);e.tiles.forEach((n,s)=>n.slot=t[s])}e.tiles.sort((t,n)=>t.slot-n.slot)}function ts(e){const t=new Set;for(const{tile:n,slot:s}of e)for(const i of Bn(s,ut(n)))t.add(i);return t}const Fs=(e,t,n)=>Number.isInteger(t)&&t>=0&&t!e.has(s));function wi(e,t,n=0){for(let s=n;si.includes(h))?u.push(f):r.push({tile:f,slot:f.slot}));for(const f of u){const h=ut(f),p=ts(r);let b=l.map(v=>Ga(v,h)).find(v=>Fs(p,v,h));if(b===void 0&&(b=pu(p,h,f.slot)),b<0)return null;r.push({tile:f,slot:b})}return r.sort((f,h)=>f.slot-h.slot)}function It(e,t=1){const n=Math.max(0,...e.map(({tile:s,slot:i})=>i+xl(ut(s))));return Math.min(fn,Math.max(1,Math.ceil(n/ze),t||1))}function nm(e,t){const n=Array.from({length:t},()=>new Set);let s=0;for(const{tile:h,slot:p}of e){const b=us(h.entity)-1,v=At(p);b<0||b>=t||v>=t||(s++,n[v].add(b))}const i=h=>{const p=new Set([0]),b=[0];for(;b.length;)for(const v of h(b.shift()))p.has(v)||(p.add(v),b.push(v));return p},l=i(h=>[...n[h]]),r=i(h=>n.flatMap((p,b)=>p.has(h)?[b]:[])),u=Array.from({length:t},(h,p)=>p),f=h=>h.map(p=>p+1);return{tiles:s,targets:f(u.filter(h=>n.some(p=>p.has(h)))),unreachable:f(u.filter(h=>!l.has(h))),noWayBack:f(u.filter(h=>l.has(h)&&!r.has(h)))}}function sm(e){const t=e.split(".")[0];return t==="sun"?{options:{display:"sunpath",size:"wide"}}:t==="weather"?{options:{display:"forecast",size:"wide"}}:us(e)?{}:t==="screen"?{options:{display:"digital",size:"wide"}}:{}}const mu=e=>({entity:e,name:"",slot:-1,...sm(e)});function bu(e,t){const n=e.entity.split(".")[0],s=t.controls?.[n],i=e.options||{};if(!s||!["wide","full"].includes(i.size)||!["standard","cover"].includes(i.display||"standard")||i.inline==="slider")return null;const l=i.controls??(i.size==="full"?"none":s.default);return l==="none"?null:l}function im(e,t){const n=bu(e,t);return n?t.controls?.[e.entity.split(".")[0]]?.choices.find(s=>s.key===n)?.label||n:c("editor.inspect.control_none")}const Ho=e=>(/^(\d+)\.(\d+)\.(\d+)$/.exec(e||"")||[]).slice(1).map(Number);function pn(e,t){const[n,s]=[Ho(e),Ho(t)];if(n.length!==3||s.length!==3)return!1;for(let i=0;i<3;i++)if(n[i]!==s[i])return n[i]>s[i];return!0}const om=(e,t,n,s)=>pn(e,`${t}.${n}.${s}`),lm=Ns;function am(e){return Ho(e).length!==3?10:pn(e,"0.2.62")?lm:pn(e,"0.2.7")?20:10}const rm=["standard","watch","forecast","graph","digital","analog","sunpath","live","cover"],vu=e=>rm.includes(e)?c(`editor.displays.${e}`):e,cm=e=>c(`editor.sizes.${ru.includes(e)?e:"single"}`),Ja=["light","switch","input_boolean","fan","media_player","climate"],um=["light","fan","cover","number","input_number","media_player"],dm={light:["☀","#ad7600","#fff3d3"],climate:["❄","#c86620","#ffebdc"],vacuum:["◉","#008577","#def3ed"],fan:["✣","#008aab","#def5fa"],cover:["▤","#8053af","#eee5f8"],media_player:["▶","#007cad","#def2fc"],sensor:["⌁","#3476b1","#e5effa"],binary_sensor:["◈","#ad7600","#fff3d3"],switch:["⏻","#ad7600","#fff3d3"],input_boolean:["⏻","#ad7600","#fff3d3"],scene:["✦","#8053af","#eee5f8"],script:["▷","#8053af","#eee5f8"],weather:["☁","#007cad","#def2fc"],number:["±","#008577","#def3ed"],input_number:["±","#008577","#def3ed"],select:["≡","#5862af","#eaecfa"],input_select:["≡","#5862af","#eaecfa"],button:["↗","#5862af","#eaecfa"],input_button:["↗","#5862af","#eaecfa"],screen:["◷","#25282c","#e9ecf1"],sun:["☼","#c86620","#ffebdc"],timer:["⏱","#008577","#def3ed"],person:["☺","#2f7d32","#e1f2e2"],camera:["◧","#3d4a57","#e6ebf0"],image:["◧","#3d4a57","#e6ebf0"]};function Ht(e){const t=e.split(".")[0],n=dm[t];return n?[c(`editor.domains.${t}`),...n]:[c("editor.domains.entity"),"◇","#637184","#edf0f4"]}const gu={clock:"clock-outline",analog:"clock-outline",date:"calendar"},at=e=>JSON.stringify(e),Ae=e=>String.fromCodePoint(parseInt(e,16));function Wi(e,t=new Date,n){const s=String(t.getMinutes()).padStart(2,"0");if(e)return`${String(t.getHours()).padStart(2,"0")}:${s}`;const i=`${t.getHours()%12||12}:${s}`;return n?`${i} ${c(`screen.time.${t.getHours()<12?"am":"pm"}`,{},{locale:n})}`:i}const Sl=(e=new Date,t="en")=>c("screen.date.top_bar",{weekday:c(`screen.date.weekdays_short.${e.getDay()}`,{},{locale:t}),weekday_min:c(`screen.date.weekdays_min.${e.getDay()}`,{},{locale:t}),day:e.getDate(),month:c(`screen.date.months_short.${e.getMonth()}`,{},{locale:t})},{locale:t});function fm(e,t=Math.floor(Date.now()/1e3),n="en"){const s=t-e,i=Math.abs(s),l=u=>Math.floor(i/u),r=(u,f)=>f===void 0?c(`screen.time.${u}`,{},{locale:n}):c(`screen.time.${u}`,f,{locale:n});return s<0?i<3600?r("in_minutes",Math.max(1,l(60))):i<86400?r("in_hours",l(3600)):i<172800?r("tomorrow"):r("in_days",l(86400)):i<60?r("just_now"):i<3600?r("minutes_ago",l(60)):i<86400?r("hours_ago",l(3600)):i<172800?r("yesterday"):i<604800?r("days_ago",l(86400)):i<2592e3?r("weeks_ago",l(604800)):i<31536e3?r("months_ago",l(2592e3)):r("years_ago",l(31536e3))}const Xa={guition:{width:448,top:36,name:27,text:21,icon:26},elecrow:{width:768,top:36,name:27,text:21,icon:26},cyd:{width:298,top:24,name:18,text:14,icon:18}};let ps;const Vo=new Map,pm=()=>Vo.clear();function Dn(e,t){const n=`${t}|${e}`;let s=Vo.get(n);if(!s){if(ps===void 0&&(ps=document.createElement("canvas").getContext("2d")),ps){ps.font=t;const i=ps.measureText(e);s={left:-i.actualBoundingBoxLeft,right:i.actualBoundingBoxRight,top:-i.actualBoundingBoxAscent,bottom:i.actualBoundingBoxDescent,advance:i.width}}else{const i=Number(/(\d+(?:\.\d+)?)px/.exec(t)?.[1]||14),l=[...e].length*i*.55;s={left:0,right:l,top:-i*.72,bottom:i*.02,advance:l}}Vo.set(n,s)}return s}const hm=e=>({name:`500 ${e.name}px "Bar Roboto"`,text:`400 ${e.text}px "Bar Roboto"`,icon:`${e.icon}px "Tile Icons"`});function mm(e){return{icon:Math.max(2,Math.floor((e*4+5)/10)),item:Math.max(6,Math.floor((e*125+50)/100)),name:Math.max(8,Math.floor((e*16+5)/10))}}function _u(e,t,n,s){const i=hm(t),l=Dn("0",i.text),r=Math.round(l.bottom-l.top),u=mm(r),f=Dn(String.fromCodePoint(983376),i.icon),h=Math.round(f.bottom-f.top),p=e.map((C,K)=>{const O=s(C),E={index:K,item:C,view:O,shown:O.shown,width:0};return O.analog?(E.dial=h,E.width=h,E):(O.icon&&(E.icon={glyph:Ae(O.icon),ink:Dn(Ae(O.icon),i.icon)},E.width+=E.icon.ink.right-E.icon.ink.left),O.text&&(E.text={value:O.text,ink:Dn(O.text,i.text)},E.width+=(E.icon?u.icon:0)+E.text.ink.right-E.text.ink.left),E)}),b=p.filter(C=>C.shown),v=Dn(n,i.name).advance,y=Math.min(v,Math.floor(t.width*35/100)),I=C=>C.reduce((K,O)=>K+O.width,0)+Math.max(0,C.length-1)*u.item;let T=0;for(;Tt.width;)T++;const k=b.slice(T),A=new Set(b.slice(0,T).map(C=>C.index));let S=t.width-I(k);for(const C of k)C.x=S,S+=C.width+u.item;const U=k.length?k[0].x-u.name:t.width;return{metrics:t,fonts:i,cap:r,zero:l,gaps:u,parts:p,placed:k,dropped:A,nameText:n,natural:v,nameRoom:U}}function bm(e,t,n){if(Dn(e,t).advance<=n)return e;const s=[...e];for(;s.length&&Dn(s.join("")+"...",t).advance>n;)s.pop();return s.join("")+"..."}function vm(e){"fonts"in document&&Promise.all([document.fonts.load('500 27px "Bar Roboto"',"Studio 0"),document.fonts.load('400 21px "Bar Roboto"',"Away 0"),document.fonts.load('26px "Tile Icons"',String.fromCodePoint(983376))]).then(()=>{pm(),e()}).catch(()=>{})}let yu="";function gm(e){yu=e||""}async function Cl(e,t={}){const n=await fetch(`api/${e}`,{...t,headers:{"Content-Type":"application/json","X-Screen-CSRF":yu,"X-ESP-Screens-Language":$l(),...t.headers}});if(!n.ok){let s=c("editor.api.failed");try{const i=(await n.json())?.error;typeof i=="string"&&i.trim()&&(s=i)}catch{}throw new Error(s)}return n}const Ft=async e=>(await Cl(e)).json(),ft=async(e,t,n,s={})=>{const l=await(await Cl(e,{method:t,body:n===void 0?void 0:JSON.stringify(n),...s})).text();return l?JSON.parse(l):null},m=qn({inventory:{screens:[],entities:[]},connected:!1,reachable:!0,selected:null,layout:null,dirty:!1,busy:!1,saved:0,tab:"layout",selectedTile:null,inspector:null,iconPickerOpen:!1,actionPickerOpen:!1,actionSearch:"",insertAt:-1,filter:"",search:"",capabilities:{},entityActions:{},topbarPreviews:{},topbarAdded:null,topbarOverflow:[],settingEdits:{},settingPending:!1,updating:[],toast:null,now:Date.now(),fontsVersion:0,route:location.hash,overrideProfile:null,overrideFriendly:"",drag:{active:!1,moving:null,preview:null},menuOpen:!1,liveStates:{},room:"",hidePlaced:!1,palette:!1,firmwareJob:null}),ht=$(()=>m.inventory.screens.find(e=>e.id===m.selected)),ls=e=>(e&&"firmware_known"in e?e.firmware_known:e?.firmware)||"",wu=$(()=>ls(ht.value)),$t=(e,t,n)=>om(wu.value,e,t,n),Kn=$(()=>{const e=ht.value?.tile_limit;return typeof e=="number"&&Number.isInteger(e)&&e>0?e:am(wu.value)}),Za=$(()=>{const e=ht.value?.full_page;return typeof e=="boolean"?e:$t(0,2,62)}),_m=$(()=>{const e=ht.value?.page_tiles_repeat;return typeof e=="boolean"?e:$t(0,2,65)}),Bi=e=>_m.value&&us(e)>0,ym=["guition","elecrow"],Ki=$(()=>ym.includes(ht.value?.board??"")),ku=$(()=>ht.value?.board==="elecrow"),$u=$(()=>Xa[ht.value?.board??""]??Xa.cyd),fo=$(()=>m.selectedTile&&m.layout?.tiles.includes(m.selectedTile)?m.selectedTile:void 0),Tl=e=>!!m.selectedTile&&xe(m.selectedTile)===xe(e);let Qa=0;function Ce(e,t){m.toast={message:e,action:t},clearTimeout(Qa),Qa=window.setTimeout(()=>m.toast=null,t?8e3:5e3)}function wm(){m.toast=null}async function Lt(e,t,n="api_key"){try{if(!navigator.clipboard||!window.isSecureContext)throw new Error;await navigator.clipboard.writeText(e),Ce(c(`editor.copy.${n}.copied`))}catch{if(t){const s=document.createRange();s.selectNodeContents(t);const i=window.getSelection();i?.removeAllRanges(),i?.addRange(s)}Ce(c(document.execCommand("copy")?`editor.copy.${n}.copied`:`editor.copy.${n}.selected`))}}function ki(){const e="/config/integrations/dashboard";try{window.top.location.assign(e)}catch{window.open(e,"_blank")}}const km=["","#settings","#new-screen","#firmware","#alerts","#override"],xt=$(()=>km.includes(m.route)?m.route:"");function He(e){if(location.hash===e){m.route=e;return}location.hash=e}window.addEventListener("hashchange",()=>{m.route=location.hash,window.scrollTo(0,0)});function zs(e){return m.inventory.entities.find(t=>t.id===e)?.name||m.inventory.builtin?.find(t=>t.id===e)?.name||e}let po={source:null,byName:{}};function qs(e){return po.source!==m.inventory.icons&&(po={source:m.inventory.icons,byName:Object.fromEntries((m.inventory.icons?.groups||[]).flatMap(t=>t.icons.map(n=>[n.name,n])))}),e?po.byName[e]:void 0}function Cn(e){const t=m.inventory.icons;if(!t)return"F0335";const n=m.inventory.entities.find(i=>i.id===e),s=e.split(".")[0];return t.builtin?.[e]?t.builtin[e]:n?.icon?n.icon:s==="weather"?t.weather[n?.state||""]||t.weather.partlycloudy:s==="sun"?t.sun[n?.state||""]||t.sun.below_horizon:t.defaults[s]||t.fallback}const vs=e=>qs(e.options?.icon)?.cp||Cn(e.entity),ho=new Set;async function zi(e){const t=[...new Set(e)].filter(n=>!ho.has(n)&&!n.startsWith("screen."));if(t.length){t.forEach(n=>ho.add(n));try{for(let n=0;n`entity=${encodeURIComponent(i)}`).join("&");Object.assign(m.capabilities,(await Ft(`capabilities?${s}`)).capabilities||{})}}catch{t.forEach(n=>ho.delete(n))}}}const mo=new Set;async function $m(e){if(!mo.has(e)){mo.add(e);try{m.entityActions[e]=(await Ft(`entity-actions?entity=${encodeURIComponent(e)}`)).actions}catch{mo.delete(e)}}}let bo=!1;async function qi(){const e=[...new Set((m.layout?.tiles||[]).map(t=>t.entity).filter(t=>!t.startsWith("screen.")))];if(!(!e.length||bo)){bo=!0;try{for(let t=0;t`entity=${encodeURIComponent(s)}`).join("&");Object.assign(m.liveStates,(await Ft(`states?${n}`)).states||{})}}catch{}finally{bo=!1}}}function xm(e){const t=m.liveStates[e];if(t)return t;const n=m.inventory.entities.find(s=>s.id===e);return n?.state?{state:n.state,word:null,a:{}}:null}let Wo=0;function pt(){m.dirty=!0,m.saved=0,Wo++}function xu(e){if(e===m.selected&&m.layout&&m.dirty){Qe(),m.tab="layout",m.menuOpen=!1,He("");return}if(e!==m.selected&&m.dirty&&!confirm(c("editor.screen_view.confirm.switch")))return;e!==m.selected&&(Us(),m.settingEdits={}),m.selected=e,m.selectedTile=null,m.inspector=null,m.tab="layout",m.menuOpen=!1;const t=m.inventory.screens.find(s=>s.id===e);if(!t){m.layout=null;return}const n=JSON.parse(JSON.stringify(t.layout));Vi(n),n.pages=It(Ze(n),n.pages),m.layout=n,m.insertAt=-1,m.dirty=!1,m.saved=0,Yi(0),zi(n.tiles.map(s=>s.entity)),qi(),He("")}const Sm=()=>m.layout?Ze(m.layout):[];function Cm(e){const t=m.layout,n=t.tiles.map(i=>`${i.entity}@${i.slot}`).join();for(const{tile:i,slot:l}of e)i.slot=l,t.tiles.includes(i)||t.tiles.push(i);Vi(t),t.pages=It(Ze(t),t.pages);const s=t.tiles.map(i=>`${i.entity}@${i.slot}`).join()!==n;return s&&pt(),s}function Ys(e,t){if(!m.layout)return!1;zi([e.entity]);const n=hu(m.layout.tiles,e,t),s=n?Cm(n):!1;return s&&!m.liveStates[e.entity]&&qi(),s}function Su(e){const t=m.layout;if(!t||!Bi(e)&&t.tiles.some(i=>i.entity===e)||t.tiles.length>=Kn.value)return;const n=mu(e),s=m.insertAt>=0?m.insertAt:wi(ts(Ze(t)),ut(n));m.insertAt=-1,s>=0&&Ys(n,s)&&Bo(n)}function Cu(e){const t=m.layout;if(!t)return;const n=t.tiles.indexOf(e);n<0||(t.tiles.splice(n,1),Tl(e)&&Qe(),pt(),t.pages=It(Ze(t),t.pages),Ce(c("editor.layout.removed",{name:e.name||zs(e.entity)}),{label:c("editor.common.undo"),run:()=>Ys(e,e.slot)}))}function er(){const e=m.layout;e&&(e.pages=Math.min(fn,It(Ze(e),e.pages)+1),pt())}function Tm(e){const t=m.layout;if(t){for(const n of t.tiles)At(n.slot)>e&&(n.slot-=ze);t.pages=Math.max(1,It(Ze(t),t.pages)-1),pt()}}function Em(e,t){const n=m.layout;if(!n||!Number.isInteger(t)||t<0||t>=fn||t===At(e.slot))return!1;const s=wi(ts(Ze(n).filter(l=>l.tile!==e)),ut(e),t*ze),i=Ys(e,s>=0&&At(s)===t?s:t*ze);return i||Ce(c("editor.layout.no_room",{page:t+1})),i}function Am(){const e=m.layout;if(!e)return 1;const t=m.drag.preview||Ze(e),n=It(t,e.pages);return m.drag.active&&nh.key!=="none"&&i.controls.includes(h.key))?.key||"none"),pt();const f=m.layout;if(f){if(cu(e)&&r!=="full"){const h=At(e.slot),p=f.tiles.filter(y=>y!==e&&At(y.slot)===h),b=ts(Ze(f).filter(y=>y.tile!==e&&!p.includes(y.tile))),v=[];for(const y of p){const I=wi(b,ut(y),(h+1)*ze);if(I<0){v.length=0;break}v.push([y,I]);for(const T of Bn(I,ut(y)))b.add(T)}if(v.length===p.length){for(const[y,I]of v)y.slot=I;e.slot=h*ze}else{const y=wi(ts(Ze(f).filter(I=>I.tile!==e)),"full");y>=0?e.slot=y:(e.options.size=r,Ce(c("editor.layout.no_free_page")))}}else if(jo(e)&&!l){const h=ts(Ze(f).filter(v=>v.tile!==e)),p=du(e.slot),b=Fs(h,p,"wide")?p:pu(h,"wide",p);b>=0&&(e.slot=b)}Vi(f),f.pages=It(Ze(f),f.pages)}}function Pm(e,t){const n=`screen.page_${t}`,s=m.layout;return!s||n===e.entity||!us(n)?!1:!Bi(n)&&s.tiles.some(i=>i.entity===n)?(Ce(c("editor.layout.page_taken",{page:t})),!1):(e.entity=n,s.pages=Math.max(It(Ze(s),s.pages),t),pt(),!0)}function Bo(e){Tl(e)||(m.iconPickerOpen=!1,m.actionPickerOpen=!1,m.actionSearch=""),m.selectedTile=e,m.inspector={kind:"tile"},zi([e.entity])}function Qt(e){m.inspector?.kind==="bar"&&m.inspector.index===e||(m.iconPickerOpen=!1),m.selectedTile=null,m.inspector={kind:"bar",index:e}}function tr(){m.selectedTile=null,m.inspector={kind:"bar-add"}}function Qe(){m.inspector=null,m.selectedTile=null}async function Ko(){if(m.busy||!m.layout||!m.selected)return;m.busy=!0;const e=Wo,t=m.selected;try{const{settings:n,...s}=m.layout;if(await ft(`screens/${encodeURIComponent(m.selected)}`,"PUT",s),m.selected!==t){const i=m.inventory.screens.find(l=>l.id===t)?.name;Ce(i?c("editor.screen_view.saved.other",{name:i}):c("editor.screen_view.saved.other_unnamed"))}else Wo===e?(m.dirty=!1,m.saved=Date.now(),Ce(c("editor.screen_view.saved.current"))):Ce(c("editor.screen_view.saved.newer_edit"));await Tn()}catch(n){Ce(n.message)}finally{m.busy=!1}}const zn=e=>!!(e&&e.alert_action&&pn(ls(e),m.inventory.alerts?.min_firmware||"0.2.31"));async function Tu(e){try{await ft(`screens/${encodeURIComponent(e.id)}/identify`,"POST"),Ce(c("editor.screen_view.identified",{name:e.name}))}catch(t){Ce(t.message)}}async function Om(e,t){return await ft("alerts/test","POST",{screen:e,data:t})}const Im=["title","tiles","header","pages"];function Eu(e,t){const n=m.layout;if(!n)return;const s=(Array.isArray(e.tiles)?e.tiles:[]).filter(u=>!!(u&&typeof u=="object"&&typeof u.entity=="string"&&u.entity.includes("."))).map(u=>({entity:u.entity,name:typeof u.name=="string"?u.name:"",slot:Number.isInteger(u.slot)?u.slot:-1,...u.options&&typeof u.options=="object"?{options:{...u.options}}:{}})),i=new Set,l=s.filter(u=>Bi(u.entity)||!i.has(u.entity)&&i.add(u.entity)),r=l.slice(0,Kn.value);n.tiles=r,e.header&&Array.isArray(e.header.items)?n.header={items:e.header.items.map(u=>({...u}))}:delete n.header,n.pages=Number.isInteger(e.pages)?e.pages:1,Vi(n),n.pages=It(Ze(n),n.pages),Qe(),pt(),zi(r.map(u=>u.entity)),qi(),Yi(0),Ce(t(r.lengthn.id===e);!t||!m.layout||Eu(JSON.parse(JSON.stringify(t.layout)),n=>n?c("editor.layout.copied_part",{name:t.name,...n}):c("editor.layout.copied",{name:t.name}))}function Mm(){const e=m.layout;if(!e)return"";const t={esp_screens_layout:1};for(const n of Im)e[n]!==void 0&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function Au(){const e=Mm();if(!e)return;const t=`${(ht.value?.name||"screen").toLowerCase().replace(/[^a-z0-9]+/g,"-")}.layout.json`,n=URL.createObjectURL(new Blob([e],{type:"application/json"})),s=document.createElement("a");s.href=n,s.download=t,s.click(),setTimeout(()=>URL.revokeObjectURL(n),5e3),Lt(e,void 0,"layout_json")}function Rm(e){let t;try{t=JSON.parse(e)}catch{Ce(c("editor.layout.not_json"));return}if(!t||typeof t!="object"||!Array.isArray(t.tiles)){Ce(c("editor.layout.no_tiles_in_file"));return}Eu(t,n=>n?c("editor.layout.imported_part",n):c("editor.layout.imported"))}function Nm(e){const t=m.inventory.updates?.target,n=m.inventory.changelog;if(!Array.isArray(n)||!t)return[];const s=ls(e),i=[];for(const l of n)if(!(pn(l.firmware,t)&&l.firmware!==t)&&!(s&&pn(s,l.firmware)))for(const r of l.lines)i.includes(r)||i.push(r);return i}let vo=!1;async function Fm(){if(!vo){vo=!0;try{const e=await Ft("firmware");m.firmwareJob={job:e.job,logs:e.logs||[]}}catch{}finally{vo=!1}}}const zo=()=>m.inventory.screens.some(e=>e.update?.state==="running")||m.updating.length>0;function Xn(e){const t=e.update||{};if(!(t.state==="running"||m.updating.includes(e.id)))return null;const n=m.firmwareJob?.job?.stage;return t.phase==="verify"?{percent:78,text:_s("verify")}:t.phase==="settle"?{percent:92,text:_s("settle")}:t.phase==="install"||!t.phase?n==="upload"?{percent:66,text:c("editor.update.writing")}:n?{percent:40,text:c("editor.update.building")}:{percent:12,text:_s("install")}:{percent:12,text:_s(t.phase)}}const hn=()=>m.layout?.header?.items??(m.layout?.settings?.show_clock??!0?[{type:"clock"}]:[]),_n=()=>m.inventory.header?.max_items||6;function Ds(e){m.layout&&(m.layout.header={items:e},pt(),Yi())}let nr=0;function Yi(e=150){clearTimeout(nr),nr=window.setTimeout(async()=>{const t=hn();if(t.some(n=>n.type==="entity"))try{const n=await ft("header-preview","POST",{header:{items:t}});t.forEach((s,i)=>m.topbarPreviews[at(s)]=n.items[i])}catch{}},e)}function gs(e){return e.type==="entity"?zs(e.entity):m.inventory.header?.builtin.find(t=>t.type===e.type)?.label||e.type}function vn(e){const t=new Date(m.now);if(e.type==="clock")return{text:Wi(as.value,t,an.value),shown:!0};if(e.type==="date")return{text:Sl(t,an.value),shown:!0};if(e.type==="analog")return{analog:!0,shown:!0};const n=m.topbarPreviews[at(e)];return n?{icon:n.i||null,text:n.k==="ago"?fm(n.e,Math.floor(m.now/1e3),an.value):n.t,color:n.c?`#${n.c}`:null,shown:n.shown}:{icon:e.icon==="none"?null:qs(e.icon)?.cp||Cn(e.entity),text:"…",shown:!0,loading:!0}}function go(e,t){const n=[...hn()];return t<0||t>=n.length||e===t?!1:(n.splice(t,0,...n.splice(e,1)),Ds(n),!0)}function sr(e){const t=[...hn()],[n]=t.splice(e,1);n&&(m.inspector?.kind==="bar"&&Qe(),Ds(t),Ce(c("editor.topbar.removed",{name:gs(n)}),{label:c("editor.common.undo"),run:()=>{const s=[...hn()];s.splice(Math.min(e,s.length),0,n),Ds(s)}}))}function _o(e){const t=hn();if(t.length>=_n())return Ce(c("editor.topbar.full",_n()));if(t.some(n=>at(n)===at(e)))return Ce(c("editor.topbar.already"));m.topbarAdded={key:at(e),time:Date.now()},Ds([...t,e]),Qt(t.length)}const Dm=[{group:"brightness",icon:"F0599",rows:[{key:"brightness",kind:"number",min:5,max:100,step:5,unit:"%"},{key:"dark_mode",kind:"toggle"},{key:"standby_enabled",kind:"toggle"},{key:"standby_seconds",kind:"duration",min:60,max:86400,needs:"standby_enabled"},{key:"standby_brightness",kind:"number",min:0,max:100,step:5,unit:"%",needs:"standby_enabled",cap:"brightness"}]},{group:"night",icon:"F0594",rows:[{key:"night_enabled",kind:"toggle"},{key:"night_start",kind:"moment",needs:"night_enabled"},{key:"night_end",kind:"moment",needs:"night_enabled"},{key:"night_brightness",kind:"number",min:0,max:100,step:5,unit:"%",needs:"night_enabled",cap:"brightness"}]},{group:"screen",icon:"F0379",rows:[{key:"auto_home",kind:"toggle"},{key:"auto_home_seconds",kind:"duration",min:30,max:3600,needs:"auto_home"},{key:"home_on_standby",kind:"toggle"},{key:"swipe_pages",kind:"toggle"},{key:"page_buttons",kind:"toggle"},{key:"rotation",kind:"choice",options:[0,90,180,270]}]}],yo=e=>c(`editor.screen_settings.rows.${e.key}`),Um=(e,t)=>`${t}°`;function Pu(e=Sm(),t=m.layout?It(e,m.layout.pages):1){const n=xi();if(t<2||n.page_buttons!==!1||n.swipe_pages!==!1)return"";const{tiles:s,targets:i,unreachable:l,noWayBack:r}=nm(e,t);if(!l.length&&!r.length)return"";const u=v=>c("editor.screen_settings.reach.pages",{list:em(v)},v.length),f=l.filter(v=>!i.includes(v)),h=l.filter(v=>i.includes(v)),p=f.length===1?"one":"more",b=[c("editor.screen_settings.reach.intro")];return s&&f.length?b.push(c(`editor.screen_settings.reach.tiles_missing_${p}`,{targets:u(i),missing:u(f)},s)):s?b.push(c("editor.screen_settings.reach.tiles",{targets:u(i)},s)):f.length?b.push(c(`editor.screen_settings.reach.none_missing_${p}`,{missing:u(f)})):b.push(c("editor.screen_settings.reach.none")),h.length&&b.push(c("editor.screen_settings.reach.cut_off",{pages:u(h)})),r.length&&b.push(c("editor.screen_settings.reach.no_way_back",{pages:u(r)})),b.join(" ")}const Ou=4e3;let yn={},ns=null,$i=0,li=null;const El=()=>ht.value?.settings;function xi(){const e=El(),t={...e?.values||{}};for(const[n,s]of Object.entries(m.settingEdits))t[n]=s.value;return t}const jm=e=>e<300?30:e<900?60:e<3600?300:e<7200?900:1800;function ir(e,t,n,s,i){if(e.kind==="moment"){let u=s&&t%60?Math.floor(t/60)*60+(n>0?60:0):t+n*(s?60:15);return u%=1440,u<0?u+1440:u}const l=e.kind==="duration"?jm(n<0?t-1:t):e.step,r=e.cap?Math.min(e.max,i[e.cap]):e.max;return Math.min(r,Math.max(e.min,t+n*l))}function Hm(e){if(e<60)return c("editor.screen_settings.duration.seconds",{n:e});if(e<3600)return c("editor.screen_settings.duration.minutes",{n:Math.floor(e/60)});const t=Math.floor(e/3600),n=Math.floor(e%3600/60);return n?c("editor.screen_settings.duration.hours_minutes",{h:t,m:String(n).padStart(2,"0")}):c("editor.screen_settings.duration.hours",{n:t})}function Vm(e,t){const n=Math.floor(e/60),s=String(e%60).padStart(2,"0");return t?`${String(n).padStart(2,"0")}:${s}`:c(n<12?"editor.screen_settings.time.am":"editor.screen_settings.time.pm",{time:`${n%12||12}:${s}`})}function Wm(e,t){const n=t[e.key];return n==null?"—":e.kind==="number"?`${n}${e.unit||""}`:e.kind==="duration"?Hm(n):e.kind==="moment"?Vm(n,as.value):""}function ni(e,t,n){if(ns&&ns!==m.selected&&Object.keys(yn).length){Us(),Ce(c("editor.screen_settings.other_screen_busy"));return}ns=m.selected;const s=xi();if(m.settingEdits[e]={value:t,at:Date.now()},yn[e]=t,e==="brightness")for(const i of["standby_brightness","night_brightness"])s[i]>t&&(m.settingEdits[i]={value:t,at:Date.now()});m.settingPending=!0,clearTimeout($i),$i=window.setTimeout(()=>Us(),n)}async function Us(e=!1){if(clearTimeout($i),li||!Object.keys(yn).length||!ns)return;const t=ns,n=yn;yn={};const s=Cl(`screens/${encodeURIComponent(t)}/settings`,{method:"PUT",body:JSON.stringify({settings:n}),keepalive:e});li=s;try{const i=await(await s).json(),l=m.inventory.screens.find(r=>r.id===t);l&&(l.settings=i)}catch(i){if(Ce(i.message),t===m.selected)for(const l of Object.keys(n))delete m.settingEdits[l];if(t===m.selected&&n.brightness!==void 0)for(const l of["standby_brightness","night_brightness"])delete m.settingEdits[l]}finally{li=null,Object.keys(yn).length?$i=window.setTimeout(()=>Us(),150):ns=null,m.settingPending=!!Object.keys(yn).length,t===m.selected&&Si(),setTimeout(()=>{t===m.selected&&Si()},Ou+100)}}function Si(){const e=El();for(const[t,n]of Object.entries(m.settingEdits))yn[t]!==void 0||li||(e&&e.values[t]===n.value||Date.now()-n.at>Ou)&&delete m.settingEdits[t]}const _s=e=>["install","verify","settle"].includes(e||"")?c(`editor.update.phases.${e}`):c("editor.update.starting");async function qo(e,t){m.updating.push(e.id);try{await ft(`screens/${encodeURIComponent(e.id)}/update`,"POST",t?{host:t}:{}),await Tn()}catch(n){m.updating=m.updating.filter(s=>s!==e.id),Ce(n.message)}}async function or(){try{await ft("updates/run","POST"),await Tn()}catch(e){Ce(e.message)}}async function Bm(e){try{await ft("updates","PUT",{auto:e}),m.inventory.updates&&(m.inventory.updates.auto=e),Ce(c(e?"editor.settings.updates.auto_on":"editor.settings.updates.auto_off"))}catch(t){Ce(t.message)}}async function Km(){try{m.inventory.claude_skill=await ft("claude-skill","POST"),Ce(c(m.inventory.claude_skill?.restart?"editor.settings.claude.installed_restart":"editor.settings.claude.installed"))}catch(e){Ce(e.message)}}const an=$(()=>ou(m.inventory.language?.effective));Tt(an,e=>lu(e),{immediate:!0});const jn=(e,t={})=>c(e,t,{locale:an.value}),zm=e=>m.inventory.language?.languages?.find(t=>t.code===e)?.name||Gh(e||"")?.name||e||"",Iu=e=>!!(e.update?.available||e.update?.language),lr=()=>c("editor.update.new_language",{name:zm(m.inventory.language?.effective)}),as=$(()=>m.inventory.language?.clock_effective!=="12"),qm=$(()=>{const e=m.inventory.language;return{...os[e?.numbers_effective||"point"]||os.point,from:(e?.group_min||1)>=2?5:4}}),Ym=$(()=>{const e=m.inventory.language;return{...os[e?.numbers_auto||"point"]||os.point,from:(e?.group_min_auto||1)>=2?5:4}});function ar(e){return!e||e==="°"?e||"":e==="%"?m.inventory.language?.percent_space?" %":"%":` ${e}`}const Gm=e=>m.inventory.builtin?.find(t=>t.id===e)?.screen_name;async function rr(e){try{const t=await ft("language","PUT",e);return t?.language&&(m.inventory.language=t.language),Ce(c(e.setting===void 0?"editor.settings.language.saved":"editor.settings.language.saved_language")),await Tn(),!0}catch(t){return Ce(t.message),!1}}async function Tn(e=!0){try{const t=await Ft(e?"inventory":"inventory?light=1");m.inventory=e?t:{...m.inventory,...t},t.csrf&&gm(t.csrf),m.connected=!!m.inventory.connected,m.reachable=!0;for(const n of m.inventory.screens)n.update?.state==="running"&&(m.updating=m.updating.filter(s=>s!==n.id));m.selected&&Si()}catch{m.reachable=!1}}function Jm(e){m.inventory={...m.inventory,...e},m.connected=!!m.inventory.connected;for(const t of m.inventory.screens)t.update?.state==="running"&&(m.updating=m.updating.filter(n=>n!==t.id));m.selected&&Si()}let cr=0,Yo=Date.now(),Ci=!1,hs=null;function Xm(){hs||typeof EventSource>"u"||(hs=new EventSource(`api/events?language=${encodeURIComponent($l())}`),hs.onopen=()=>{Ci=!0,js()},hs.onmessage=e=>{document.hidden||Jm(JSON.parse(e.data))},hs.onerror=()=>{Ci=!1,js()})}function js(){clearTimeout(cr);const e=Ci?6e4:m.inventory.updates?.busy?3e3:1e4;cr=window.setTimeout(async()=>{if(!document.hidden){const t=Date.now()-Yo>=3e5;t&&(Yo=Date.now()),(t||!Ci)&&await Tn(t)}js()},e)}let ur=!1;function Zm(){ur||(ur=!0,Tn(),Xm(),js(),vm(()=>m.fontsVersion++),setInterval(()=>{!m.layout||document.hidden||m.drag.active||(m.now=Date.now(),Yi(0))},3e4),setInterval(()=>{!document.hidden&&m.layout&&m.tab==="layout"&&xt.value===""&&qi()},8e3),setInterval(()=>{!document.hidden&&zo()?Fm():m.firmwareJob&&!zo()&&(m.firmwareJob=null)},3e3),document.addEventListener("visibilitychange",async()=>{document.hidden||(Yo=Date.now(),m.now=Date.now(),await Tn(),js())}),window.addEventListener("pagehide",()=>Us(!0)),window.addEventListener("beforeunload",e=>{m.dirty&&(e.preventDefault(),e.returnValue="")}))}const Qm={class:"side"},eb={class:"label"},tb={id:"screens"},nb=["aria-current","onClick"],sb={class:"txt"},ib=["aria-label","title"],ob={key:1,class:"pill"},lb={key:2,class:"spin small"},ab=["onSubmit"],rb=["placeholder","aria-label"],cb={type:"submit",class:"btn mini primary"},ub=["aria-label"],db=["disabled","title","onClick"],fb={key:2,class:"whatsnew"},pb=["aria-valuenow"],hb={class:"progress-text"},mb=["title"],bb=["title"],vb={id:"pending"},gb={class:"pending-actions"},_b=["onClick"],yb=["aria-current"],wb={class:"txt"},kb={class:"more"},$b={class:"label"},xb=["aria-current"],Sb={class:"mdi"},Cb={class:"txt"},Tb=["aria-current"],Eb={class:"mdi"},Ab={class:"txt"},Pb=["aria-current"],Ob={class:"mdi"},Ib={class:"txt"},Lb={class:"txt"},Mb=Le({__name:"Sidebar",setup(e){const t=$e(null),n=$e(""),s=p=>{const b=p.update||{};return!!b.language&&(!b.target||pn(ls(p),b.target))};function i(p){const b=p.update||{};return b.state==="running"||m.updating.includes(p.id)?{kind:"running",text:_s(b.phase)}:b.state==="queued"?{kind:"queued",text:c("editor.sidebar.update.queued")}:Iu(p)&&p.online?{kind:"available",text:s(p)?lr():c("editor.sidebar.update.available",{version:b.target})}:b.result&&Date.now()/1e3-b.result.time<86400?{kind:b.result.state==="failed"?"failed":"done",text:b.result.message}:null}const l=p=>[...p.update?.language&&!s(p)?[lr()]:[],...Nm(p)];function r(p){const b=p.update||{};b.host&&b.profile?qo(p):b.profile&&(t.value=p.id,n.value="")}function u(p){const b=n.value.trim();b&&(t.value=null,qo(p,b))}const f=()=>{const p=m.firmwareJob?.logs||[];return p.length?p[p.length-1]:""},h=p=>p.installed?c("editor.sidebar.pending.installed"):p.downloaded?c("editor.sidebar.pending.downloaded"):c("editor.sidebar.pending.not_flashed",{file:p.file});return(p,b)=>(g(),_("aside",Qm,[b[13]||(b[13]=o("div",{class:"brand"},[o("span",{class:"mark"},"▦"),o("span",null,"ESP Screens")],-1)),o("span",{id:"connection",class:he(["conn",{online:a(m).connected}]),role:"status"},d(a(m).reachable?a(m).connected?a(c)("editor.sidebar.connection.connected"):a(c)("editor.sidebar.connection.reconnecting"):a(c)("editor.sidebar.connection.unreachable")),3),o("button",{type:"button",class:"search-btn",id:"open-palette",onClick:b[0]||(b[0]=v=>a(m).palette=!0)},[Me("⌕ "+d(a(c)("editor.sidebar.search")),1),b[10]||(b[10]=o("kbd",null,"⌘K",-1))]),o("div",eb,d(a(c)("editor.sidebar.screens")),1),o("div",tb,[(g(!0),_(q,null,me(a(m).inventory.screens,v=>(g(),_("div",{key:v.id,class:he(["screen-item",{selected:v.id===a(m).selected&&a(xt)===""}])},[o("button",{type:"button",class:"nav-item","aria-current":v.id===a(m).selected&&a(xt)===""?"true":"false",onClick:y=>a(xu)(v.id)},[o("span",{class:he(["dot",{off:!v.online}])},null,2),o("span",sb,[o("span",null,d(v.name),1),o("small",null,d(v.online?a(c)("editor.common.online"):a(c)("editor.common.offline"))+d(v.area?" · "+v.area:"")+" · "+d(v.firmware||a(c)("editor.common.unknown")),1)]),v.id===a(m).selected&&a(m).dirty?(g(),_("span",{key:0,class:"unsaved",role:"img","aria-label":a(c)("editor.common.unsaved"),title:a(c)("editor.common.unsaved")},null,8,ib)):B("",!0),i(v)?.kind==="available"?(g(),_("span",ob,d(a(c)("editor.sidebar.update.pill")),1)):i(v)?.kind==="running"?(g(),_("span",lb)):B("",!0)],8,nb),i(v)?(g(),_("div",{key:0,class:he(["screen-update",i(v).kind])},[i(v).kind==="available"?(g(),_(q,{key:0},[t.value===v.id?(g(),_(q,{key:0},[o("small",null,d(a(c)("editor.sidebar.host.hint")),1),o("form",{class:"screen-host",onSubmit:Ot(y=>u(v),["prevent"])},[Te(o("input",{"onUpdate:modelValue":b[1]||(b[1]=y=>n.value=y),placeholder:a(c)("editor.sidebar.host.placeholder"),required:"",pattern:"[A-Za-z0-9][A-Za-z0-9.\\-]*","aria-label":a(c)("editor.sidebar.host.label"),autofocus:""},null,8,rb),[[Xe,n.value]]),o("button",cb,d(a(c)("editor.sidebar.host.start")),1),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.cancel"),onClick:b[2]||(b[2]=y=>t.value=null)},"✕",8,ub)],40,ab)],64)):(g(),_(q,{key:1},[o("small",null,d(i(v).text),1),o("button",{type:"button",class:"btn mini primary",disabled:!v.update?.profile,title:v.update?.profile?"":a(c)("editor.sidebar.update.no_profile"),onClick:y=>r(v)},d(a(c)("editor.sidebar.update.button")),9,db)],64)),l(v).length?(g(),_("details",fb,[o("summary",null,d(a(c)("editor.sidebar.update.whats_new")),1),o("ul",null,[(g(!0),_(q,null,me(l(v).slice(0,8),y=>(g(),_("li",{key:y},d(y),1))),128))])])):B("",!0)],64)):i(v).kind==="running"&&a(Xn)(v)?(g(),_(q,{key:1},[o("div",{class:"progress",role:"progressbar","aria-valuenow":a(Xn)(v).percent,"aria-valuemin":"0","aria-valuemax":"100"},[o("i",{style:Ue({width:a(Xn)(v).percent+"%"})},null,4)],8,pb),o("div",hb,[o("span",null,d(a(Xn)(v).percent)+" %",1),o("span",{title:f()},d(a(Xn)(v).text),9,mb)]),f()?(g(),_("small",{key:0,title:f(),style:{"white-space":"nowrap",overflow:"hidden","text-overflow":"ellipsis"}},d(f()),9,bb)):B("",!0),o("button",{type:"button",class:"btn link mini",style:{"justify-self":"start"},onClick:b[3]||(b[3]=y=>a(He)("#firmware"))},d(a(c)("editor.sidebar.update.full_log")),1)],64)):(g(),_("small",{key:2,class:he({failed:i(v).kind==="failed"})},d(i(v).text),3))],2)):B("",!0)],2))),128))]),o("div",vb,[(g(!0),_(q,null,me(a(m).inventory.pending||[],v=>(g(),_("div",{key:v.file,class:"pending"},[o("strong",null,d(v.friendly),1),o("small",null,d(h(v)),1),o("div",gb,[o("button",{type:"button",class:"btn mini quiet",onClick:b[4]||(b[4]=(...y)=>a(ki)&&a(ki)(...y))},d(a(c)("editor.common.open_integrations")),1),v.api_key?(g(),_("button",{key:0,type:"button",class:"btn mini quiet",onClick:y=>a(Lt)(v.api_key)},d(a(c)("editor.sidebar.copy_api_key")),9,_b)):B("",!0)])]))),128))]),o("button",{id:"new-screen",type:"button",class:"nav-item ghost","aria-current":a(xt)==="#new-screen"?"true":"false",onClick:b[5]||(b[5]=v=>a(He)("#new-screen"))},[b[11]||(b[11]=o("span",{class:"plus"},"+",-1)),o("span",wb,d(a(c)("editor.nav.new_screen")),1)],8,yb),b[14]||(b[14]=o("div",{class:"spacer"},null,-1)),o("div",kb,[o("div",$b,d(a(c)("editor.sidebar.more")),1),o("button",{id:"open-firmware",type:"button",class:"nav-item","aria-current":a(xt)==="#firmware"?"true":"false",onClick:b[6]||(b[6]=v=>a(He)("#firmware"))},[o("span",Sb,d(a(Ae)("F0241")),1),o("span",Cb,d(a(c)("editor.nav.firmware")),1)],8,xb),o("button",{id:"open-alerts",type:"button",class:"nav-item","aria-current":a(xt)==="#alerts"?"true":"false",onClick:b[7]||(b[7]=v=>a(He)("#alerts"))},[o("span",Eb,d(a(Ae)("F0594")),1),o("span",Ab,d(a(c)("editor.nav.alerts")),1)],8,Tb),o("button",{id:"open-settings",type:"button",class:"nav-item","aria-current":a(xt)==="#settings"?"true":"false",onClick:b[8]||(b[8]=v=>a(He)("#settings"))},[o("span",Ob,d(a(Ae)("F0493")),1),o("span",Ib,d(a(c)("editor.nav.settings")),1)],8,Pb),o("button",{id:"refresh",type:"button",class:"nav-item ghost",onClick:b[9]||(b[9]=v=>a(Tn)())},[b[12]||(b[12]=o("span",{class:"plus"},"↻",-1)),o("span",Lb,d(a(c)("editor.sidebar.refresh")),1)])])]))}}),Rb={key:0,id:"toast",class:"toast",role:"status"},Nb=Le({__name:"Toast",setup(e){return(t,n)=>a(m).toast?(g(),_("div",Rb,[o("span",null,d(a(m).toast.message),1),a(m).toast.action?(g(),_("button",{key:0,type:"button",onClick:n[0]||(n[0]=s=>{a(m).toast.action.run(),a(wm)()})},d(a(m).toast.action.label),1)):B("",!0)])):B("",!0)}}),Fb=["aria-label"],Db=["placeholder","aria-label"],Ub={class:"palette-list"},jb={class:"palette-group"},Hb=["onMouseenter","onClick"],Vb={key:0,class:"mdi"},Wb={key:1,class:"glyph"},Bb={class:"tx"},Kb={key:0},zb={key:2,class:"hint-key"},qb={key:0,class:"palette-empty"},Yb=Le({__name:"CommandPalette",setup(e){const t=$e(""),n=$e(0),s=$e(null),i=$(()=>{const h=t.value.trim().toLocaleLowerCase(),p=[],b=c("editor.palette.groups.screens"),v=c("editor.palette.groups.actions");for(const T of m.inventory.screens)p.push({group:b,label:T.name,detail:`${T.online?c("editor.common.online"):c("editor.common.offline")} · ${T.firmware||c("editor.common.unknown")}`,glyphText:"▦",run:()=>xu(T.id)});const y=ht.value,I=[{group:v,label:c("editor.nav.new_screen"),detail:c("editor.nav.new_screen_detail"),glyphText:"+",run:()=>He("#new-screen")},{group:v,label:c("editor.nav.firmware"),icon:"F0241",run:()=>He("#firmware")},{group:v,label:c("editor.nav.alerts"),detail:c("editor.palette.alerts_detail"),icon:"F0594",run:()=>He("#alerts")},{group:v,label:c("editor.nav.settings"),detail:c("editor.palette.settings_detail"),icon:"F0493",run:()=>He("#settings")}];if(y&&m.layout&&I.unshift({group:v,label:c("editor.common.save_send"),detail:m.dirty?c("editor.common.unsaved"):c("editor.palette.nothing_to_save"),key:"⌘S",run:()=>Ko()},{group:v,label:c("editor.screen_view.tabs.layout"),detail:y.name,run:()=>{He(""),m.tab="layout"}},{group:v,label:c("editor.screen_view.tabs.settings"),detail:y.name,run:()=>{He(""),m.tab="settings"}},{group:v,label:c("editor.palette.identify"),detail:zn(y)?c("editor.palette.identify_detail"):c("editor.palette.identify_needs"),run:()=>{zn(y)&&Tu(y)}},{group:v,label:c("editor.palette.export"),detail:c("editor.palette.export_detail"),run:Au}),p.push(...I),y&&m.layout&&h){const T=new Set(m.layout.tiles.map(A=>A.entity)),k=m.layout.tiles.length>=Kn.value;for(const A of m.inventory.entities)if(!(A.tile===!1||T.has(A.id))&&`${A.name} ${A.id} ${A.area||""} ${A.device||""}`.toLocaleLowerCase().includes(h)&&(p.push({group:c("editor.palette.groups.add"),label:A.name,detail:[Ht(A.id)[0],A.area].filter(Boolean).join(" · "),icon:m.inventory.icons?Cn(A.id):void 0,run:()=>{k||Su(A.id)}}),p.length>60))break}return h?p.filter(T=>`${T.label} ${T.detail||""}`.toLocaleLowerCase().includes(h)):p}),l=$(()=>{const h=[];return i.value.forEach((p,b)=>{(h.find(y=>y.group===p.group)||(h.push({group:p.group,items:[]}),h[h.length-1])).items.push({item:p,index:b})}),h});function r(){m.palette=!1}function u(h){r(),h.run()}function f(h){if(h.key==="Escape")h.preventDefault(),r();else if(h.key==="ArrowDown")h.preventDefault(),n.value=Math.min(i.value.length-1,n.value+1);else if(h.key==="ArrowUp")h.preventDefault(),n.value=Math.max(0,n.value-1);else if(h.key==="Enter"){h.preventDefault();const p=i.value[n.value];p&&u(p)}}return Tt(t,()=>n.value=0),Tt(()=>m.palette,async h=>{h&&(t.value="",n.value=0,await Ni(),s.value?.focus())}),(h,p)=>a(m).palette?(g(),_("div",{key:0,class:"palette-backdrop",onClick:r},[o("div",{class:"palette",role:"dialog","aria-label":a(c)("editor.sidebar.search"),onClick:p[1]||(p[1]=Ot(()=>{},["stop"])),onKeydown:f},[Te(o("input",{ref_key:"input",ref:s,"onUpdate:modelValue":p[0]||(p[0]=b=>t.value=b),id:"palette-input",placeholder:a(c)("editor.palette.placeholder"),"aria-label":a(c)("editor.sidebar.search"),autocomplete:"off"},null,8,Db),[[Xe,t.value]]),o("div",Ub,[(g(!0),_(q,null,me(l.value,b=>(g(),_(q,{key:b.group},[o("div",jb,d(b.group),1),(g(!0),_(q,null,me(b.items,({item:v,index:y})=>(g(),_("button",{key:y,type:"button",class:he(["palette-item",{active:y===n.value}]),onMouseenter:I=>n.value=y,onClick:I=>u(v)},[v.icon?(g(),_("span",Vb,d(a(Ae)(v.icon)),1)):(g(),_("span",Wb,d(v.glyphText||"›"),1)),o("span",Bb,[o("span",null,d(v.label),1),v.detail?(g(),_("small",Kb,d(v.detail),1)):B("",!0)]),v.key?(g(),_("kbd",zb,d(v.key),1)):B("",!0)],42,Hb))),128))],64))),128)),i.value.length?B("",!0):(g(),_("p",qb,d(a(c)("editor.palette.empty")),1))])],40,Fb)])):B("",!0)}}),ve={source:null,element:null,ghost:null,timer:0,start:null,offset:{x:0,y:0},pointerId:null,suppressUntil:0,last:null,scroller:0,target:null},Lu={mounted(e,t){e.__dragSource=t.value,e.addEventListener("pointerdown",s=>{const i=e.__dragSource;if(!(s.button!==0||e.disabled||s.target.closest(".remove"))){s.pointerType!=="touch"&&s.preventDefault(),Object.assign(ve,{source:i,element:e,start:{x:s.clientX,y:s.clientY},pointerId:s.pointerId});try{e.setPointerCapture(s.pointerId)}catch{}clearTimeout(ve.timer),s.pointerType==="touch"&&(ve.timer=window.setTimeout(()=>dr(s),260))}}),e.addEventListener("pointermove",s=>{if(m.drag.active||!ve.start||ve.element!==e)return;const i=Math.hypot(s.clientX-ve.start.x,s.clientY-ve.start.y);if(s.pointerType==="touch"){i>10&&(clearTimeout(ve.timer),ve.start=null);return}i>=6&&dr(s)});const n=()=>{ve.element===e&&!m.drag.active&&(clearTimeout(ve.timer),ve.start=null)};e.addEventListener("pointerup",n),e.addEventListener("pointercancel",n)},updated(e,t){e.__dragSource=t.value}};function dr(e){if(m.drag.active||!ve.start||!ve.source||!ve.element)return;m.drag.active=!0,m.drag.moving=ve.source.kind==="tile"?ve.source.tile:mu(ve.source.id),m.drag.preview=null,ve.target=null,getSelection()?.removeAllRanges();const t=ve.element.getBoundingClientRect(),n=ve.element.cloneNode(!0);n.classList.add("drag-ghost"),n.style.width=`${t.width}px`,n.style.height=`${t.height}px`,ve.offset={x:e.clientX-t.left,y:e.clientY-t.top},document.body.append(n),ve.ghost=n,document.addEventListener("pointermove",Go),document.addEventListener("pointerup",Ti),document.addEventListener("pointercancel",Ti);try{ve.element.releasePointerCapture(ve.pointerId)}catch{}try{document.documentElement.setPointerCapture(ve.pointerId)}catch{}document.addEventListener("touchmove",Mu,{passive:!1}),ve.scroller=window.setInterval(()=>{if(!ve.last)return;const{x:s,y:i}=Gb(document),l=s?hr(ve.last.x,pr(s,"x")):0,r=i?hr(ve.last.y,pr(i,"y")):0;l&&s.scrollBy(l,0),r&&i.scrollBy(0,r),(l||r)&&Jo(Ru(ve.last.x,ve.last.y))},16),Jo(-1),Go(e)}function fr(e,t){if(!e)return!1;const n=t==="x"?e.scrollWidth>e.clientWidth:e.scrollHeight>e.clientHeight,s=getComputedStyle(e)[t==="x"?"overflowX":"overflowY"];return n&&(s==="auto"||s==="scroll")}function Gb(e){const t=e.querySelector(".pages"),n=e.querySelector(".canvas");return{x:fr(t,"x")?t:n,y:fr(n,"y")?n:e.scrollingElement}}function pr(e,t){const n=t==="x"?window.innerWidth:window.innerHeight;if(e===e.ownerDocument.scrollingElement)return[0,n];const s=e.getBoundingClientRect();return t==="x"?[Math.max(s.left,0),Math.min(s.right,n)]:[Math.max(s.top,0),Math.min(s.bottom,n)]}function hr(e,[t,n]){return en-60?12:0}function Mu(e){m.drag.active&&e.preventDefault()}function Ti(e){e.pointerId===ve.pointerId&&Jb(e.type==="pointerup")}function Go(e){!ve.ghost||e.pointerId!==ve.pointerId||(ve.last={x:e.clientX,y:e.clientY},ve.ghost.style.transform=`translate(${e.clientX-ve.offset.x}px, ${e.clientY-ve.offset.y}px)`,Jo(Ru(e.clientX,e.clientY)))}function Ru(e,t){let n=null,s=1/0;for(const l of document.querySelectorAll(".pages [data-slot]")){const r=l.getBoundingClientRect(),u=Math.hypot(Math.max(r.left-e,0,e-r.right),Math.max(r.top-t,0,t-r.bottom));u16)return-1;let i=Number(n.cell.dataset.slot);return n.cell.classList.contains("wide")&&e>(n.r.left+n.r.right)/2&&(i+=1),i}function Jo(e){ve.target===e||!m.layout||!m.drag.moving||(ve.target=e,m.drag.preview=e>=0?hu(m.layout.tiles,m.drag.moving,e):null)}function Jb(e){const t=m.drag.preview,n=m.drag.moving;document.removeEventListener("pointermove",Go),document.removeEventListener("pointerup",Ti),document.removeEventListener("pointercancel",Ti),document.removeEventListener("touchmove",Mu);try{document.documentElement.releasePointerCapture(ve.pointerId)}catch{}if(ve.ghost?.remove(),Object.assign(ve,{ghost:null,suppressUntil:Date.now()+400,last:null,start:null,target:null,element:null,source:null}),clearInterval(ve.scroller),m.drag.active=!1,m.drag.preview=null,m.drag.moving=null,e&&t&&n&&m.layout){const s=m.layout.tiles.map(l=>`${l.entity}@${l.slot}`).join(),i=!m.layout.tiles.includes(n);for(const{tile:l,slot:r}of t)l.slot=r,m.layout.tiles.includes(l)||m.layout.tiles.push(l);m.layout.tiles.sort((l,r)=>l.slot-r.slot),m.layout.tiles.map(l=>`${l.entity}@${l.slot}`).join()!==s&&pt(),i&&Ys(n,n.slot)}}window.addEventListener("click",e=>{Date.now()t.tile.name||b.value==="screen"&&Gm(t.tile.entity)||zs(t.tile.entity)),s=$(()=>cu(t.tile)),i=$(()=>jo(t.tile)&&!s.value),l=$(()=>us(t.tile.entity)),r=$(()=>m.inventory.backgrounds?.[t.tile.options?.background||""]?.color),u=$(()=>t.tile.options?.background==="none"),f=$(()=>t.tile.options?.display||"standard"),h=$(()=>f.value!=="standard"?vu(f.value):""),p=$(()=>bu(t.tile,m.inventory)),b=$(()=>t.tile.entity.split(".")[0]),v=$(()=>m.inventory.icons?.controls||{}),y=H=>v.value[H]?Ae(v.value[H]):"",I=$(()=>Tl(t.tile)&&m.inspector?.kind==="tile"),T=$(()=>!t.placeholder&&m.layout?.tiles.includes(t.tile)),k=$(()=>c("editor.tile_card.label",{name:n.value,slot:t.slot%ze+1,page:At(t.slot)+1})),A=$(()=>new Date(m.now)),S=$(()=>(A.value.getHours()%12+A.value.getMinutes()/60)*30),U=$(()=>A.value.getMinutes()*6),C=$(()=>b.value==="screen"?null:xm(t.tile.entity)),K=$(()=>!C.value||["unavailable","unknown",""].includes(C.value.state)),O=$(()=>!!C.value&&!K.value&&C.value.state!=="off"&&C.value.state!=="closed"&&C.value.state!=="standby"&&C.value.state!=="idle"&&C.value.state!=="docked"),E=$(()=>["light","switch","input_boolean","fan"].includes(b.value)&&C.value?.state==="on"),R=$(()=>C.value?.a?.unit_of_measurement),L=H=>H.charAt(0).toUpperCase()+H.slice(1).replace(/_/g," "),D=H=>au(H,qm.value),M=["number","input_number","counter"],Y=H=>R.value||M.includes(b.value)?`${D(H)}${ar(R.value)}`:H,te={climate:"climate",cover:"cover",media_player:"media",person:"person",sun:"sun",vacuum:"vacuum",weather:"weather"};function ye(H){const ne=wt=>Yh(`screen.ha.${wt}`)?jn(`screen.ha.${wt}`):"",se=H.state==="windy-variant"?"windy":H.state.replace(/-/g,"_");return b.value==="binary_sensor"&&["on","off"].includes(se)?ne(`binary.${H.a?.device_class}_${se}`)||ne(se):te[b.value]?ne(`${te[b.value]}.${se}`)||(["on","off"].includes(se)?ne(se):""):["on","off"].includes(se)?ne(se):""}const re=["scene","script","button","input_button"],be=$(()=>{const H=C.value;if(!H||re.includes(b.value))return h.value;if(K.value)return jn(H.state==="unknown"?"editor.mockup.unknown":"screen.ha.unavailable");const ne=H.a||{},se=H.word||ye(H)||L(H.state);return b.value==="climate"?`${ne.current_temperature!==void 0?`${D(ne.current_temperature)}° · `:""}${se}`:b.value==="weather"?`${se}${ne.temperature!==void 0?` · ${D(ne.temperature)}°`:""}`:b.value==="cover"&&ne.current_position!==void 0&&ne.current_position>0&&ne.current_position<100?`${se} · ${ne.current_position}${ar("%")}`:b.value==="media_player"&&ne.media_title?`${se} · ${ne.media_title}`:b.value==="sensor"||M.includes(b.value)?Y(H.state):se}),ge=$(()=>C.value&&!K.value?R.value||M.includes(b.value)?D(C.value.state):C.value.state:"—"),we=$(()=>{const H=C.value;if(!H||K.value)return 0;const ne=H.a||{};if(b.value==="light")return H.state==="on"?ne.brightness!==void 0?Math.round(ne.brightness/255*100):100:0;if(b.value==="fan")return H.state==="on"?ne.percentage??100:0;if(b.value==="cover")return 100-(ne.current_position??(H.state==="open"?100:0));if(b.value==="media_player")return Math.round((ne.volume_level??0)*100);if(b.value==="number"||b.value==="input_number"){const se=Number(H.state),wt=Number(ne.min??0),Ln=Number(ne.max??100);return Number.isFinite(se)&&Ln>wt?Math.round((se-wt)/(Ln-wt)*100):0}return 0}),Ge=$(()=>jn(`screen.ha.button.${{scene:"activate",script:"run"}[b.value]||"press"}`)),qe=$(()=>`${jn("screen.tile.page",{n:l.value})} ›`),le=$(()=>({background:`linear-gradient(to right, ${we.value?"#ffbf38":"#c9ccd1"} ${we.value}%, ${we.value?"#fff1d3":"#e6e8ec"} ${we.value}%)`})),Z=$(()=>({background:`linear-gradient(to right, #2196f3 ${we.value}%, #d3e8fb ${we.value}%)`})),ue=$(()=>{const H=C.value?.a?.temperature;return H!=null?`${D(H)}°`:"—"});async function ke(H){if(H.key==="Enter"||H.key===" "){H.preventDefault(),Bo(t.tile);return}const ne={ArrowLeft:-1,ArrowRight:1,ArrowUp:-2,ArrowDown:2}[H.key];ne&&(H.preventDefault(),Ys(t.tile,t.tile.slot+(s.value?Math.sign(ne)*ze:i.value?Math.sign(ne)*2:ne))&&(await Ni(),document.querySelector(`.pages [data-slot="${t.tile.slot}"]`)?.focus()))}return(H,ne)=>Te((g(),_("div",{class:he(["tile",{wide:i.value,full:s.value,bare:u.value,placeholder:e.placeholder||!T.value,chosen:I.value}]),"data-slot":e.slot,style:Ue(r.value&&!u.value?{backgroundColor:r.value}:void 0),tabindex:T.value?0:-1,role:T.value?"button":void 0,"aria-label":T.value?k.value:void 0,onClick:ne[1]||(ne[1]=se=>T.value&&a(Bo)(e.tile)),onKeydown:ne[2]||(ne[2]=se=>T.value&&ke(se))},[f.value==="analog"?(g(),_(q,{key:0},[(g(),_("svg",Zb,[ne[3]||(ne[3]=o("circle",{cx:"30",cy:"30",r:"27",fill:"#fff",stroke:"#c9ccd1"},null,-1)),(g(),_(q,null,me([0,90,180,270],se=>o("line",{key:se,x1:"30",y1:"5",x2:"30",y2:"9",stroke:"#1b1b1b","stroke-width":"1.5",transform:`rotate(${se} 30 30)`},null,8,Qb)),64)),o("line",{x1:"30",y1:"30",x2:"30",y2:"16",stroke:"#1b1b1b","stroke-width":"2.4","stroke-linecap":"round",transform:`rotate(${S.value} 30 30)`},null,8,ev),o("line",{x1:"30",y1:"30",x2:"30",y2:"11",stroke:"#1b1b1b","stroke-width":"1.6","stroke-linecap":"round",transform:`rotate(${U.value} 30 30)`},null,8,tv),ne[4]||(ne[4]=o("circle",{cx:"30",cy:"30",r:"1.8",fill:"#1b1b1b"},null,-1))])),i.value?(g(),_("span",nv,[o("span",sv,[o("span",iv,d(n.value),1),o("span",ov,d(h.value),1)])])):B("",!0)],64)):f.value==="digital"&&b.value==="screen"?(g(),_(q,{key:1},[o("span",lv,d(a(Ae)(a(vs)(e.tile))),1),o("span",av,[o("span",rv,d(a(Wi)(a(as),A.value)),1),o("span",cv,d(n.value),1)])],64)):s.value?(g(),_(q,{key:2},[o("span",{class:he(["ic mdi",{lit:E.value,thumb:f.value==="live"||f.value==="cover"}])},d(a(Ae)(a(vs)(e.tile))),3),o("span",uv,[o("span",dv,d(n.value),1),l.value?(g(),_("span",fv,d(qe.value),1)):f.value==="watch"?(g(),_("span",pv,[Me(d(ge.value),1),R.value&&!K.value?(g(),_("small",hv,d(R.value),1)):B("",!0)])):be.value?(g(),_("span",{key:2,class:he(["st",{off:K.value}])},d(be.value),3)):B("",!0)]),e.tile.options?.inline==="slider"?(g(),_("span",{key:0,class:"mini-slider",style:Ue(le.value)},null,4)):B("",!0),p.value?(g(),_("span",mv,[p.value==="toggle"?(g(),_("span",{key:0,class:he(["tog",{off:!O.value}])},null,2)):p.value==="setpoint"?(g(),_("span",bv,[o("span",vv,d(y("minus")||"−"),1),o("b",null,d(ue.value),1),o("span",gv,d(y("plus")||"+"),1)])):p.value==="volume"?(g(),_(q,{key:2},[o("span",{class:"range",style:Ue(Z.value)},null,4),o("span",_v,d(y("volume-high")),1)],64)):p.value==="playback"?(g(),_(q,{key:3},[o("span",yv,d(y("skip-previous")),1),o("span",wv,d(y(O.value?"pause":"play")||y("play")),1),o("span",kv,d(y("skip-next")),1)],64)):p.value==="buttons"&&b.value==="cover"?(g(),_(q,{key:4},[o("span",$v,d(y("arrow-expand-horizontal")),1),o("span",xv,d(y("stop")),1),o("span",Sv,d(y("arrow-collapse-horizontal")),1)],64)):p.value==="run"?(g(),_("span",Cv,d(Ge.value),1)):(g(),_("span",{key:6,class:"range",style:Ue({background:`linear-gradient(to right, #2196f3 ${we.value}%, #d3e8fb ${we.value}%)`})},null,4))])):B("",!0)],64)):i.value?(g(),_(q,{key:3},[o("span",Tv,[o("span",{class:he(["ic mdi",{lit:E.value,thumb:f.value==="live"||f.value==="cover"}])},d(a(Ae)(a(vs)(e.tile))),3),o("span",Ev,[o("span",Av,d(n.value),1),l.value?(g(),_("span",Pv,d(qe.value),1)):f.value==="watch"?(g(),_("span",Ov,[Me(d(ge.value),1),R.value&&!K.value?(g(),_("small",Iv,d(R.value),1)):B("",!0)])):be.value?(g(),_("span",{key:2,class:he(["st",{off:K.value}])},d(be.value),3)):B("",!0)])]),e.tile.options?.inline==="slider"?(g(),_("span",{key:0,class:"mini-slider",style:Ue(le.value)},null,4)):B("",!0),p.value?(g(),_("span",Lv,[p.value==="toggle"?(g(),_("span",{key:0,class:he(["tog",{off:!O.value}])},null,2)):p.value==="setpoint"?(g(),_("span",Mv,[o("span",Rv,d(y("minus")||"−"),1),o("b",null,d(ue.value),1),o("span",Nv,d(y("plus")||"+"),1)])):p.value==="stepper"&&b.value.endsWith("select")?(g(),_(q,{key:2},[o("span",Fv,d(y("chevron-left")),1),o("span",Dv,d(y("chevron-right")),1)],64)):p.value==="stepper"?(g(),_("span",Uv,[o("span",jv,d(y("minus")||"−"),1),o("b",null,d(ge.value),1),o("span",Hv,d(y("plus")||"+"),1)])):p.value==="mode"?(g(),_(q,{key:4},[o("span",Vv,d(y("power")),1),o("span",Wv,d(y("fire")),1),o("span",Bv,d(y("snowflake")),1)],64)):p.value==="volume"?(g(),_(q,{key:5},[o("span",{class:"range",style:Ue(Z.value)},null,4),o("span",Kv,d(y("volume-high")),1)],64)):p.value==="playback"?(g(),_(q,{key:6},[o("span",zv,d(y("skip-previous")),1),o("span",qv,d(y(O.value?"pause":"play")||y("play")),1),o("span",Yv,d(y("skip-next")),1)],64)):p.value==="buttons"&&b.value==="cover"?(g(),_(q,{key:7},[o("span",Gv,d(y("arrow-expand-horizontal")),1),o("span",Jv,d(y("stop")),1),o("span",Xv,d(y("arrow-collapse-horizontal")),1)],64)):p.value==="buttons"&&b.value==="vacuum"?(g(),_(q,{key:8},[o("span",Zv,d(y("play")),1),o("span",Qv,d(y("stop")),1),o("span",eg,d(y("home-map-marker")),1)],64)):p.value==="buttons"&&b.value==="timer"?(g(),_(q,{key:9},[o("span",tg,d(y("play")),1),o("span",ng,d(y("close")),1)],64)):p.value==="run"?(g(),_("span",sg,d(Ge.value),1)):(g(),_("span",{key:11,class:"range",style:Ue({background:`linear-gradient(to right, #2196f3 ${we.value}%, #d3e8fb ${we.value}%)`})},null,4))])):B("",!0)],64)):(g(),_(q,{key:4},[o("span",{class:he(["head",{top:f.value==="watch"}])},[o("span",{class:he(["ic mdi",{lit:E.value,thumb:f.value==="live"||f.value==="cover"}])},d(a(Ae)(a(vs)(e.tile))),3),o("span",ig,[o("span",og,d(n.value),1),l.value?(g(),_("span",lg,d(qe.value),1)):f.value!=="watch"&&be.value?(g(),_("span",{key:1,class:he(["st",{off:K.value}])},d(be.value),3)):B("",!0)])],2),f.value==="watch"?(g(),_("span",ag,[Me(d(ge.value),1),R.value&&!K.value?(g(),_("small",rg,d(R.value),1)):B("",!0)])):B("",!0),e.tile.options?.inline==="slider"?(g(),_("span",{key:1,class:"mini-slider",style:Ue(le.value)},null,4)):B("",!0)],64)),T.value?(g(),_("button",{key:5,type:"button",class:"remove",title:a(c)("editor.tile_card.remove"),"aria-label":a(c)("editor.tile_card.remove_named",{name:n.value}),onClick:ne[0]||(ne[0]=Ot(se=>a(Cu)(e.tile),["stop"]))},"✕",8,cg)):B("",!0)],46,Xb)),[[a(Lu),{kind:"tile",tile:e.tile}]])}}),dg=["viewBox","aria-label"],fg=["y"],pg=["cx","cy","r","stroke","stroke-width"],hg=["x1","y1","x2","y2","stroke","stroke-width"],mg=["x","y","fill"],bg=["x","y"],Nu=Le({__name:"TopbarSvg",props:{items:{},nameText:{},single:{type:Boolean}},setup(e,{expose:t}){const n=e,s=$(()=>{m.fontsVersion,m.now,m.topbarPreviews;const k=n.items||hn();return _u(k,$u.value,n.nameText??(m.layout?.title||jn("editor.mockup.home")),vn)}),i=$(()=>s.value.metrics),l=$(()=>n.single?Math.round(i.value.text*1.4):i.value.top+Math.round(i.value.name*.45)),r=$(()=>n.single?Math.round(i.value.text*1.05):i.value.top),u=$(()=>{if(!n.single)return s.value.placed;const k=s.value.parts[0];return k&&(k.x=0),k?[k]:[]}),f=$(()=>n.single?`-2 0 ${Math.max(1,u.value[0]?.width||1)+4} ${l.value}`:`0 0 ${i.value.width} ${l.value}`),h=$(()=>r.value+(s.value.zero.top+s.value.zero.bottom)/2),p=$(()=>bm(s.value.nameText,s.value.fonts.name,Math.min(s.value.natural,s.value.nameRoom))),b=$(()=>new Date(m.now));function v(k){const A=b.value;return[[(A.getHours()%12+A.getMinutes()/60)*30,k*.24],[A.getMinutes()*6,k*.34]].map(([S,U])=>{const C=S*Math.PI/180;return{x2:U*Math.sin(C),y2:-U*Math.cos(C)}})}const y=k=>k.x-k.icon.ink.left,I=k=>(k.icon?k.x+(k.icon.ink.right-k.icon.ink.left)+s.value.gaps.icon:k.x)-k.text.ink.left,T=$(()=>`${(Math.max(1,u.value[0]?.width||1)+4)*(26/i.value.icon)}px`);return t({lay:s}),(k,A)=>(g(),_("svg",{viewBox:f.value,role:"img","aria-label":e.single?a(c)("editor.topbar.live.looks"):a(c)("editor.topbar.aria",{name:s.value.nameText}),style:Ue(e.single?{width:T.value}:void 0)},[e.single?B("",!0):(g(),_("text",{key:0,x:"0",y:i.value.top,fill:"#1b1b1b",style:Ue({font:s.value.fonts.name})},d(p.value),13,fg)),o("g",null,[(g(!0),_(q,null,me(u.value,S=>(g(),_(q,{key:S.index},[S.dial?(g(),_(q,{key:0},[o("circle",{cx:S.x+S.dial/2,cy:h.value,r:S.dial/2-Math.max(1,Math.round(S.dial/10))/2,fill:"none",stroke:S.view.color||"#46525e","stroke-width":Math.max(1,Math.round(S.dial/10))},null,8,pg),(g(!0),_(q,null,me(v(S.dial),(U,C)=>(g(),_("line",{key:C,x1:S.x+S.dial/2,y1:h.value,x2:S.x+S.dial/2+U.x2,y2:h.value+U.y2,stroke:S.view.color||"#46525e","stroke-width":Math.max(1,Math.round(S.dial*.075)),"stroke-linecap":"round"},null,8,hg))),128))],64)):(g(),_(q,{key:1},[S.icon?(g(),_("text",{key:0,x:y(S),y:h.value-(S.icon.ink.top+S.icon.ink.bottom)/2,fill:S.view.color||"#46525e",style:Ue({font:s.value.fonts.icon})},d(S.icon.glyph),13,mg)):B("",!0),S.text?(g(),_("text",{key:1,x:I(S),y:r.value,fill:"#46525e",style:Ue({font:s.value.fonts.text})},d(S.text.value),13,bg)):B("",!0)],64))],64))),128))])],12,dg))}}),vg={class:"page"},gg={class:"page-label"},_g=["title"],yg={key:1},wg=["title"],kg={class:"tiles"},$g=["data-slot","title","aria-label","onClick"],xg=Le({__name:"DevicePage",props:{page:{},entries:{},pages:{},moving:{}},setup(e){const t=e,n=$(()=>new Map(t.entries.map(h=>[h.slot,h]))),s=$(()=>new Set(t.entries.flatMap(h=>Bn(h.slot,ut(h.tile)).slice(1)))),i=$(()=>Array.from({length:ze},(h,p)=>t.page*ze+p).filter(h=>!s.value.has(h))),l=$(()=>t.pages>1&&!t.entries.some(h=>At(h.slot)===t.page)),r=$(()=>m.inspector?.kind==="bar"||m.inspector?.kind==="bar-add"),u=$(()=>t.entries.filter(h=>At(h.slot)===t.page).reduce((h,p)=>h+xl(ut(p.tile)),0));function f(h){const p=m.insertAt===h;m.insertAt=p?-1:h,m.insertAt>=0&&document.querySelector("#search")?.focus()}return(h,p)=>(g(),_("div",vg,[o("div",gg,[o("span",null,d(a(c)("editor.page.label",{page:e.page+1})),1),l.value?(g(),_("button",{key:0,type:"button",class:"btn mini",title:a(c)("editor.page.remove_title"),onClick:p[0]||(p[0]=b=>a(Tm)(e.page))},d(a(c)("editor.page.remove")),9,_g)):(g(),_("span",yg,d(u.value)+" / "+d(a(ze)),1))]),o("div",{class:he(["device",{cyd:!a(Ki),wide:a(ku)}])},[o("div",{class:he(["bar-wrap",{selected:r.value}]),title:a(c)("editor.page.edit_bar"),role:"button",tabindex:"0",onClick:p[1]||(p[1]=b=>a(Qt)(0)),onKeydown:p[2]||(p[2]=Sc(Ot(b=>a(Qt)(0),["prevent"]),["enter"]))},[ie(Nu)],42,wg),o("div",kg,[(g(!0),_(q,null,me(i.value,b=>(g(),_(q,{key:b},[n.value.get(b)?(g(),it(ug,{key:0,tile:n.value.get(b).tile,slot:b,placeholder:n.value.get(b).tile===e.moving},null,8,["tile","slot","placeholder"])):(g(),_("button",{key:1,type:"button",class:he(["cell",{"insert-here":a(m).insertAt===b}]),"data-slot":b,title:a(c)("editor.page.cell.title"),"aria-label":a(c)("editor.page.cell.aria",{slot:b%a(ze)+1,page:e.page+1}),onClick:v=>f(b)},[p[3]||(p[3]=o("span",null,"+",-1)),o("small",null,d(a(m).insertAt===b?a(c)("editor.page.cell.next"):a(c)("editor.page.cell.empty")),1)],10,$g))],64))),128))])],2)]))}}),Sg={class:"library",id:"library"},Cg={class:"lib-head"},Tg={class:"lib-title"},Eg=["placeholder","aria-label"],Ag={class:"filters",id:"filters"},Pg=["aria-pressed","onClick"],Og={class:"lib-row"},Ig=["aria-label"],Lg={value:""},Mg=["value"],Rg=["aria-pressed","title"],Ng={class:"lib-list",id:"results","aria-live":"polite"},Fg=["title","disabled","onClick"],Dg={class:"tx"},Ug={key:0,class:"hint"},jg={key:1,class:"hint"},Hg={class:"lib-foot"},Vg=Le({__name:"Library",setup(e){const t=["","light","climate","switch","binary_sensor","button","script","fan","cover","scene","vacuum","sensor","media_player","weather","number","select","person","timer","screen"],n={switch:"input_boolean",number:"input_number",select:"input_select",weather:"sun",button:"input_button"},s=$(()=>new Set(m.layout?.tiles.map(p=>p.entity)||[])),i=p=>s.value.has(p)&&!Bi(p),l=$(()=>[...new Set(m.inventory.entities.map(p=>p.area).filter(p=>!!p))].sort((p,b)=>p.localeCompare(b))),r=$(()=>{const p=m.search.toLocaleLowerCase(),b=m.filter,v=m.room;return[...m.inventory.builtin||[],...m.inventory.entities].filter(y=>y.tile!==!1&&(Ki.value||!["camera","image"].includes(y.id.split(".")[0]))&&(!b||y.id.startsWith(b+".")||n[b]===y.id.split(".")[0])&&(!v||y.area===v)&&(!m.hidePlaced||!i(y.id))&&`${y.name} ${y.id} ${y.device||""} ${y.area||""}`.toLocaleLowerCase().includes(p))}),u=$(()=>(m.layout?.tiles.length||0)>=Kn.value),f=$(()=>m.inventory.entities.length),h=p=>{const b=p.id.split(".")[0];return p.state==="unavailable"||p.state==="unknown"?"gone":["light","switch","input_boolean","fan"].includes(b)&&p.state==="on"?"on":""};return(p,b)=>(g(),_("aside",Sg,[o("div",Cg,[o("div",Tg,[Me(d(a(c)("editor.library.title"))+" ",1),o("small",null,d(a(c)("editor.library.entities",f.value)),1)]),Te(o("input",{id:"search","onUpdate:modelValue":b[0]||(b[0]=v=>a(m).search=v),type:"search",placeholder:a(c)("editor.library.search"),autocomplete:"off","aria-label":a(c)("editor.library.search_label")},null,8,Eg),[[Xe,a(m).search]]),o("div",Ag,[(g(),_(q,null,me(t,v=>o("button",{key:v,type:"button","aria-pressed":a(m).filter===v?"true":"false",onClick:y=>a(m).filter=v},[v?(g(),_("span",{key:0,class:"domain-icon",style:Ue({color:a(Ht)(v+".")[2],background:a(Ht)(v+".")[3]}),"aria-hidden":"true"},d(a(Ht)(v+".")[1]),5)):B("",!0),Me(d(a(c)(`editor.library.filters.${v||"all"}`)),1)],8,Pg)),64))]),o("div",Og,[Te(o("select",{id:"room","onUpdate:modelValue":b[1]||(b[1]=v=>a(m).room=v),"aria-label":a(c)("editor.library.room")},[o("option",Lg,d(a(c)("editor.library.all_rooms")),1),(g(!0),_(q,null,me(l.value,v=>(g(),_("option",{key:v,value:v},d(v),9,Mg))),128))],8,Ig),[[Wn,a(m).room]]),o("button",{type:"button",class:"chip-toggle",id:"hide-placed","aria-pressed":a(m).hidePlaced?"true":"false",title:a(c)("editor.library.hide_placed_title"),onClick:b[2]||(b[2]=v=>a(m).hidePlaced=!a(m).hidePlaced)},d(a(c)("editor.library.hide_placed")),9,Rg)])]),o("div",Ng,[(g(!0),_(q,null,me(r.value.slice(0,80),v=>Te((g(),_("button",{key:v.id,type:"button",class:"ent",title:v.id,disabled:i(v.id)||u.value,onClick:y=>a(Su)(v.id)},[o("span",{class:he(["av mdi",h(v)]),style:Ue({color:a(Ht)(v.id)[2],background:a(Ht)(v.id)[3]})},d(a(m).inventory.icons?a(Ae)(a(Cn)(v.id)):a(Ht)(v.id)[1]),7),o("span",Dg,[o("b",null,d(v.name),1),o("small",null,d([a(Ht)(v.id)[0],v.area,v.device].filter(Boolean).join(" · ")),1)]),o("span",{class:he(["add",{done:i(v.id)}])},d(i(v.id)?"✓":"+"),3)],8,Fg)),[[a(Lu),{kind:"entity",id:v.id}]])),128)),r.value.length?r.value.length>80?(g(),_("p",jg,d(a(c)("editor.common.results",r.value.length)),1)):B("",!0):(g(),_("p",Ug,d(a(m).hidePlaced&&!a(m).search&&!a(m).filter&&!a(m).room?a(c)("editor.library.all_placed"):a(c)("editor.library.none_found")),1))]),o("div",Hg,d(u.value?a(c)(a(Kn)<48?"editor.library.full_update":"editor.library.full",a(Kn)):a(c)("editor.library.hint")),1)]))}}),Wg={class:"canvas-head"},Bg={id:"count"},Kg={key:0,id:"no-tiles"},zg={key:1},qg={key:2,id:"positions-hint",class:"warn"},Yg={key:3,id:"page-reach-hint",class:"warn"},Gg=["aria-label"],Jg={class:"page-label"},Xg=["tabindex"],Zg=Le({__name:"LayoutView",setup(e){const t=$(()=>m.layout),n=$(()=>m.drag.preview||Ze(t.value)),s=$(()=>It(n.value,t.value.pages)),i=$(()=>Am()),l=$(()=>s.valuetm(t.value.tiles)&&!$t(0,2,26)?c("editor.layout.positions_hint",{firmware:ht.value?.firmware||c("editor.common.unknown")}):""),u=$(()=>Pu(n.value,s.value));function f(h){h.target.closest(".device, .page-label, .canvas-head")||m.inspector&&Qe()}return(h,p)=>(g(),_(q,null,[o("div",{class:"canvas",id:"canvas",onClick:f},[o("div",Wg,[o("b",Bg,d(a(c)("editor.layout.count",{tiles:t.value.tiles.length,limit:a(Kn)},s.value)),1),t.value.tiles.length?(g(),_("span",zg,d(a(c)("editor.layout.how_to")),1)):(g(),_("span",Kg,d(a(c)("editor.layout.no_tiles")),1)),r.value?(g(),_("span",qg,d(r.value),1)):B("",!0),u.value?(g(),_("span",Yg,d(u.value),1)):B("",!0)]),o("div",{class:"pages",id:"layout-preview","aria-label":a(c)("editor.layout.aria")},[(g(!0),_(q,null,me(i.value,b=>(g(),it(xg,{key:b,page:b-1,entries:n.value,pages:s.value,moving:a(m).drag.moving},null,8,["page","entries","pages","moving"]))),128)),o("div",{class:he(["page ghost",{disabled:!l.value}])},[o("div",Jg,[o("span",null,d(a(c)("editor.page.label",{page:i.value+1})),1)]),o("div",{class:he(["device",{cyd:!a(Ki),wide:a(ku)}]),id:"add-page",role:"button",tabindex:l.value?0:-1,onClick:p[0]||(p[0]=b=>l.value&&a(er)()),onKeydown:p[1]||(p[1]=Sc(Ot(b=>l.value&&a(er)(),["prevent"]),["enter"]))},d(l.value?a(c)("editor.layout.add_page"):a(c)("editor.layout.max_pages",a(fn))),43,Xg)],2)],8,Gg)]),ie(Vg)],64))}}),Qg={class:"status",id:"settings-status",role:"status"},e_={key:0,class:"set-grid",id:"settings-groups"},t_={class:"mdi"},n_=["data-setting","title","onClick"],s_=["id"],i_={class:"s-control"},o_=["id","aria-checked","aria-labelledby","disabled","onClick"],l_=["aria-labelledby"],a_=["aria-pressed","disabled","onClick"],r_={key:2,class:"step"},c_=["aria-label","disabled","onPointerdown","onClick"],u_={class:"mdi"},d_=["id","aria-labelledby"],f_=["aria-label","disabled","onPointerdown","onClick"],p_={class:"mdi"},h_={key:0,class:"hint warn",id:"settings-page-reach"},m_=Le({__name:"SettingsTab",setup(e){const t=$(()=>El()),n=$(()=>xi()),s=$(()=>t.value?.owner==="screen"&&!ht.value?.online),i=$(()=>Dm.map(T=>({...T,rows:T.rows.filter(k=>t.value?.keys.includes(k.key))})).filter(T=>T.rows.length)),l=$(()=>Pu()),r=T=>s.value||!!t.value?.unavailable.includes(T.key),u=T=>T.needs?!!n.value[T.needs]:!0,f=$(()=>s.value?c("editor.screen_settings.status.offline"):m.settingPending?c("editor.common.saving"):t.value?.owner==="screen"?c("editor.screen_settings.status.screen"):c("editor.screen_settings.status.app")),h=(T,k)=>{const A=n.value[T.key];return r(T)||!u(T)||A===null||A===void 0?!0:T.kind!=="moment"&&ir(T,A,k,!1,n.value)===A},p=new WeakMap;function b(T,k,A){const S=xi(),U=ir(T,S[T.key],k,A,S);U!==S[T.key]&&ni(T.key,U,600)}function v(T,k,A){const S=T.currentTarget;if(S.disabled||T.button!==0)return;const U={timer:0,held:!1};p.set(S,U);let C=0;U.timer=window.setTimeout(function K(){U.held=!0,C+=1,b(k,A,C>5),U.timer=window.setTimeout(K,180)},450)}function y(T){const k=p.get(T.currentTarget);k&&clearTimeout(k.timer)}function I(T,k,A){const S=p.get(T.currentTarget);if(S?.held){S.held=!1;return}b(k,A,!1)}return(T,k)=>(g(),_("div",{class:he(["settings",{offline:s.value}]),id:"general-settings"},[o("span",Qg,d(f.value),1),t.value?(g(),_("div",e_,[(g(!0),_(q,null,me(i.value,A=>(g(),_("section",{key:A.group,class:"set-card"},[o("h4",null,[o("span",t_,d(a(Ae)(A.icon)),1),Me(d(a(c)(`editor.screen_settings.groups.${A.group}`)),1)]),(g(!0),_(q,null,me(A.rows,S=>(g(),_("div",{key:S.key,class:he(["srow",[`setting-${S.kind}`,{inactive:!u(S)||r(S)}]]),"data-setting":S.key,title:r(S)&&!s.value?a(c)("editor.screen_settings.unavailable"):"",onClick:U=>S.kind==="toggle"&&U.target.closest(".srow")===U.currentTarget&&!U.target.closest("button")&&!r(S)&&a(ni)(S.key,!n.value[S.key],150)},[o("span",{class:"s-label",id:`setting-label-${S.key}`},d(a(yo)(S)),9,s_),o("div",i_,[S.kind==="toggle"?(g(),_("button",{key:0,type:"button",class:he(["switch",{unknown:n.value[S.key]===null||n.value[S.key]===void 0}]),role:"switch",id:`setting-${S.key}`,"aria-checked":n.value[S.key]?"true":"false","aria-labelledby":`setting-label-${S.key}`,disabled:r(S),onClick:Ot(U=>a(ni)(S.key,!n.value[S.key],150),["stop"])},null,10,o_)):S.kind==="choice"?(g(),_("div",{key:1,class:"seg",role:"group","aria-labelledby":`setting-label-${S.key}`},[(g(!0),_(q,null,me(S.options,U=>(g(),_("button",{key:String(U),type:"button","aria-pressed":n.value[S.key]===U?"true":"false",disabled:r(S),onClick:C=>a(ni)(S.key,U,150)},d(a(Um)(S,U)),9,a_))),128))],8,l_)):(g(),_("div",r_,[o("button",{type:"button","aria-label":a(c)("editor.screen_settings.lower",{name:a(yo)(S)}),disabled:h(S,-1),onPointerdown:U=>v(U,S,-1),onPointerup:y,onPointercancel:y,onPointerleave:y,onClick:U=>I(U,S,-1)},[o("span",u_,d(a(Ae)("F0374")),1)],40,c_),o("output",{id:`setting-${S.key}`,"aria-labelledby":`setting-label-${S.key}`},d(a(Wm)(S,n.value)),9,d_),o("button",{type:"button","aria-label":a(c)("editor.screen_settings.higher",{name:a(yo)(S)}),disabled:h(S,1),onPointerdown:U=>v(U,S,1),onPointerup:y,onPointercancel:y,onPointerleave:y,onClick:U=>I(U,S,1)},[o("span",p_,d(a(Ae)("F0415")),1)],40,f_)]))])],10,n_))),128)),l.value&&A.rows.some(S=>S.key==="page_buttons")?(g(),_("p",h_,d(l.value),1)):B("",!0)]))),128))])):B("",!0)],2))}}),b_={class:"seg wrap",role:"group"},v_=["disabled","aria-pressed","onClick"],bt=Le({__name:"Segmented",props:{choices:{},value:{},disabled:{type:Boolean}},emits:["pick"],setup(e,{emit:t}){const n=t;return(s,i)=>(g(),_("div",b_,[(g(!0),_(q,null,me(e.choices,([l,r])=>(g(),_("button",{key:String(l),type:"button",disabled:e.disabled,"aria-pressed":String(l)===String(e.value)?"true":"false",onClick:u=>n("pick",l)},d(r),9,v_))),128))]))}}),g_={class:"f"},__={class:"f-label"},y_={key:0},w_={key:1,class:"warn"},k_=["aria-expanded"],$_={class:"tx"},x_={key:0,class:"mono"},S_={class:"link"},C_={key:0,class:"picker"},T_=["placeholder","aria-label"],E_={class:"action-list"},A_=["aria-pressed","onClick"],P_={key:0,class:"hint"},O_={key:1,class:"warn"},I_={class:"f-label"},L_=["aria-label","value","onChange"],M_={value:""},R_=["value"],N_={key:3,class:"action-number"},F_=["aria-label","value","onInput"],D_=["onClick"],U_={key:4,class:"action-number"},j_=["aria-label","min","max","step","value","placeholder","onInput"],H_={key:0},V_=["aria-label","value","placeholder","onInput"],W_={key:6},B_={key:0,class:"warn"},K_={key:3},z_=Le({__name:"ActionPicker",props:{tile:{}},setup(e){const t=e,n=$(()=>m.entityActions[t.tile.entity]),s=$(()=>t.tile.options?.action),i=$(()=>n.value?.find(C=>C.action===s.value?.action)),l=$(()=>m.actionPickerOpen||!s.value),r=$(()=>{const C=m.actionSearch.trim().toLocaleLowerCase();return(n.value||[]).filter(K=>`${K.name} ${K.action} ${K.description}`.toLocaleLowerCase().includes(C))});n.value===void 0&&$m(t.tile.entity);function u(C){const K=C.action===s.value?.action;t.tile.options={...t.tile.options,action:K?s.value:{action:C.action}},m.actionPickerOpen=!1,pt()}function f(C,K){const O={...t.tile.options?.action?.data||{}};K===void 0?delete O[C]:O[C]=K,t.tile.options={...t.tile.options,action:{action:s.value.action,...Object.keys(O).length?{data:O}:{}}},pt()}const h=$(()=>{if(!i.value)return[];const C=t.tile.options?.action?.data||{};return i.value.fields.filter(K=>K.required&&C[K.key]===void 0).map(K=>K.name)}),p=C=>Object.keys(C.selector||{})[0]||"text",b=C=>(C.selector||{})[p(C)]||{},v=C=>C.example===void 0?"":typeof C.example=="string"?C.example:JSON.stringify(C.example);function y(C){const K=b(C),O=p(C);return Array.isArray(C.options)?C.options.map(E=>[E,E]):O==="select"&&Array.isArray(K.options)&&!K.multiple?K.options.map(E=>E&&typeof E=="object"?[String(E.value),String(E.label??E.value)]:[String(E),String(E)]):null}const I=C=>"#"+C.map(K=>Math.max(0,Math.min(255,Number(K)||0)).toString(16).padStart(2,"0")).join(""),T=C=>Array.isArray(C)&&C.length===3?I(C):"#ffffff",k=C=>C===void 0?"":typeof C=="string"?C:JSON.stringify(C);function A(C,K){const O=K.trim();if(!O)return f(C.key,void 0);if(p(C)==="text")return f(C.key,K);try{f(C.key,JSON.parse(O))}catch{f(C.key,K)}}function S(C,K){f(C.key,K===""||!Number.isFinite(Number(K))?void 0:Number(K))}const U=C=>b(C).unit_of_measurement||p(C)==="color_temp"&&b(C).unit||"";return(C,K)=>(g(),_("div",g_,[o("span",__,d(a(c)("editor.action.label")),1),n.value===void 0?(g(),_("small",y_,d(a(c)("editor.action.asking")),1)):n.value===null?(g(),_("small",w_,d(a(c)("editor.action.not_answering")),1)):(g(),_(q,{key:2},[o("button",{type:"button",class:"row","aria-expanded":l.value?"true":"false",onClick:K[0]||(K[0]=O=>a(m).actionPickerOpen=!l.value)},[o("span",$_,[o("b",null,d(i.value?i.value.name:s.value?s.value.action:a(c)("editor.action.choose")),1),s.value?(g(),_("small",x_,d(s.value.action),1)):B("",!0)]),o("span",S_,d(l.value?a(c)("editor.common.close"):a(c)("editor.common.change")),1)],8,k_),l.value?(g(),_("div",C_,[Te(o("input",{"onUpdate:modelValue":K[1]||(K[1]=O=>a(m).actionSearch=O),type:"search",placeholder:a(c)("editor.action.search"),"aria-label":a(c)("editor.action.search_label")},null,8,T_),[[Xe,a(m).actionSearch]]),o("div",E_,[(g(!0),_(q,null,me(r.value,O=>(g(),_("button",{key:O.action,type:"button",class:"action-choice","aria-pressed":O.action===s.value?.action?"true":"false",onClick:E=>u(O)},[o("strong",null,d(O.name),1),o("small",null,d(O.description?`${O.action} · ${O.description}`:O.action),1)],8,A_))),128)),r.value.length?B("",!0):(g(),_("p",P_,d(a(c)("editor.action.none_found")),1))])])):B("",!0),s.value&&!i.value?(g(),_("small",O_,d(a(c)("editor.action.gone")),1)):B("",!0),i.value&&!l.value?(g(),_(q,{key:2},[(g(!0),_(q,null,me(i.value.fields,O=>(g(),_("div",{key:O.key,class:"f"},[o("span",I_,d(O.required?O.name:a(c)("editor.action.optional",{name:O.name})),1),p(O)==="boolean"?(g(),it(bt,{key:0,choices:[["",a(c)("editor.action.not_set")],["true",a(c)("editor.action.on")],["false",a(c)("editor.action.off")]],value:s.value?.data?.[O.key]===void 0?"":String(s.value?.data?.[O.key]),onPick:E=>f(O.key,E===""?void 0:E==="true")},null,8,["choices","value","onPick"])):y(O)&&y(O).length<=4?(g(),it(bt,{key:1,choices:[["",a(c)("editor.action.not_set")],...y(O)],value:s.value?.data?.[O.key]===void 0?"":String(s.value?.data?.[O.key]),onPick:E=>f(O.key,E===""?void 0:E)},null,8,["choices","value","onPick"])):y(O)?(g(),_("select",{key:2,"aria-label":O.name,value:String(s.value?.data?.[O.key]??""),onChange:E=>f(O.key,E.target.value===""?void 0:E.target.value)},[o("option",M_,d(a(c)("editor.action.not_set")),1),(g(!0),_(q,null,me(y(O),([E,R])=>(g(),_("option",{key:E,value:E},d(R),9,R_))),128))],40,L_)):p(O)==="color_rgb"?(g(),_("div",N_,[o("input",{type:"color","aria-label":O.name,value:T(s.value?.data?.[O.key]),onInput:E=>f(O.key,[1,3,5].map(R=>parseInt(E.target.value.slice(R,R+2),16)))},null,40,F_),o("button",{type:"button",class:"btn quiet mini",onClick:E=>f(O.key,void 0)},d(a(c)("editor.action.not_set")),9,D_)])):p(O)==="number"||p(O)==="color_temp"?(g(),_("div",U_,[o("input",{type:"number","aria-label":O.name,min:b(O).min,max:b(O).max,step:b(O).step==="any"?"any":b(O).step,value:s.value?.data?.[O.key]??"",placeholder:v(O),onInput:E=>S(O,E.target.value)},null,40,j_),U(O)?(g(),_("span",H_,d(U(O)),1)):B("",!0)])):(g(),_("input",{key:5,type:"text","aria-label":O.name,value:k(s.value?.data?.[O.key]),placeholder:v(O),onInput:E=>A(O,E.target.value)},null,40,V_)),O.description?(g(),_("small",W_,d(O.description),1)):B("",!0)]))),128)),h.value.length?(g(),_("small",B_,d(a(c)("editor.action.needs",{fields:h.value.join(", ")})),1)):B("",!0)],64)):B("",!0),a($t)(0,2,58)?B("",!0):(g(),_("small",K_,d(a(c)("editor.action.needs_firmware")),1))],64))]))}}),q_={class:"f"},Y_={class:"f-label"},G_=["aria-expanded"],J_={class:"av mdi"},X_={class:"tx"},Z_={class:"link"},Q_={key:0,class:"picker"},ey=["placeholder","aria-label"],ty=["aria-pressed","title"],ny={class:"mdi"},sy=["aria-pressed","title"],iy={class:"icon-list"},oy={class:"icon-grid"},ly=["title","aria-label","aria-pressed","onClick"],ay={class:"mdi"},ry={key:0,class:"hint"},cy={key:1},Fu=Le({__name:"IconPicker",props:{selected:{},automatic:{},autoLabel:{},allowNone:{type:Boolean},note:{}},emits:["pick"],setup(e,{emit:t}){const n=e,s=t,i=$e(""),l=$(()=>qs(n.selected)),r=$(()=>n.selected==="none"?"":Ae(l.value?.cp||n.automatic)),u=$(()=>n.selected==="none"?c("editor.icon.none"):l.value?.label||n.autoLabel),f=$(()=>{const h=i.value.trim().toLocaleLowerCase();return(m.inventory.icons?.groups||[]).map(p=>({label:p.label,icons:p.icons.filter(b=>!h||`${b.label} ${b.name.replaceAll("-"," ")} ${p.label}`.toLocaleLowerCase().includes(h))})).filter(p=>p.icons.length)});return(h,p)=>(g(),_("div",q_,[o("span",Y_,d(a(c)("editor.icon.label")),1),o("button",{type:"button",class:"row","aria-expanded":a(m).iconPickerOpen?"true":"false",onClick:p[0]||(p[0]=b=>a(m).iconPickerOpen=!a(m).iconPickerOpen)},[o("span",J_,d(r.value),1),o("span",X_,[o("b",null,d(u.value),1)]),o("span",Z_,d(a(m).iconPickerOpen?a(c)("editor.common.close"):a(c)("editor.common.change")),1)],8,G_),a(m).iconPickerOpen?(g(),_("div",Q_,[Te(o("input",{"onUpdate:modelValue":p[1]||(p[1]=b=>i.value=b),type:"search",placeholder:a(c)("editor.icon.search"),"aria-label":a(c)("editor.icon.search_label")},null,8,ey),[[Xe,i.value]]),o("button",{type:"button",class:"icon-choice icon-auto","aria-pressed":e.selected==="auto"?"true":"false",title:e.autoLabel,onClick:p[2]||(p[2]=b=>s("pick","auto"))},[o("span",ny,d(a(Ae)(e.automatic)),1),o("span",null,d(e.autoLabel),1)],8,ty),e.allowNone?(g(),_("button",{key:0,type:"button",class:"icon-choice icon-auto","aria-pressed":e.selected==="none"?"true":"false",title:a(c)("editor.icon.none"),onClick:p[3]||(p[3]=b=>s("pick","none"))},[p[4]||(p[4]=o("span",{class:"mdi"},null,-1)),o("span",null,d(a(c)("editor.icon.none_text_only")),1)],8,sy)):B("",!0),o("div",iy,[(g(!0),_(q,null,me(f.value,b=>(g(),_("section",{key:b.label},[o("small",null,d(b.label),1),o("div",oy,[(g(!0),_(q,null,me(b.icons,v=>(g(),_("button",{key:v.name,type:"button",class:"icon-choice",title:v.label,"aria-label":a(c)("editor.icon.aria",{name:v.label}),"aria-pressed":e.selected===v.name?"true":"false",onClick:y=>s("pick",v.name)},[o("span",ay,d(a(Ae)(v.cp)),1)],8,ly))),128))])]))),128)),f.value.length?B("",!0):(g(),_("p",ry,d(a(c)("editor.icon.none_found")),1))])])):B("",!0),e.note?(g(),_("small",cy,d(e.note),1)):B("",!0)]))}}),uy={class:"dr-head"},dy={class:"tx"},fy={class:"mono"},py=["aria-label"],hy={class:"dr-body"},my={class:"f"},by={class:"f-label",for:"tile-name"},vy=["value","placeholder"],gy={key:1,class:"f"},_y={class:"f-label"},yy={key:2,class:"f"},wy={class:"f-label"},ky={key:3,class:"f"},$y={class:"f-label"},xy={class:"f"},Sy={class:"f-label"},Cy={key:0},Ty={key:4,class:"f"},Ey={class:"f-label"},Ay={key:5,class:"f"},Py={class:"f-label"},Oy={key:6,class:"f"},Iy={class:"f-label"},Ly={key:8,class:"f"},My={class:"f-label"},Ry={key:0,class:"warn"},Ny={key:9,class:"f"},Fy={class:"f-label"},Dy={class:"f"},Uy={class:"f-label"},jy={class:"sw"},Hy=["aria-label","aria-pressed","onClick"],Vy={class:"dr-foot"},Wy=Le({__name:"TileInspector",props:{tile:{}},setup(e){const t=e,n=$(()=>t.tile.entity.split(".")[0]),s=$(()=>zs(t.tile.entity)),i=$(()=>us(t.tile.entity)),l=$(()=>m.layout?It(Ze(m.layout),m.layout.pages):1),r=$(()=>At(t.tile.slot)+1),u=le=>!m.layout?.tiles.some(Z=>At(Z.slot)===le-1),f=$(()=>{const le=Array.from({length:Math.min(fn,l.value+1)},(Z,ue)=>ue+1);return i.value>le.length&&le.push(i.value),le.map(Z=>[Z,u(Z)?c("editor.tile.goes_to.empty",{page:Z}):String(Z)])}),h=$(()=>Za.value?i.value>l.value?{text:c("editor.tile.goes_to.no_page",{page:i.value}),warn:!0}:{text:c("editor.tile.goes_to.hint"),warn:!1}:{text:c("editor.tile.goes_to.needs_firmware"),warn:!1}),p=$(()=>!m.layout?.tiles.some(le=>xe(le)!==xe(t.tile)&&At(le.slot)===r.value-1)),b=$(()=>{const le=Array.from({length:l.value},(Z,ue)=>[ue+1,String(ue+1)]);return l.value(i.value?["single","wide"]:["single","wide","full"]).map(le=>[le,c(`editor.tile.size.${le}`)])),y=$(()=>i.value?"":Za.value?c("editor.tile.size.full_hint"):c("editor.tile.size.needs_firmware")),I=$(()=>m.capabilities[t.tile.entity]),T=(le,Z)=>t.tile.options?.[le]??Z,k=$(()=>T("display",n.value==="screen"?"digital":"standard")),A=$(()=>{const le=n.value==="screen"?["digital","analog"]:["standard","watch"],Z=I.value;return n.value==="weather"&&(!Z||Z.displays.includes("forecast")||k.value==="forecast")&&le.push("forecast"),n.value==="sensor"&&(!Z||Z.displays.includes("graph")||k.value==="graph")&&le.push("graph"),n.value==="sun"&&le.push("sunpath"),["camera","image"].includes(n.value)&&le.push("live"),n.value==="media_player"&&(Ki.value||k.value==="cover")&&C.value!=="full"&&le.push("cover"),le.map(ue=>[ue,c(`editor.tile.display.${ue}`)])}),S=$(()=>{const le=I.value;return le&&k.value==="graph"&&!le.displays.includes("graph")?c("editor.tile.display.no_graph"):le&&k.value==="forecast"&&!le.displays.includes("forecast")?c("editor.tile.display.no_forecast"):k.value==="live"?c($t(0,2,77)?"editor.tile.display.live_hint":"editor.tile.display.live_needs_firmware"):k.value==="cover"?c($t(0,2,78)?"editor.tile.display.cover_hint":"editor.tile.display.cover_needs_firmware"):""}),U=$(()=>T("refresh",15)),C=$(()=>T("size","single")),K=$(()=>m.inventory.controls?.[n.value]),O=$(()=>T("controls",C.value==="full"?"none":K.value?.default)),E=$(()=>{const le=I.value;return(K.value?.choices||[]).filter(Z=>!le||Z.key==="none"||Z.key===O.value||le.controls.includes(Z.key)).map(Z=>[Z.key,Z.label])}),R=$(()=>{const le=I.value;return le&&O.value!=="none"&&!le.controls.includes(O.value)?{text:c("editor.tile.controls.not_offered"),warn:!0}:{text:$t(0,2,19)?c(C.value==="full"?"editor.tile.controls.full_hint":"editor.tile.controls.wide_hint"):c("editor.tile.controls.needs_firmware"),warn:!1}}),L=$(()=>T("tap","auto")),D=$(()=>{const le=["auto","detail","none"];return((I.value?I.value.toggle:Ja.includes(n.value))||L.value==="toggle")&&le.push("toggle"),le.push("action"),le.map(Z=>[Z,c(`editor.tile.tap.${Z}`)])}),M=$(()=>L.value==="toggle"&&I.value&&!I.value.toggle?{text:c("editor.tile.tap.no_toggle"),warn:!0}:L.value==="toggle"&&!Ja.includes(n.value)&&!$t(0,2,58)?{text:c("editor.tile.tap.toggle_needs_firmware"),warn:!1}:L.value==="toggle"?{text:c("editor.tile.tap.hold"),warn:!1}:null),Y=$(()=>T("inline","none")),te=$(()=>um.includes(n.value)&&(!I.value||I.value.inline||Y.value==="slider")),ye=$(()=>Y.value==="slider"&&I.value&&!I.value.inline),re=$(()=>T("history_hours",24)),be=$(()=>Object.entries(m.inventory.backgrounds||{})),ge=$(()=>!!m.inventory.entities.find(le=>le.id===t.tile.entity)?.icon),we=$(()=>!!m.inventory.icons&&(n.value!=="screen"||i.value>0)&&!["forecast","sunpath"].includes(k.value));function Ge(le){t.tile.name=le,pt()}function qe(){m.inspector={kind:"inspect",entity:t.tile.entity}}return(le,Z)=>(g(),_(q,null,[o("div",uy,[o("span",{class:"av mdi",style:Ue({color:a(Ht)(e.tile.entity)[2],background:a(Ht)(e.tile.entity)[3]})},d(a(Ae)(a(vs)(e.tile))),5),o("span",dy,[o("b",null,d(e.tile.name||s.value),1),o("small",fy,d(e.tile.entity),1)]),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.close"),onClick:Z[0]||(Z[0]=(...ue)=>a(Qe)&&a(Qe)(...ue))},"✕",8,py)]),o("div",hy,[o("div",my,[o("label",by,d(a(c)("editor.tile.name")),1),o("input",{id:"tile-name",value:e.tile.name,placeholder:s.value,maxlength:"60",onInput:Z[1]||(Z[1]=ue=>Ge(ue.target.value))},null,40,vy)]),we.value?(g(),it(Fu,{key:0,selected:e.tile.options?.icon||"auto",automatic:a(Cn)(e.tile.entity),"auto-label":a(c)(ge.value?"editor.tile.icon.auto_ha":"editor.tile.icon.auto_default"),note:a($t)(0,2,18)?"":a(c)("editor.tile.icon.needs_firmware"),onPick:Z[2]||(Z[2]=ue=>a(Jt)(e.tile,"icon",ue))},null,8,["selected","automatic","auto-label","note"])):B("",!0),i.value?(g(),_("div",gy,[o("span",_y,d(a(c)("editor.tile.goes_to.label")),1),ie(bt,{choices:f.value,value:i.value,onPick:Z[3]||(Z[3]=ue=>a(Pm)(e.tile,Number(ue)))},null,8,["choices","value"]),o("small",{class:he({warn:h.value.warn})},d(h.value.text),3)])):(g(),_("div",yy,[o("span",wy,d(a(c)("editor.tile.display.label")),1),ie(bt,{choices:A.value,value:k.value,onPick:Z[4]||(Z[4]=ue=>a(Jt)(e.tile,"display",ue))},null,8,["choices","value"]),S.value?(g(),_("small",{key:0,class:he({warn:!(k.value==="live"&&a($t)(0,2,77))&&!(k.value==="cover"&&a($t)(0,2,78))})},d(S.value),3)):B("",!0)])),k.value==="live"?(g(),_("div",ky,[o("span",$y,d(a(c)("editor.tile.refresh.label")),1),ie(bt,{choices:[15,30].map(ue=>[ue,a(c)("editor.tile.refresh.seconds",{n:ue})]),value:U.value,onPick:Z[5]||(Z[5]=ue=>a(Jt)(e.tile,"refresh",Number(ue)))},null,8,["choices","value"])])):B("",!0),o("div",xy,[o("span",Sy,d(a(c)("editor.tile.size.label")),1),ie(bt,{choices:v.value,value:C.value,onPick:Z[6]||(Z[6]=ue=>a(Jt)(e.tile,"size",ue))},null,8,["choices","value"]),y.value?(g(),_("small",Cy,d(y.value),1)):B("",!0)]),b.value.length>1?(g(),_("div",Ty,[o("span",Ey,d(a(c)("editor.tile.page.label")),1),ie(bt,{choices:b.value,value:r.value,onPick:Z[7]||(Z[7]=ue=>a(Em)(e.tile,Number(ue)-1))},null,8,["choices","value"])])):B("",!0),K.value&&C.value!=="single"&&!i.value?(g(),_("div",Ay,[o("span",Py,d(a(c)("editor.tile.controls.label")),1),ie(bt,{choices:E.value,value:O.value,onPick:Z[8]||(Z[8]=ue=>a(Jt)(e.tile,"controls",ue))},null,8,["choices","value"]),o("small",{class:he({warn:R.value.warn})},d(R.value.text),3)])):B("",!0),n.value!=="screen"&&!i.value?(g(),_("div",Oy,[o("span",Iy,d(a(c)("editor.tile.tap.label")),1),ie(bt,{choices:D.value,value:L.value,onPick:Z[9]||(Z[9]=ue=>a(Jt)(e.tile,"tap",ue))},null,8,["choices","value"]),M.value?(g(),_("small",{key:0,class:he({warn:M.value.warn})},d(M.value.text),3)):B("",!0)])):B("",!0),n.value!=="screen"&&!i.value&&L.value==="action"?(g(),it(z_,{key:7,tile:e.tile},null,8,["tile"])):B("",!0),te.value&&!i.value?(g(),_("div",Ly,[o("span",My,d(a(c)("editor.tile.slider.label")),1),ie(bt,{choices:[["none",a(c)("editor.tile.slider.no")],["slider",a(c)("editor.tile.slider.yes")]],value:Y.value,onPick:Z[10]||(Z[10]=ue=>a(Jt)(e.tile,"inline",ue))},null,8,["choices","value"]),ye.value?(g(),_("small",Ry,d(a(c)("editor.tile.slider.nothing")),1)):B("",!0)])):B("",!0),n.value==="sensor"&&!i.value?(g(),_("div",Ny,[o("span",Fy,d(a(c)("editor.tile.history.label")),1),ie(bt,{choices:[1,6,24].map(ue=>[ue,a(c)("editor.tile.history.hours",ue)]),value:re.value,onPick:Z[11]||(Z[11]=ue=>a(Jt)(e.tile,"history_hours",Number(ue)))},null,8,["choices","value"])])):B("",!0),o("div",Dy,[o("span",Uy,d(a(c)("editor.tile.background.label")),1),o("div",jy,[(g(!0),_(q,null,me(be.value,([ue,ke])=>(g(),_("button",{key:ue,type:"button","aria-label":a(c)("editor.tile.background.aria",{name:ke.label}),"aria-pressed":(e.tile.options?.background||"auto")===ue?"true":"false",onClick:H=>a(Jt)(e.tile,"background",ue)},[o("i",{class:he(ke.color?"":ue==="none"?"none":"auto"),style:Ue(ke.color?{background:ke.color}:void 0)},null,6),Me(d(ke.label),1)],8,Hy))),128))])])]),o("div",Vy,[o("button",{type:"button",class:"btn danger",onClick:Z[12]||(Z[12]=ue=>a(Cu)(e.tile))},d(a(c)("editor.common.remove")),1),Z[13]||(Z[13]=o("span",{class:"spacer"},null,-1)),n.value!=="screen"?(g(),_("button",{key:0,type:"button",class:"btn quiet",onClick:qe},d(a(c)("editor.common.read_current_data")),1)):B("",!0)])],64))}}),By={class:"dr-head"},Ky={class:"av mdi",style:{background:"var(--seg)",color:"var(--ink-2)"}},zy={class:"tx"},qy=["aria-label"],Yy={class:"dr-body"},Gy={class:"f"},Jy={class:"f-label",for:"title"},Xy=["value","placeholder"],Zy={class:"f"},Qy={class:"f-label",id:"topbar-caption"},e0={style:{"text-transform":"none","letter-spacing":"0","font-weight":"500"}},t0={class:"items",id:"topbar-chips",role:"list","aria-labelledby":"topbar-caption"},n0=["data-index","aria-label","onPointerdown","onClick","onKeydown"],s0={class:"tx"},i0=["aria-label","onClick"],o0=["disabled","title"],l0={class:"live",id:"topbar-live"},a0={class:"f"},r0={class:"f-label"},c0={class:"f"},u0={class:"f-label"},d0={href:"#settings"},f0={key:2},p0={key:0,class:"dr-foot"},h0=["disabled"],m0=["disabled"],b0=Le({__name:"TopbarInspector",props:{index:{}},setup(e){const t=e,n=$(()=>hn()),s=$(()=>n.value[t.index]),i=$(()=>(m.fontsVersion,m.now,m.topbarPreviews,_u(n.value,$u.value,m.layout?.title||jn("editor.mockup.home"),vn))),l=$(()=>i.value.dropped),r=$(()=>m.inventory.header?.min_firmware||"0.2.32"),u=$(()=>{const[Y,te,ye]=r.value.split(".").map(Number);return $t(Y,te,ye)}),f=$(()=>u.value?c(l.value.size?"editor.topbar.hint.overflow":"editor.topbar.hint.reorder"):c("editor.topbar.hint.needs_firmware",{version:r.value})),h=(Y,te)=>{const ye=vn(Y);return ye.shown?l.value.has(te)?c("editor.topbar.detail.overflow"):ye.analog?c("editor.topbar.detail.dial"):ye.text:c("editor.topbar.detail.hidden")},p=Y=>{const te=vn(Y);return te.analog||Y.type!=="entity"?qs(gu[Y.type])?.cp:te.icon},b=Y=>m.topbarAdded?.key===at(Y)&&Date.now()-m.topbarAdded.time<1200;function v(Y){m.layout&&(m.layout.title=Y,pt())}function y(Y){const te=[...n.value];te[t.index]={...te[t.index],...Y},Ds(te)}const I=$(()=>s.value?vn(s.value).shown?l.value.has(t.index)?c("editor.topbar.live.overflow"):c("editor.topbar.live.looks"):c("editor.topbar.live.hidden"):""),T=$(()=>({clock:Wi(as.value,new Date(m.now),an.value),analog:c("editor.topbar.analog_sample"),date:Sl(new Date(m.now),an.value)})),k=$e({index:-1,active:!1,moved:!1});let A=null,S=0,U=null,C=0;function K(Y,te){Y.button!==0||Y.target.closest(".x")||(Y.pointerType!=="touch"&&Y.preventDefault(),k.value={index:te,active:!1,moved:!1},A={x:Y.clientX,y:Y.clientY},U=Y.pointerId,clearTimeout(S),Y.pointerType==="touch"&&(S=window.setTimeout(O,260)),document.addEventListener("pointermove",R),document.addEventListener("pointerup",L),document.addEventListener("pointercancel",L))}function O(){k.value.active=!0,document.addEventListener("touchmove",E,{passive:!1})}function E(Y){k.value.active&&Y.preventDefault()}function R(Y){if(Y.pointerId!==U||!A)return;if(!k.value.active){const re=Math.hypot(Y.clientX-A.x,Y.clientY-A.y);if(Y.pointerType==="touch"){re>10&&(clearTimeout(S),A=null);return}if(re<6)return;O()}const te=[...document.querySelectorAll(".items .item[data-index]")];let ye=k.value.index;if(te.forEach((re,be)=>{const ge=re.getBoundingClientRect();bek.value.index&&Y.clientY>ge.top+ge.height/2&&(ye=Math.max(ye,be))}),ye!==k.value.index&&m.layout){const re=[...n.value];re.splice(ye,0,...re.splice(k.value.index,1)),m.layout.header={items:re};const be=t.index===k.value.index;k.value.index=ye,k.value.moved=!0,be&&Qt(ye)}}function L(Y){Y.pointerId===U&&(clearTimeout(S),document.removeEventListener("pointermove",R),document.removeEventListener("pointerup",L),document.removeEventListener("pointercancel",L),document.removeEventListener("touchmove",E),k.value.active&&(C=Date.now()+400,k.value.moved&&pt()),k.value={index:-1,active:!1,moved:!1},A=null,U=null)}function D(Y){Date.now(){const ye=Ws("i18n-t");return g(),_(q,null,[o("div",By,[o("span",Ky,d(s.value?a(Ae)(p(s.value)||"F0150"):a(Ae)("F0150")),1),o("span",zy,[o("b",null,d(s.value?s.value.type==="entity"?a(zs)(s.value.entity):a(gs)(s.value):a(c)("editor.topbar.title")),1),o("small",{class:he({mono:s.value?.type==="entity"})},d(s.value?s.value.type==="entity"?s.value.entity:a(c)("editor.topbar.builtin"):a(c)("editor.topbar.items",{used:n.value.length},a(_n)())),3)]),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.close"),onClick:te[0]||(te[0]=(...re)=>a(Qe)&&a(Qe)(...re))},"✕",8,qy)]),o("div",Yy,[o("div",Gy,[o("label",Jy,d(a(c)("editor.topbar.name")),1),o("input",{id:"title",value:a(m).layout?.title,maxlength:"60",placeholder:a(c)("editor.topbar.name_placeholder"),onInput:te[1]||(te[1]=re=>v(re.target.value))},null,40,Xy)]),o("div",Zy,[o("span",Qy,[Me(d(a(c)("editor.topbar.right"))+" ",1),o("span",e0," · "+d(n.value.length)+" / "+d(a(_n)()),1)]),o("div",t0,[(g(!0),_(q,null,me(n.value,(re,be)=>(g(),_("div",{key:a(at)(re)+be,class:he(["item",{selected:be===e.index,"is-hidden":!a(vn)(re).shown,"is-overflow":l.value.has(be),"just-added":b(re),"dragging-chip":k.value.active&&k.value.index===be}]),role:"listitem",tabindex:"0","data-index":be,"aria-label":a(c)("editor.topbar.item_label",{name:a(gs)(re),slot:be+1}),onPointerdown:ge=>K(ge,be),onClick:ge=>D(be),onKeydown:ge=>M(ge,be)},[te[9]||(te[9]=o("span",{class:"grip","aria-hidden":"true"},"⋮⋮",-1)),o("span",{class:"av mdi",style:Ue(a(vn)(re).color?{color:a(vn)(re).color}:void 0)},d(p(re)?a(Ae)(p(re)):""),5),o("span",s0,[o("b",null,d(a(gs)(re)),1),o("small",null,d(h(re,be)),1)]),o("button",{type:"button",class:"x","aria-label":a(c)("editor.topbar.remove_named",{name:a(gs)(re)}),onClick:Ot(ge=>a(sr)(be),["stop"])},"✕",8,i0)],42,n0))),128)),o("button",{type:"button",class:"ghost-btn",id:"topbar-add",disabled:n.value.length>=a(_n)(),title:n.value.length>=a(_n)()?a(c)("editor.topbar.max",a(_n)()):a(c)("editor.topbar.add_title"),onClick:te[2]||(te[2]=(...re)=>a(tr)&&a(tr)(...re))},d(a(c)("editor.topbar.add_button")),9,o0)]),o("small",{id:"topbar-hint",class:he({warn:l.value.size>0&&u.value})},d(f.value),3)]),s.value?(g(),_(q,{key:0},[o("div",l0,[o("small",null,d(I.value),1),ie(Nu,{items:[s.value],single:""},null,8,["items"])]),s.value.type==="entity"?(g(),_(q,{key:0},[o("div",a0,[o("span",r0,d(a(c)("editor.topbar.content.label")),1),ie(bt,{choices:(a(m).inventory.header?.contents||[]).map(re=>[re.key,re.label]),value:s.value.content,onPick:te[3]||(te[3]=re=>y({content:re}))},null,8,["choices","value"]),o("small",null,d(a(c)("editor.topbar.content.hint")),1)]),ie(Fu,{selected:s.value.icon||"auto",automatic:a(m).topbarPreviews[a(at)(s.value)]?.auto_icon||a(Cn)(s.value.entity),"auto-label":a(c)("editor.topbar.auto_icon"),"allow-none":"",onPick:te[4]||(te[4]=re=>y({icon:re}))},null,8,["selected","automatic","auto-label"]),o("div",c0,[o("span",u0,d(a(c)("editor.topbar.show.label")),1),ie(bt,{choices:(a(m).inventory.header?.shows||[]).map(re=>[re.key,re.label]),value:s.value.show,onPick:te[5]||(te[5]=re=>y({show:re}))},null,8,["choices","value"]),o("small",null,d(a(c)("editor.topbar.show.hint")),1)])],64)):s.value.type!=="date"?(g(),it(ye,{key:1,keypath:a(as)?"editor.topbar.clock_24":"editor.topbar.clock_12",tag:"small",id:"topbar-clock",scope:"global"},{settings:oe(()=>[o("a",d0,d(a(c)("editor.topbar.clock_settings")),1)]),_:1},8,["keypath"])):(g(),_("small",f0,d(a(c)("editor.topbar.date_hint",{date:T.value.date})),1))],64)):B("",!0)]),s.value?(g(),_("div",p0,[o("button",{type:"button",class:"btn danger",onClick:te[6]||(te[6]=re=>a(sr)(e.index))},d(a(c)("editor.common.remove")),1),te[10]||(te[10]=o("span",{class:"spacer"},null,-1)),o("button",{type:"button",class:"btn quiet",disabled:e.index===0,onClick:te[7]||(te[7]=re=>a(go)(e.index,e.index-1)&&a(Qt)(e.index-1))},d(a(c)("editor.topbar.up")),9,h0),o("button",{type:"button",class:"btn quiet",disabled:e.index>=n.value.length-1,onClick:te[8]||(te[8]=re=>a(go)(e.index,e.index+1)&&a(Qt)(e.index+1))},d(a(c)("editor.topbar.down")),9,m0)])):B("",!0)],64)}}}),v0={class:"dr-head"},g0={class:"tx"},_0=["aria-label"],y0={class:"dr-body"},w0={class:"f"},k0={class:"f-label"},$0={class:"options"},x0=["disabled","onClick"],S0={class:"mdi"},C0={class:"tx"},T0={key:0,class:"f"},E0={class:"f-label"},A0={class:"options"},P0=["disabled","onClick"],O0={class:"mdi"},I0={class:"tx"},L0={class:"f"},M0={class:"f-label",for:"topbar-search"},R0=["placeholder","aria-label"],N0={class:"options"},F0=["disabled","onClick"],D0={class:"mdi"},U0={class:"tx"},j0={key:0,class:"hint"},H0={key:1,class:"hint"},V0={class:"dr-foot"},W0=Le({__name:"TopbarAdd",setup(e){const t=$e(""),n=$(()=>new Set(hn().map(at))),s=$(()=>({clock:Wi(as.value,new Date(m.now),an.value),analog:c("editor.topbar.analog_sample"),date:Sl(new Date(m.now),an.value)})),i=$(()=>m.inventory.header?.suggestions?.[m.selected||""]||[]),l=$(()=>{const u=t.value.trim().toLocaleLowerCase();return m.inventory.entities.filter(f=>`${f.name} ${f.id} ${f.area||""} ${f.device||""}`.toLocaleLowerCase().includes(u))}),r=u=>({type:"entity",entity:u,content:"state",icon:"auto",show:"always"});return(u,f)=>(g(),_(q,null,[o("div",v0,[f[3]||(f[3]=o("span",{class:"av",style:{background:"var(--seg)",color:"var(--ink-2)","font-size":"18px"}},"+",-1)),o("span",g0,[o("b",null,d(a(c)("editor.topbar.add.title")),1),o("small",null,d(a(c)("editor.topbar.add.slots",{used:a(hn)().length},a(_n)())),1)]),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.close"),onClick:f[0]||(f[0]=(...h)=>a(Qe)&&a(Qe)(...h))},"✕",8,_0)]),o("div",y0,[o("div",w0,[o("span",k0,d(a(c)("editor.topbar.add.builtin")),1),o("div",$0,[(g(!0),_(q,null,me(a(m).inventory.header?.builtin||[],h=>(g(),_("button",{key:h.type,type:"button",class:"option",disabled:n.value.has(a(at)({type:h.type})),onClick:p=>a(_o)({type:h.type})},[o("span",S0,d(a(Ae)(a(qs)(a(gu)[h.type])?.cp||"F0150")),1),o("span",C0,[o("strong",null,d(h.label),1),o("small",null,d(n.value.has(a(at)({type:h.type}))?a(c)("editor.topbar.add.added"):s.value[h.type]),1)])],8,x0))),128))])]),i.value.length?(g(),_("div",T0,[o("span",E0,d(a(c)("editor.topbar.add.suggestions")),1),o("div",A0,[(g(!0),_(q,null,me(i.value,h=>(g(),_("button",{key:a(at)(h.item),type:"button",class:"option",disabled:n.value.has(a(at)(h.item)),onClick:p=>a(_o)(h.item)},[o("span",O0,d(a(Ae)(h.icon||a(Cn)(h.item.entity))),1),o("span",I0,[o("strong",null,d(h.label),1),o("small",null,d(n.value.has(a(at)(h.item))?a(c)("editor.topbar.add.added"):[h.name,h.area].filter(Boolean).join(" · ")),1)])],8,P0))),128))])])):B("",!0),o("div",L0,[o("label",M0,d(a(c)("editor.topbar.add.entity")),1),Te(o("input",{id:"topbar-search","onUpdate:modelValue":f[1]||(f[1]=h=>t.value=h),type:"search",placeholder:a(c)("editor.topbar.add.search"),"aria-label":a(c)("editor.topbar.add.search_label")},null,8,R0),[[Xe,t.value]]),o("div",N0,[(g(!0),_(q,null,me(l.value.slice(0,40),h=>(g(),_("button",{key:h.id,type:"button",class:"option",disabled:n.value.has(a(at)(r(h.id))),onClick:p=>a(_o)(r(h.id))},[o("span",D0,d(a(Ae)(a(Cn)(h.id))),1),o("span",U0,[o("strong",null,d(h.name),1),o("small",null,d([h.area,h.id].filter(Boolean).join(" · ")),1)])],8,F0))),128)),l.value.length?l.value.length>40?(g(),_("p",H0,d(a(c)("editor.common.results",l.value.length)),1)):B("",!0):(g(),_("p",j0,d(a(c)("editor.topbar.add.none_found")),1))])])]),o("div",V0,[f[4]||(f[4]=o("span",{class:"spacer"},null,-1)),o("button",{type:"button",class:"btn quiet",onClick:f[2]||(f[2]=(...h)=>a(Qe)&&a(Qe)(...h))},d(a(c)("editor.common.cancel")),1)])],64))}}),B0={class:"dr-head"},K0={class:"tx"},z0=["aria-label"],q0={class:"dr-body",id:"inspector-section"},Y0={id:"inspection-summary"},G0={key:0,class:"hint warn"},J0={key:1,class:"hint"},X0={id:"inspection"},Z0={class:"dr-foot"},Q0=Le({__name:"InspectPanel",props:{entity:{}},setup(e){const t=e,n=$e(null),s=$e(c("editor.inspect.reading")),i=$e("");async function l(){if(m.selected){n.value=null,i.value="",s.value=c("editor.inspect.fetching");try{const u=await Ft(`screens/${encodeURIComponent(m.selected)}/inspect`),f=t.entity?u.tiles.filter(h=>h.entity===t.entity):u.tiles;n.value=f,s.value=JSON.stringify(t.entity?f[0]:u,null,2)}catch(u){i.value=u.message,s.value="",Ce(u.message)}}}const r=u=>{const f=m.layout?.tiles.find(h=>h.entity===u)?.options||{};return c("editor.inspect.options",{slider:c(f.inline==="slider"?"editor.inspect.yes":"editor.inspect.no"),display:vu(f.display||"standard"),size:cm(f.size),control:im({entity:u,options:f},m.inventory),background:m.inventory.backgrounds?.[f.background||"auto"]?.label||c("editor.inspect.background_default")})};return An(l),Tt(()=>t.entity,l),(u,f)=>(g(),_(q,null,[o("div",B0,[f[1]||(f[1]=o("span",{class:"av",style:{background:"var(--seg)",color:"var(--ink-2)","font-size":"16px"}},"⌕",-1)),o("span",K0,[o("b",null,d(a(c)("editor.inspect.title")),1),o("small",{class:he({mono:e.entity})},d(e.entity||a(c)("editor.inspect.subtitle")),3)]),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.close"),onClick:f[0]||(f[0]=(...h)=>a(Qe)&&a(Qe)(...h))},"✕",8,z0)]),o("div",q0,[o("div",Y0,[i.value?(g(),_("p",G0,d(i.value),1)):n.value?B("",!0):(g(),_("p",J0,d(a(c)("editor.inspect.fetching")),1)),(g(!0),_(q,null,me(n.value||[],(h,p)=>(g(),_("article",{key:p,class:"inspection-tile"},[o("strong",null,d(h.entity),1),o("span",null,d(a(c)("editor.inspect.status",{status:h.word||h.state})),1),o("small",null,d(r(h.entity)),1)]))),128))]),o("pre",X0,d(s.value),1)]),o("div",Z0,[o("button",{type:"button",class:"btn quiet",onClick:l},d(a(c)("editor.inspect.read_again")),1),f[2]||(f[2]=o("span",{class:"spacer"},null,-1))])],64))}}),e1=["aria-hidden"],t1=Le({__name:"Drawer",setup(e){const t=$(()=>!!(m.inspector&&(m.inspector.kind!=="tile"||fo.value)));return(n,s)=>(g(),_("aside",{class:he(["drawer",{open:t.value}]),id:"tile-sheet","aria-hidden":t.value?"false":"true",onClick:s[0]||(s[0]=Ot(()=>{},["stop"]))},[a(m).inspector?(g(),_(q,{key:0},[a(m).inspector.kind==="tile"&&a(fo)?(g(),it(Wy,{key:0,tile:a(fo)},null,8,["tile"])):a(m).inspector.kind==="bar"?(g(),it(b0,{key:1,index:a(m).inspector.index},null,8,["index"])):a(m).inspector.kind==="bar-add"?(g(),it(W0,{key:2})):a(m).inspector.kind==="inspect"?(g(),it(Q0,{key:3,entity:a(m).inspector.entity},null,8,["entity"])):B("",!0)],64)):B("",!0)],10,e1))}}),n1={class:"main-head"},s1={class:"eyebrow",id:"screen-name"},i1=["title"],o1={class:"head-right"},l1={class:"seg",role:"tablist"},a1=["aria-pressed"],r1=["aria-pressed"],c1={key:1,id:"dirty",class:"chip dirty"},u1=["disabled"],d1={key:0,class:"spin small"},f1=["aria-label","aria-expanded"],p1={key:3,class:"menu",role:"menu"},h1=["disabled","title"],m1=["disabled","aria-expanded"],b1={key:0,class:"sub"},v1=["onClick"],g1=["disabled","title"],_1={class:"body",id:"body"},y1=Le({__name:"ScreenView",setup(e){const t=$(()=>ht.value),n=$(()=>t.value.online?`${t.value.delivery} · ${t.value.status}`:c("editor.screen_view.offline")),s=$(()=>Iu(t.value)&&t.value.online&&t.value.update?.profile&&t.value.update?.host),i=$(()=>m.inventory.screens.filter(T=>T.id!==t.value.id&&T.layout?.tiles?.length)),l=$e(!1),r=$e(null);function u(){m.menuOpen=!1,l.value=!1}function f(){u(),m.overrideProfile=t.value.update?.profile||null,m.overrideFriendly=t.value.name,He("#override")}function h(){u(),m.selectedTile=null,m.inspector={kind:"inspect"}}function p(T){u(),!(m.dirty&&!confirm(c("editor.screen_view.confirm.copy")))&&Lm(T)}function b(){u(),r.value?.click()}async function v(T){const k=T.target,A=k.files?.[0];k.value="",A&&(m.dirty&&!confirm(c("editor.screen_view.confirm.import"))||Rm(await A.text()))}function y(T){if(T.key==="Escape")if(m.menuOpen)u();else{if(m.palette)return;m.inspector&&!T.target?.closest?.(".picker")&&Qe()}else(T.metaKey||T.ctrlKey)&&T.key.toLowerCase()==="s"&&(T.preventDefault(),m.dirty&&Ko())}function I(T){m.menuOpen&&!T.target.closest(".head-right .menu, #more")&&u()}return An(()=>{document.addEventListener("keydown",y),document.addEventListener("click",I)}),rs(()=>{document.removeEventListener("keydown",y),document.removeEventListener("click",I)}),(T,k)=>(g(),_(q,null,[o("header",n1,[o("div",null,[o("span",s1,d(t.value.name),1),o("h1",null,d(a(m).layout?.title||a(jn)("editor.mockup.home")),1)]),o("span",{id:"delivery",class:he(["chip",{off:!t.value.online}]),title:n.value},[k[9]||(k[9]=o("span",{class:"dot"},null,-1)),Me(d(n.value),1)],10,i1),o("div",o1,[o("div",l1,[o("button",{type:"button",id:"tab-layout",role:"tab","aria-pressed":a(m).tab==="layout"?"true":"false",onClick:k[0]||(k[0]=A=>a(m).tab="layout")},d(a(c)("editor.screen_view.tabs.layout")),9,a1),o("button",{type:"button",id:"tab-settings",role:"tab","aria-pressed":a(m).tab==="settings"?"true":"false",onClick:k[1]||(k[1]=A=>{a(m).tab="settings",a(Qe)()})},d(a(c)("editor.screen_view.tabs.settings")),9,r1)]),a(m).dirty?(g(),_("span",c1,d(a(c)("editor.common.unsaved")),1)):(g(),_("span",{key:0,id:"dirty",class:he(["chip",{sent:a(m).saved}])},d(a(m).saved?a(c)("editor.screen_view.sent"):a(c)("editor.screen_view.all_saved")),3)),a(m).dirty?(g(),_("button",{key:2,id:"save",type:"button",class:"btn primary",disabled:a(m).busy,title:"⌘S",onClick:k[2]||(k[2]=A=>a(Ko)())},[a(m).busy?(g(),_("span",d1)):B("",!0),Me(d(a(m).busy?a(c)("editor.common.saving"):a(c)("editor.common.save_send")),1)],8,u1)):B("",!0),o("button",{id:"more",type:"button",class:"icon-btn","aria-label":a(c)("editor.screen_view.more"),"aria-haspopup":"menu","aria-expanded":a(m).menuOpen?"true":"false",onClick:k[3]||(k[3]=Ot(A=>{a(m).menuOpen=!a(m).menuOpen,l.value=!1},["stop"]))},"···",8,f1),a(m).menuOpen?(g(),_("div",p1,[o("button",{type:"button",role:"menuitem",id:"identify",disabled:!a(zn)(t.value)||!t.value.online,title:a(zn)(t.value)?"":a(c)("editor.screen_view.menu.identify_needs"),onClick:k[4]||(k[4]=A=>{u(),a(Tu)(t.value)})},[Me(d(a(c)("editor.screen_view.menu.identify"))+" ",1),o("small",null,d(a(c)("editor.screen_view.menu.identify_hint")),1)],8,h1),o("button",{type:"button",role:"menuitem",id:"inspect",onClick:h},[Me(d(a(c)("editor.common.read_current_data"))+" ",1),o("small",null,d(a(c)("editor.screen_view.menu.inspect_hint")),1)]),k[12]||(k[12]=o("div",{class:"sep"},null,-1)),o("button",{type:"button",role:"menuitem",id:"copy-layout",disabled:!i.value.length,"aria-expanded":l.value?"true":"false",onClick:k[5]||(k[5]=Ot(A=>l.value=!l.value,["stop"]))},[Me(d(a(c)("editor.screen_view.menu.copy"))+" ",1),o("small",null,d(i.value.length?a(c)("editor.screen_view.menu.copy_screens",i.value.length):a(c)("editor.screen_view.menu.copy_none")),1)],8,m1),l.value?(g(),_("div",b1,[(g(!0),_(q,null,me(i.value,A=>(g(),_("button",{key:A.id,type:"button",role:"menuitem",onClick:S=>p(A.id)},[Me(d(A.name)+" ",1),o("small",null,d(a(c)("editor.screen_view.menu.copy_tiles",A.layout.tiles.length)),1)],8,v1))),128))])):B("",!0),o("button",{type:"button",role:"menuitem",id:"export-layout",onClick:k[6]||(k[6]=A=>{u(),a(Au)()})},[Me(d(a(c)("editor.screen_view.menu.export"))+" ",1),k[10]||(k[10]=o("small",null,"JSON",-1))]),o("button",{type:"button",role:"menuitem",id:"import-layout",onClick:b},[Me(d(a(c)("editor.screen_view.menu.import"))+" ",1),k[11]||(k[11]=o("small",null,"JSON",-1))]),k[13]||(k[13]=o("div",{class:"sep"},null,-1)),o("button",{type:"button",role:"menuitem",id:"open-override",disabled:!t.value.update?.profile,title:t.value.update?.profile?"":a(c)("editor.screen_view.menu.override_none"),onClick:f},[Me(d(a(c)("editor.screen_view.menu.override"))+" ",1),o("small",null,d(a(c)("editor.screen_view.menu.override_hint")),1)],8,g1),o("button",{type:"button",role:"menuitem",onClick:k[7]||(k[7]=A=>{u(),a(He)("#firmware")})},d(a(c)("editor.nav.firmware")),1),s.value?(g(),_("button",{key:1,type:"button",role:"menuitem",onClick:k[8]||(k[8]=A=>{u(),a(qo)(t.value)})},[Me(d(a(c)("editor.screen_view.menu.update"))+" ",1),o("small",null,d(t.value.update?.target),1)])):B("",!0)])):B("",!0),o("input",{ref_key:"fileInput",ref:r,type:"file",accept:"application/json,.json",hidden:"",onChange:v},null,544)])]),o("div",_1,[a(m).tab==="layout"?(g(),it(Zg,{key:0})):(g(),it(m_,{key:1})),ie(t1)])],64))}}),w1={key:0,id:"choose",class:"empty"},k1={key:1,id:"empty",class:"empty"},$1=Le({__name:"EmptyState",setup(e){return(t,n)=>a(m).inventory.screens.length?(g(),_("section",w1,[n[1]||(n[1]=o("span",{class:"empty-icon"},"▦",-1)),o("h2",null,d(a(c)("editor.empty.choose.title")),1),o("p",null,d(a(c)("editor.empty.choose.text")),1)])):(g(),_("section",k1,[n[2]||(n[2]=o("span",{class:"empty-icon"},"▦",-1)),o("h2",null,d(a(c)("editor.empty.start.title")),1),o("p",null,d(a(c)("editor.empty.start.text")),1),o("button",{id:"start",type:"button",class:"btn primary",onClick:n[0]||(n[0]=s=>a(He)("#new-screen"))},d(a(c)("editor.empty.start.button")),1)]))}}),x1={class:"panel",id:"settings-view"},S1={class:"panel-head"},C1={class:"tx"},T1={class:"eyebrow"},E1={id:"settings-title"},A1={class:"card-grid"},P1={class:"card"},O1={class:"tools"},I1={class:"tx"},L1={class:"tx"},M1={key:0,class:"card updates",id:"updates"},R1={id:"updates-hint"},N1=["aria-valuenow"],F1={class:"progress-text"},D1={key:0,class:"log-lines"},U1={key:2,class:"whatsnew"},j1={class:"check"},H1=["checked"],V1={key:1,class:"card",id:"language"},W1={class:"field"},B1={class:"f-label",for:"screen-language"},K1=["value","disabled"],z1={value:"auto"},q1=["value"],Y1={key:0,id:"language-ha-missing"},G1={class:"field"},J1={class:"f-label",for:"time-format"},X1=["value","disabled"],Z1={value:"auto"},Q1={value:"24"},e2={value:"12"},t2={class:"field"},n2={class:"f-label",for:"number-format"},s2=["value","disabled"],i2={value:"auto"},o2=["value"],l2={key:0,class:"actions",id:"language-profile"},a2=["disabled"],r2={class:"card"},c2={class:"tools"},u2={class:"tx"},d2={class:"card",id:"claude"},f2={class:"actions"},p2=["disabled"],h2={id:"claude-path"},m2={class:"actions"},b2={class:"btn quiet",id:"claude-download",href:"api/claude-skill.zip",download:"esp-screens.zip"},v2="https://github.com/MaxGramser/homeassistant_espscreen/blob/main/docs/TRANSLATING.md",g2=Le({__name:"AppSettingsView",setup(e){const t=$(()=>m.inventory.updates),n=$(()=>m.inventory.screens.filter(E=>E.update?.available).length),s=$(()=>t.value?t.value.busy?c("editor.settings.updates.busy",{version:t.value.target}):m.inventory.screens.length?n.value?c("editor.settings.updates.available",{version:t.value.target},n.value):c("editor.settings.updates.current",{version:t.value.target}):c("editor.settings.updates.no_screens",{version:t.value.target}):""),i=$(()=>m.inventory.screens.find(E=>E.update?.state==="running"||m.updating.includes(E.id))),l=$(()=>i.value?Xn(i.value):null),r=$(()=>(m.firmwareJob?.logs||[]).slice(-12).join(` +`)),u=$(()=>{const E=m.inventory.changelog,R=t.value?.target;return!Array.isArray(E)||!R?[]:E.filter(L=>L.firmware===R).flatMap(L=>L.lines).slice(0,10)}),f=$(()=>m.inventory.claude_skill),h=$e(!1);async function p(){h.value=!0;try{await Km()}finally{h.value=!1}}const b=["point","comma","space"],v=$(()=>m.inventory.language),y=$(()=>{const E=v.value,R=E?.ha?iu(E.ha,E.languages.map(L=>L.code)):void 0;return E?.languages.find(L=>L.code===R)?.name}),I=$(()=>v.value?.languages.find(E=>E.code===v.value.effective&&!E.checked)),T=E=>c(E==="12"?"editor.settings.language.clock_12":"editor.settings.language.clock_24"),k=E=>au("1234.5",E),A=Qh(),S=$(()=>{const E=v.value;return E?{...A.clock&&A.clock!==(E.clock_effective||"24")?{clock:A.clock}:{},...A.numbers&&A.numbers!==(E.numbers_effective||"point")?{numbers:A.numbers}:{}}:{}}),U=$(()=>[S.value.clock&&T(S.value.clock),S.value.numbers&&k(os[S.value.numbers])].filter(Boolean).join(" · ")),C=$e(!1);async function K(E,R){const L=R.target;C.value=!0;const D=await rr({[E]:L.value});C.value=!1,D||(L.value=String(v.value?.[E]??"auto"))}async function O(){C.value=!0,await rr(S.value),C.value=!1}return(E,R)=>{const L=Ws("i18n-t");return g(),_("div",x1,[o("div",S1,[o("div",C1,[o("span",T1,d(a(c)("editor.nav.settings")),1),o("h1",E1,d(a(c)("editor.settings.title")),1)]),o("button",{type:"button",class:"btn quiet",id:"close-settings",onClick:R[0]||(R[0]=D=>a(He)(""))},d(a(c)("editor.settings.back")),1)]),o("div",A1,[o("section",P1,[o("h2",null,d(a(c)("editor.settings.screens.title")),1),o("p",null,d(a(c)("editor.settings.screens.text")),1),o("div",O1,[o("button",{type:"button",class:"tool",onClick:R[1]||(R[1]=D=>a(He)("#new-screen"))},[R[9]||(R[9]=o("span",{class:"tool-icon"},"+",-1)),o("span",I1,[o("b",null,d(a(c)("editor.nav.new_screen")),1),o("small",null,d(a(c)("editor.nav.new_screen_detail")),1)])]),o("button",{type:"button",class:"tool",onClick:R[2]||(R[2]=D=>a(He)("#firmware"))},[R[10]||(R[10]=o("span",{class:"tool-icon"},"⇪",-1)),o("span",L1,[o("b",null,d(a(c)("editor.nav.firmware")),1),o("small",null,d(a(c)("editor.settings.screens.firmware_detail")),1)])])])]),t.value?(g(),_("section",M1,[o("h2",null,d(a(c)("editor.settings.updates.title")),1),o("p",R1,d(s.value),1),i.value&&l.value?(g(),_(q,{key:0},[o("div",{class:"progress",role:"progressbar","aria-valuenow":l.value.percent,"aria-valuemin":"0","aria-valuemax":"100"},[o("i",{style:Ue({width:l.value.percent+"%"})},null,4)],8,N1),o("div",F1,[o("span",null,d(i.value.name)+" · "+d(l.value.percent)+" %",1),o("span",null,d(l.value.text),1)]),r.value?(g(),_("pre",D1,d(r.value),1)):B("",!0)],64)):B("",!0),t.value.pending&&!t.value.busy&&t.value.pending>=2?(g(),_("button",{key:1,id:"update-all",type:"button",class:"btn primary",onClick:R[3]||(R[3]=(...D)=>a(or)&&a(or)(...D))},d(a(c)("editor.settings.updates.all",t.value.pending)),1)):B("",!0),u.value.length&&!a(zo)()?(g(),_("details",U1,[o("summary",null,d(a(c)("editor.settings.updates.whats_new",{version:t.value.target})),1),o("ul",null,[(g(!0),_(q,null,me(u.value,D=>(g(),_("li",{key:D},d(D),1))),128))])])):B("",!0),o("label",j1,[o("input",{type:"checkbox",id:"auto-update",checked:!!t.value.auto,onChange:R[4]||(R[4]=D=>a(Bm)(D.target.checked))},null,40,H1),o("span",null,[Me(d(a(c)("editor.settings.updates.auto_label")),1),o("small",null,d(a(c)("editor.settings.updates.auto_hint")),1)])])])):B("",!0),v.value?(g(),_("section",V1,[o("h2",null,d(a(c)("editor.settings.language.title")),1),o("div",W1,[o("label",B1,d(a(c)("editor.settings.language.screen_language")),1),o("select",{id:"screen-language",value:v.value.setting,disabled:C.value,onChange:R[5]||(R[5]=D=>K("setting",D))},[o("option",z1,d(y.value?a(c)("editor.settings.language.auto",{name:y.value}):a(c)("editor.settings.language.auto_plain")),1),(g(!0),_(q,null,me(v.value.languages,D=>(g(),_("option",{key:D.code,value:D.code},d(D.checked?D.name:a(c)("editor.settings.language.unchecked",{name:D.name})),9,q1))),128))],40,K1),v.value.setting==="auto"&&!y.value?(g(),_("small",Y1,d(a(c)("editor.settings.language.ha_missing")),1)):B("",!0),I.value?(g(),it(L,{key:1,keypath:"editor.settings.language.help",tag:"small",id:"language-help",scope:"global"},{name:oe(()=>[Me(d(I.value.name),1)]),guide:oe(()=>[o("a",{href:v2,target:"_blank",rel:"noopener"},d(a(c)("editor.settings.language.guide")),1)]),_:1})):B("",!0),o("small",null,d(a(c)("editor.settings.language.update_hint")),1)]),o("div",G1,[o("label",J1,d(a(c)("editor.settings.language.time")),1),o("select",{id:"time-format",value:v.value.clock||"auto",disabled:C.value,onChange:R[6]||(R[6]=D=>K("clock",D))},[o("option",Z1,d(a(c)("editor.settings.language.time_auto",{clock:T(v.value.clock_auto||v.value.clock_effective)})),1),o("option",Q1,d(T("24")),1),o("option",e2,d(T("12")),1)],40,X1)]),o("div",t2,[o("label",n2,d(a(c)("editor.settings.language.numbers")),1),o("select",{id:"number-format",value:v.value.numbers||"auto",disabled:C.value,onChange:R[7]||(R[7]=D=>K("numbers",D))},[o("option",i2,d(a(c)("editor.settings.language.numbers_auto",{example:k(a(Ym))})),1),(g(),_(q,null,me(b,D=>o("option",{key:D,value:D},d(k(a(os)[D])),9,o2)),64))],40,s2)]),U.value?(g(),_("div",l2,[o("small",null,d(a(c)("editor.settings.language.profile",{formats:U.value})),1),o("button",{type:"button",class:"btn quiet mini",disabled:C.value,onClick:O},d(a(c)("editor.settings.language.use_profile")),9,a2)])):B("",!0),o("small",null,d(a(c)("editor.settings.language.editor_hint")),1)])):B("",!0),o("section",r2,[o("h2",null,d(a(c)("editor.nav.alerts")),1),o("p",null,d(a(c)("editor.settings.alerts.text")),1),o("div",c2,[o("button",{type:"button",class:"tool",onClick:R[8]||(R[8]=D=>a(He)("#alerts"))},[R[11]||(R[11]=o("span",{class:"tool-icon"},"!",-1)),o("span",u2,[o("b",null,d(a(c)("editor.nav.alerts")),1),o("small",null,d(a(c)("editor.settings.alerts.detail")),1)])])])]),o("section",d2,[R[12]||(R[12]=o("h2",null,"Claude",-1)),o("p",null,d(a(c)("editor.settings.claude.text")),1),o("div",f2,[o("button",{type:"button",id:"claude-install",class:he(["btn",f.value?.installed&&f.value.current?"quiet":"primary"]),disabled:!f.value||h.value,onClick:p},d(!f.value||!f.value.installed?a(c)("editor.settings.claude.install"):f.value.current?a(c)("editor.settings.claude.install_again"):a(c)("editor.settings.claude.update")),11,p2),o("span",{id:"claude-status",class:he(["chip",f.value&&f.value.installed?f.value.current?"good":"update":""]),role:"status"},d(f.value?f.value.installed?f.value.current?a(c)("editor.settings.claude.installed_chip"):a(c)("editor.settings.claude.newer"):a(c)("editor.settings.claude.not_installed"):a(c)("editor.common.loading")),3)]),ie(L,{keypath:"editor.settings.claude.writes",tag:"small",scope:"global"},{path:oe(()=>[o("code",h2,d(f.value?.path||"/homeassistant/.claude/skills/esp-screens"),1)]),_:1}),o("div",m2,[o("a",b2,d(a(c)("editor.settings.claude.download")),1),o("small",null,d(a(c)("editor.settings.claude.upload")),1)])])])])}}}),_2={class:"panel",id:"installer"},y2={class:"panel-head"},w2={class:"tx"},k2={class:"eyebrow"},$2={id:"install-title"},x2={key:0},S2=["aria-label"],C2={class:"boards"},T2={class:"board"},E2={class:"board"},A2={class:"board"},P2={class:"field"},O2={class:"f-label",for:"friendly_name"},I2=["placeholder"],L2={class:"node-line"},M2={id:"node-preview"},R2={key:0,class:"field",id:"node-label"},N2={class:"f-label",for:"node-name"},F2={key:1,id:"wifi-fields",class:"wifi"},D2={class:"hint",id:"wifi-status"},U2={key:0,class:"field",id:"wifi-ssid-label"},j2={class:"f-label",for:"wifi_ssid"},H2={key:1,class:"field",id:"wifi-password-label"},V2={class:"f-label",for:"wifi_password"},W2={class:"field"},B2={class:"f-label",for:"install-target"},K2={key:0,value:"usb"},z2=["value"],q2={value:"download"},Y2={value:""},G2={id:"target-hint"},J2={key:2,class:"hint",id:"install-note"},X2={class:"actions"},Z2=["disabled"],Q2={id:"install-status",class:"status-line error",role:"status"},ew={key:1,id:"install-progress",class:"card"},tw={class:"progress-head"},nw={key:0,class:"spin",id:"progress-spin"},sw={id:"progress-title"},iw={id:"progress-detail"},ow={key:0,id:"install-download",class:"card",style:{background:"var(--surface-2)"}},lw=["href","download"],aw={class:"steps",id:"download-steps"},rw={key:1,id:"install-result",class:"field"},cw={class:"key-box"},uw={class:"steps",id:"install-steps"},dw=["open"],fw={id:"install-log",class:"log"},pw={class:"actions"},hw="https://web.esphome.io/?dashboard_install",mw=Le({__name:"InstallerView",setup(e){const t=qn({board:"cyd",friendly_name:"",name:"",wifi_ssid:"",wifi_password:"",target:""}),n=qn({view:"setup",file:null,friendly:"",board:"cyd",target:"",apiKey:null,nodeEdited:!1,jobState:null,picked:!1,action:null}),s=$e(!1),i=$e(null),l=$e(null),r=$e([]),u=$e(""),f=$e(""),h=$e(!1),p=$e(!1),b=$e(null);let v=0;function y(ke){return ke.toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g,"").replace(/[^a-z0-9]+/g,"-").replace(/^[^a-z]+/,"").slice(0,30).replace(/-+$/,"")||"screen"}function I(ke){const H=ke.replace(/^\/dev\/serial\/by-id\/usb-/,"").replace(/-if\d+(-port\d+)?$/,"").replace(/_/g," ");return`USB · ${H===ke?ke.replace(/^\/dev\//,""):H}`}Tt(()=>t.friendly_name,()=>{n.nodeEdited||(t.name=y(t.friendly_name))});const T=$(()=>t.name||"…"),k=$(()=>i.value?.ports||[]),A=$(()=>i.value?.wifi),S=$(()=>A.value?.state==="new"||A.value?.state==="missing"),U=$(()=>A.value?.missing||[]),C=$(()=>c(A.value?.state==="new"?"editor.installer.wifi.new":"editor.installer.wifi.missing")),K=$(()=>A.value?.state==="ready"?c("editor.installer.wifi.ready"):A.value?.state==="invalid"?c("editor.installer.wifi.invalid"):""),O=$(()=>c(t.target==="usb"?"editor.installer.target.usb":t.target==="download"?"editor.installer.target.download":t.target?k.value.length>1?"editor.installer.target.several":"editor.installer.target.once":"editor.installer.target.later")),E=$(()=>t.target==="download"?c("editor.firmware.build_download"):t.target?c("editor.installer.install"):c("editor.installer.save_profile")),R=$(()=>i.value?.job?.state==="running"&&!(n.file&&i.value.job.file===n.file)),L=$(()=>h.value||A.value?.state==="invalid"||t.target==="usb"||!!t.target&&(R.value||!i.value?.available));function D(){const ke=t.target;(ke==="download"||ke===""?n.picked:k.value.includes(ke))||(t.target=k.value[0]||"usb")}async function M(){let ke;try{ke=await Ft("firmware")}catch(se){u.value=se.message;return}i.value=ke;const H=ke.job,ne=H&&n.file&&H.file===n.file;if(ne&&(n.jobState=H.state),n.view==="setup"){if(ne&&H.state==="running"){Y(H,ke.logs||[]);return}D(),u.value=R.value?c("editor.installer.busy",{file:H.file}):!ke.available&&t.target?c("editor.installer.no_cli"):K.value}else n.view==="progress"&&ne&&(l.value=H,r.value=ke.logs||[],H.state!=="running"&&H.state!=="success"&&(p.value=!0))}function Y(ke,H){n.view="progress",n.jobState=ke.state,n.action=ke.action,l.value=ke,r.value=H}const te=$(()=>l.value?.state==="running"),ye=$(()=>n.view==="done"||l.value?.state==="success"),re=$(()=>n.action==="download"),be=$(()=>c(n.view==="done"?"editor.installer.title.saved":te.value?"editor.installer.title.running":ye.value?re.value?"editor.installer.title.ready":"editor.installer.title.done":"editor.installer.title.failed")),ge=$(()=>n.view==="done"?c("editor.installer.progress.saved",{file:n.file}):te.value?l.value?.stage==="upload"?c("editor.installer.progress.writing",{name:n.friendly}):c("editor.installer.progress.building"):ye.value?re.value?c("editor.installer.progress.ready",{name:n.friendly}):c("editor.installer.progress.installed",{name:n.friendly}):c(re.value?"editor.installer.progress.build_failed":"editor.installer.progress.install_failed")),we=$(()=>n.view==="done"?c("editor.installer.detail.saved"):te.value?l.value?.stage==="upload"?c("editor.installer.detail.uploading"):c(re.value?"editor.installer.detail.building_download":"editor.installer.detail.building"):ye.value?re.value?c("editor.installer.detail.downloaded"):c(n.board==="cyd"?"editor.installer.detail.booted_cyd":"editor.installer.detail.booted"):r.value.filter(ke=>/error/i.test(ke)).pop()||r.value.filter(ke=>/failed/i.test(ke)).pop()||c("editor.installer.detail.see_log")),Ge=$(()=>({href:`api/firmware/profiles/${encodeURIComponent(n.file||"")}/download`,name:(n.file||"").replace(/\.yaml$/,"")+".factory.bin"}));async function qe(ke){const H=ke.target;if(n.nodeEdited||(t.name=y(t.friendly_name)),!!H.reportValidity()){h.value=!0,f.value="";try{const ne={board:t.board,friendly_name:t.friendly_name,name:t.name,target:t.target};S.value&&(U.value.includes("wifi_ssid")&&(ne.wifi_ssid=t.wifi_ssid),U.value.includes("wifi_password")&&(ne.wifi_password=t.wifi_password));const se=await ft("firmware/profiles","POST",ne);Object.assign(n,{file:se.file,apiKey:se.api_key,friendly:t.friendly_name.trim(),board:t.board,target:t.target}),t.wifi_password="",se.job?Y(se.job,[]):n.view="done"}catch(ne){f.value=ne.message}finally{h.value=!1}}}async function le(){try{if(!re.value){const{ports:H}=await Ft("firmware");!H.includes(n.target)&&H.length===1&&(n.target=H[0])}const ke=await ft("firmware/jobs","POST",re.value?{file:n.file,action:"download"}:{file:n.file,action:"install",target:n.target});Y(ke,[])}catch(ke){Ce(ke.message)}}function Z(){Object.assign(n,{view:"setup",file:null,apiKey:null,nodeEdited:!1,jobState:null,target:"",picked:!1,action:null}),Object.assign(t,{board:"cyd",friendly_name:"",name:"",wifi_ssid:"",wifi_password:"",target:""}),s.value=!1,l.value=null,r.value=[],f.value="",u.value="",p.value=!1,M()}function ue(){n.view==="progress"&&n.jobState!=="running"&&(n.view="done"),He("")}return An(()=>{M(),v=window.setInterval(M,3e3)}),rs(()=>clearInterval(v)),(ke,H)=>{const ne=Ws("i18n-t");return g(),_("div",_2,[o("div",y2,[o("div",w2,[o("span",k2,d(a(c)("editor.nav.new_screen")),1),o("h1",$2,d(n.view==="setup"?a(c)("editor.installer.title.setup"):be.value),1),n.view==="setup"?(g(),_("p",x2,d(a(c)("editor.installer.intro")),1)):B("",!0)]),o("button",{type:"button",class:"btn quiet",id:"close-install","aria-label":a(c)("editor.common.close"),onClick:ue},d(a(c)("editor.common.back")),9,S2)]),n.view==="setup"?(g(),_("form",{key:0,id:"install-form",class:"card",onSubmit:Ot(qe,["prevent"])},[o("fieldset",null,[o("legend",null,d(a(c)("editor.installer.board")),1),o("div",C2,[o("label",T2,[Te(o("input",{type:"radio",name:"board",value:"cyd","onUpdate:modelValue":H[0]||(H[0]=se=>t.board=se)},null,512),[[ao,t.board]]),o("span",null,[o("b",null,d(a(c)("editor.installer.board_cyd")),1),H[14]||(H[14]=o("small",null,"ESP32-2432S028 · 320 × 240",-1))])]),o("label",E2,[Te(o("input",{type:"radio",name:"board",value:"guition","onUpdate:modelValue":H[1]||(H[1]=se=>t.board=se)},null,512),[[ao,t.board]]),o("span",null,[o("b",null,d(a(c)("editor.installer.board_guition")),1),H[15]||(H[15]=o("small",null,"ESP32-S3-4848S040 · 480 × 480 · GT911",-1))])]),o("label",A2,[Te(o("input",{type:"radio",name:"board",value:"elecrow","onUpdate:modelValue":H[2]||(H[2]=se=>t.board=se)},null,512),[[ao,t.board]]),o("span",null,[o("b",null,d(a(c)("editor.installer.board_elecrow")),1),H[16]||(H[16]=o("small",null,"DIS08070H · ESP32-S3 N4R8 · 800 × 480 · GT911",-1))])])])]),o("div",P2,[o("label",O2,d(a(c)("editor.installer.name")),1),Te(o("input",{id:"friendly_name",name:"friendly_name","onUpdate:modelValue":H[3]||(H[3]=se=>t.friendly_name=se),required:"",maxlength:"60",placeholder:a(c)("editor.installer.name_placeholder"),autocomplete:"off"},null,8,I2),[[Xe,t.friendly_name]]),o("small",L2,[Me(d(a(c)("editor.installer.device_name"))+" ",1),o("code",M2,d(T.value),1),o("button",{type:"button",class:"btn link mini",id:"edit-node",onClick:H[4]||(H[4]=se=>{n.nodeEdited=!0,s.value=!0})},d(a(c)("editor.installer.customize")),1)]),o("small",null,d(a(c)("editor.installer.name_hint")),1)]),s.value?(g(),_("div",R2,[o("label",N2,d(a(c)("editor.installer.device_name")),1),Te(o("input",{id:"node-name",name:"name","onUpdate:modelValue":H[5]||(H[5]=se=>t.name=se),pattern:"[a-z][a-z0-9\\-]{0,29}",maxlength:"30",autocomplete:"off",onInput:H[6]||(H[6]=se=>n.nodeEdited=!0)},null,544),[[Xe,t.name]]),o("small",null,d(a(c)("editor.installer.device_name_hint")),1)])):B("",!0),S.value?(g(),_("fieldset",F2,[o("legend",null,d(a(c)("editor.installer.wifi.title")),1),o("p",D2,d(C.value),1),U.value.includes("wifi_ssid")?(g(),_("div",U2,[o("label",j2,d(a(c)("editor.installer.wifi.ssid")),1),Te(o("input",{id:"wifi_ssid",name:"wifi_ssid","onUpdate:modelValue":H[7]||(H[7]=se=>t.wifi_ssid=se),autocomplete:"off"},null,512),[[Xe,t.wifi_ssid]])])):B("",!0),U.value.includes("wifi_password")?(g(),_("div",H2,[o("label",V2,d(a(c)("editor.installer.wifi.password")),1),Te(o("input",{id:"wifi_password",name:"wifi_password",type:"password","onUpdate:modelValue":H[8]||(H[8]=se=>t.wifi_password=se),autocomplete:"new-password"},null,512),[[Xe,t.wifi_password]])])):B("",!0)])):B("",!0),o("div",W2,[o("label",B2,d(a(c)("editor.installer.install_via")),1),Te(o("select",{id:"install-target",name:"target","onUpdate:modelValue":H[9]||(H[9]=se=>t.target=se),onChange:H[10]||(H[10]=se=>{n.picked=!0,M()})},[k.value.length?B("",!0):(g(),_("option",K2,d(a(c)("editor.firmware.no_board")),1)),(g(!0),_(q,null,me(k.value,se=>(g(),_("option",{key:se,value:se},d(I(se)),9,z2))),128)),o("option",q2,d(a(c)("editor.firmware.download_target")),1),o("option",Y2,d(a(c)("editor.installer.later")),1)],544),[[Wn,t.target]]),o("small",G2,d(O.value),1)]),u.value?(g(),_("p",J2,d(u.value),1)):B("",!0),o("div",X2,[o("button",{type:"submit",class:"btn primary",id:"install-go",disabled:L.value},d(E.value),9,Z2),o("span",Q2,d(f.value),1)])],32)):(g(),_("div",ew,[o("div",tw,[te.value?(g(),_("span",nw)):(g(),_("span",{key:1,class:he(["outcome",ye.value?"ok":"bad"]),id:"progress-mark"},d(ye.value?"✓":"✕"),3)),o("strong",sw,d(ge.value),1)]),o("p",iw,d(we.value),1),ye.value&&re.value&&n.view!=="done"?(g(),_("div",ow,[o("a",{class:"btn primary",id:"download-firmware",href:Ge.value.href,download:Ge.value.name},d(a(c)("editor.firmware.download_file",{name:Ge.value.name})),9,lw),o("ol",aw,[o("li",null,[ie(ne,{keypath:"editor.installer.download_steps.plug",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.download_steps.plug_bold")),1)]),_:1})]),o("li",null,[ie(ne,{keypath:"editor.installer.download_steps.open",scope:"global"},{bold:oe(()=>[o("b",null,[ie(ne,{keypath:"editor.installer.download_steps.open_bold",scope:"global"},{esphome_web:oe(()=>[o("a",{href:hw,target:"_blank",rel:"noopener"},"ESPHome Web")]),_:1})])]),_:1})]),o("li",null,[ie(ne,{keypath:n.board==="cyd"?"editor.installer.download_steps.install_cyd":"editor.installer.download_steps.install",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.download_steps.install_bold")),1)]),file:oe(()=>[Me(d(Ge.value.name),1)]),_:1},8,["keypath"])])]),o("small",null,d(a(c)("editor.installer.download_keep")),1)])):B("",!0),ye.value?(g(),_("div",rw,[o("div",cw,[o("span",null,d(a(c)("editor.installer.api_key")),1),o("code",{id:"api-key",ref_key:"keyBox",ref:b},d(n.apiKey||""),513),o("button",{type:"button",class:"btn quiet mini",id:"copy-key",onClick:H[11]||(H[11]=se=>a(Lt)(n.apiKey||"",b.value))},d(a(c)("editor.common.copy")),1)]),o("ol",uw,[o("li",null,[ie(ne,{keypath:"editor.installer.pairing.ha",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.pairing.ha_bold")),1)]),name:oe(()=>[Me(d(n.friendly),1)]),_:1}),H[17]||(H[17]=Me()),o("button",{type:"button",class:"btn quiet mini",onClick:H[12]||(H[12]=(...se)=>a(ki)&&a(ki)(...se))},d(a(c)("editor.common.open_integrations")),1)]),o("li",null,[ie(ne,{keypath:"editor.installer.pairing.key",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.pairing.key_bold")),1)]),_:1})]),o("li",null,[ie(ne,{keypath:"editor.installer.pairing.actions",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.pairing.actions_bold")),1)]),_:1})]),o("li",null,[ie(ne,{keypath:"editor.installer.pairing.tiles",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.pairing.tiles_bold")),1)]),_:1})])])])):B("",!0),n.view!=="done"?(g(),_("details",{key:2,id:"install-log-wrap",class:"log-wrap",open:p.value,onToggle:H[13]||(H[13]=se=>p.value=se.target.open)},[o("summary",null,d(a(c)("editor.installer.log")),1),o("pre",fw,d(r.value.join(` +`)),1)],40,dw)):B("",!0),o("div",pw,[!te.value&&!ye.value?(g(),_("button",{key:0,type:"button",class:"btn primary",id:"install-retry",onClick:le},d(a(c)("editor.installer.retry")),1)):B("",!0),o("button",{type:"button",class:"btn quiet",id:"install-close",onClick:Z},d(ye.value?a(c)("editor.installer.another"):a(c)("editor.installer.start_over")),1),o("button",{type:"button",class:he(["btn",ye.value?"primary":"quiet"]),onClick:ue},d(ye.value?a(c)("editor.installer.done"):a(c)("editor.common.close")),3)])]))])}}}),bw={class:"panel",id:"firmware-dialog"},vw={class:"panel-head"},gw={class:"tx"},_w={class:"eyebrow"},yw={class:"card"},ww={class:"card-grid"},kw={class:"field"},$w={class:"f-label",for:"firmware-file"},xw=["value"],Sw={class:"field"},Cw={class:"f-label",for:"firmware-port"},Tw={value:"ota"},Ew={key:0,value:"usb"},Aw=["value"],Pw={value:"download"},Ow={key:0,class:"field",id:"firmware-host-label"},Iw={class:"f-label",for:"firmware-host"},Lw=["placeholder"],Mw={class:"actions"},Rw=["disabled"],Nw=["disabled"],Fw=["disabled"],Dw={key:0,class:"spin"},Uw={id:"firmware-status",class:"status-line",role:"status"},jw={key:0,id:"firmware-download",class:"card",style:{background:"var(--surface-2)"}},Hw=["href","download"],Vw={id:"firmware-log",class:"log"},Ww="https://web.esphome.io/?dashboard_install",Bw=Le({__name:"FirmwareView",setup(e){const t=$e(null),n=$e(""),s=$e("ota"),i=$e("");let l=0;async function r(T=!1){try{const k=await Ft("firmware");t.value=k,(T||!n.value)&&(n.value=k.profiles[0]?.file||"");const A=k.ports||[];s.value.startsWith("/")&&!A.includes(s.value)&&(s.value=A[0]||"usb"),s.value==="usb"&&A.length&&(s.value=A[0])}catch(k){Ce(k.message)}}const u=$(()=>t.value?.job?.state==="running"),f=$(()=>!t.value||u.value||!t.value.available||!t.value.profiles?.length),h=$(()=>f.value||s.value==="usb"),p=$(()=>t.value?.ports||[]),b=$(()=>t.value?t.value.available?t.value.job?`${t.value.job.file} · ${t.value.job.action} · ${t.value.job.state}`:c("editor.firmware.choose"):c("editor.firmware.no_cli"):c("editor.common.loading")),v=$(()=>s.value==="download"&&!!n.value&&!!t.value?.downloads?.includes(n.value)),y=$(()=>({href:`api/firmware/profiles/${encodeURIComponent(n.value)}/download`,name:n.value.replace(/\.yaml$/,"")+".factory.bin"}));async function I(T){try{await ft("firmware/jobs","POST",{file:n.value,action:T==="validate"?"validate":T==="build"?"build":s.value==="download"?"download":"install",target:s.value==="ota"?i.value.trim():s.value==="download"?"":s.value}),await r()}catch(k){Ce(k.message)}}return An(()=>{r(!0),l=window.setInterval(()=>r(),3e3)}),rs(()=>clearInterval(l)),(T,k)=>{const A=Ws("i18n-t");return g(),_("div",bw,[o("div",vw,[o("div",gw,[o("span",_w,d(a(c)("editor.nav.firmware")),1),o("h1",null,d(a(c)("editor.firmware.title")),1),ie(A,{keypath:"editor.firmware.intro",tag:"p",scope:"global"},{ota:oe(()=>[o("b",null,d(a(c)("editor.firmware.ota")),1)]),download:oe(()=>[o("b",null,d(a(c)("editor.firmware.download")),1)]),check:oe(()=>[o("b",null,d(a(c)("editor.firmware.check")),1)]),build:oe(()=>[o("b",null,d(a(c)("editor.firmware.build")),1)]),install:oe(()=>[o("b",null,d(a(c)("editor.firmware.install")),1)]),_:1})]),o("button",{type:"button",class:"btn quiet",id:"close-firmware",onClick:k[0]||(k[0]=S=>a(He)(""))},d(a(c)("editor.common.back")),1)]),o("div",yw,[o("div",ww,[o("div",kw,[o("label",$w,d(a(c)("editor.firmware.profile")),1),Te(o("select",{id:"firmware-file","onUpdate:modelValue":k[1]||(k[1]=S=>n.value=S)},[(g(!0),_(q,null,me(t.value?.profiles||[],S=>(g(),_("option",{key:S.file,value:S.file},d(S.file),9,xw))),128))],512),[[Wn,n.value]])]),o("div",Sw,[o("label",Cw,d(a(c)("editor.firmware.install_to")),1),Te(o("select",{id:"firmware-port","onUpdate:modelValue":k[2]||(k[2]=S=>s.value=S)},[o("option",Tw,d(a(c)("editor.firmware.ota")),1),p.value.length?B("",!0):(g(),_("option",Ew,d(a(c)("editor.firmware.no_board")),1)),(g(!0),_(q,null,me(p.value,S=>(g(),_("option",{key:S,value:S},d(S),9,Aw))),128)),o("option",Pw,d(a(c)("editor.firmware.download_target")),1)],512),[[Wn,s.value]])]),s.value==="ota"?(g(),_("div",Ow,[o("label",Iw,d(a(c)("editor.firmware.host")),1),Te(o("input",{id:"firmware-host","onUpdate:modelValue":k[3]||(k[3]=S=>i.value=S),placeholder:n.value?n.value.replace(/\.yaml$/,".local"):"screen-livingroom.local"},null,8,Lw),[[Xe,i.value]])])):B("",!0)]),o("div",Mw,[o("button",{type:"button",class:"btn quiet",id:"firmware-validate",disabled:f.value,onClick:k[4]||(k[4]=S=>I("validate"))},d(a(c)("editor.firmware.check")),9,Rw),o("button",{type:"button",class:"btn quiet",id:"firmware-build",disabled:f.value,onClick:k[5]||(k[5]=S=>I("build"))},d(a(c)("editor.firmware.build")),9,Nw),o("button",{type:"button",class:"btn primary",id:"firmware-install",disabled:h.value,onClick:k[6]||(k[6]=S=>I("install"))},d(s.value==="download"?a(c)("editor.firmware.build_download"):a(c)("editor.firmware.install")),9,Fw),u.value?(g(),_("span",Dw)):B("",!0)]),o("p",Uw,d(b.value),1),v.value?(g(),_("div",jw,[o("a",{class:"btn primary",id:"firmware-download-link",href:y.value.href,download:y.value.name},d(a(c)("editor.firmware.download_file",{name:y.value.name})),9,Hw),ie(A,{keypath:"editor.firmware.download_how",tag:"small",scope:"global"},{esphome_web:oe(()=>[o("a",{href:Ww,target:"_blank",rel:"noopener"},"ESPHome Web")]),_:1})])):B("",!0)]),o("pre",Vw,d((t.value?.logs||[]).join(` +`)),1)])}}}),Kw={class:"panel wide alerts",id:"alerts-dialog"},zw={class:"panel-head"},qw={class:"tx"},Yw={class:"eyebrow"},Gw={key:0,class:"hint"},Jw={class:"alert-hero"},Xw={class:"alert-mock",id:"alert-mock","aria-hidden":"true"},Zw={class:"mdi alert-mock-icon",id:"alert-mock-icon"},Qw={id:"alert-mock-title"},ek={id:"alert-mock-subtitle"},tk={class:"fake",id:"alert-mock-button"},nk=["aria-label"],sk=["data-jump","onClick"],ik={id:"alerts-try",class:"card"},ok={class:"field"},lk={class:"f-label",for:"try-screen"},ak={value:"all"},rk=["value","disabled"],ck={class:"field"},uk={class:"f-label",for:"try-title"},dk={class:"field"},fk={class:"f-label",for:"try-subtitle"},pk={class:"field"},hk={class:"f-label",for:"try-icon"},mk={id:"try-icons"},bk=["value"],vk={class:"field"},gk={class:"f-label",for:"try-color"},_k={value:""},yk=["value"],wk={class:"field"},kk={class:"f-label",for:"try-button"},$k={class:"field"},xk={class:"f-label",for:"try-timeout"},Sk={class:"check field"},Ck={class:"actions field wide"},Tk=["disabled"],Ek={class:"status-line",id:"try-result",role:"status"},Ak={id:"alerts-screens",class:"card"},Pk={id:"alerts-min-firmware"},Ok={id:"alerts-screen-list",class:"options"},Ik={key:0,class:"hint"},Lk={class:"alert-screen-head"},Mk={class:"copy-label"},Rk=["onClick"],Nk={id:"alerts-howto",class:"card"},Fk={class:"steps"},Dk={class:"field"},Uk={class:"f-label",for:"alerts-example-screen"},jk=["value"],Hk={key:0,value:""},Vk={class:"copy-line"},Wk={id:"alerts-example"},Bk={id:"alerts-all",class:"card"},Kk={id:"alerts-all-event"},zk={id:"alerts-all-dismiss"},qk={class:"copy-line"},Yk={id:"alerts-all-example"},Gk={id:"alerts-fields",class:"card"},Jk={class:"table-scroll"},Xk={id:"alerts-field-table"},Zk={key:0},Qk={id:"alerts-icons",class:"card"},e3={class:"subhead"},t3={class:"chips",id:"alerts-suggested"},n3=["onClick"],s3={class:"mdi"},i3={class:"field"},o3={class:"f-label",for:"alerts-icon-search"},l3=["placeholder"],a3={id:"alerts-icon-groups"},r3={class:"subhead"},c3={class:"alert-icon-grid"},u3=["title","onClick"],d3={class:"mdi"},f3={key:0},p3={key:0,class:"hint"},h3={id:"alerts-colors",class:"card"},m3={class:"swatches",id:"alerts-swatches"},b3=["onClick"],v3={id:"alerts-behaviour",class:"card"},g3={class:"alerts-list"},_3={id:"alerts-events",class:"card"},y3={id:"alerts-event-name"},w3={class:"table-scroll"},k3={id:"alerts-ending-table"},$3={class:"subhead"},x3={class:"copy-line"},S3={id:"alerts-wait-example"},C3={id:"alerts-tips",class:"card"},T3={class:"alerts-list"},E3=Le({__name:"AlertsView",setup(e){const t=$(()=>m.inventory.alerts),n=qn({screen:"all",title:c("editor.alerts.example.title"),subtitle:c("editor.alerts.example.subtitle"),icon:"doorbell",color:"orange",button_text:c("editor.alerts.example.button"),timeout:30,flash:!0}),s=$e(!1),i=$e(""),l=$(()=>m.inventory.screens.filter(R=>zn(R)&&R.online));async function r(){s.value=!0,i.value="";try{const{screen:R,...L}=n,D=await Om(R,L),M=m.inventory.screens.find(te=>te.id===R)?.name,Y=R==="all"?c("editor.alerts.try.sent_all",D.sent):M?c("editor.alerts.try.sent_to",{name:M}):c("editor.alerts.try.sent_one");i.value=D.sent?[Y,D.skipped?c("editor.alerts.try.skipped",D.skipped):"",D.unusable?.length?c("editor.alerts.try.left_empty",{fields:D.unusable.join(", ")}):""].filter(Boolean).join(" "):c("editor.alerts.try.nothing",{version:t.value?.min_firmware||"0.2.31"})}catch(R){i.value=R.message}finally{s.value=!1}}const u=$(()=>m.inventory.icons),f=$e(""),h=$e(""),p=R=>`"${String(R).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`,b=R=>R.type==="string"?/^[a-z][a-z0-9-]*$/.test(R.example)?R.example:p(R.example):R.example===!0?"true":R.example===!1?"false":String(R.example),v=$(()=>m.inventory.screens.filter(R=>R.alert_action)),y=$(()=>f.value||v.value[0]?.alert_action||""),I=$(()=>{const R=(t.value?.fields||[]).map(L=>` ${L.name}: ${b(L)}`);return`action: ${y.value||"esphome._show_alert"} +data: +${R.join(` +`)}`}),T=(R,L)=>p((t.value?.fields||[]).find(D=>D.name===R)?.example||L),k=$(()=>[`# ${c("editor.alerts.wait_yaml.comment")}`,"actions:",` - action: ${y.value||"esphome._show_alert"}`," data:",` title: ${T("title","Someone is at the door")}`,` subtitle: ${T("subtitle","Door 3, back")}`," icon: doorbell"," color: orange",` button_text: ${T("button_text","Coming")}`," timeout: 0"," flash: true"," - wait_for_trigger:"," - trigger: event",` event_type: ${t.value?.event||"esphome.screen_alert"}`," event_data:"," action: ok",' timeout: "00:05:00"'," - if:"," - condition: template",' value_template: "{{ wait.trigger is not none }}"'," then:"," - action: notify.notify"," data:",` message: ${p(c("editor.alerts.wait_yaml.message"))}`].join(` +`)),A=$(()=>{const R=(t.value?.fields||[]).map(D=>` ${D.name}: ${b(D)}`),L=t.value?.camera;return L&&R.push(` # ${L.name}: ${L.example} # a Guition shows its picture on the card`),`event: ${t.value?.broadcast?.show||"esp_screens_show_alert"} +event_data: +${R.join(` +`)}`}),S=$(()=>{if(!t.value||!u.value)return[];const R=h.value.trim().toLowerCase();return[...u.value.groups,{label:c("editor.alerts.icons.extra"),icons:t.value.extra_icons}].map(D=>({label:D.label,icons:D.icons.filter(M=>!R||M.name.includes(R)||(M.label||"").toLowerCase().includes(R))})).filter(D=>D.icons.length)}),U=$(()=>t.value?.suggested_icons?.find(R=>R.name==="doorbell")),C=$(()=>t.value?.colors?.find(R=>R.name==="orange")),K=R=>["string","int","bool"].includes(R)?c(`editor.alerts.fields.types.${R}`):R;function O(R){document.getElementById(R)?.scrollIntoView({behavior:"smooth",block:"start"})}const E=["alerts-try","alerts-screens","alerts-howto","alerts-all","alerts-fields","alerts-icons","alerts-colors","alerts-behaviour","alerts-events","alerts-tips"];return(R,L)=>{const D=Ws("i18n-t");return g(),_("div",Kw,[o("div",zw,[o("div",qw,[o("span",Yw,d(a(c)("editor.alerts.eyebrow")),1),o("h1",null,d(a(c)("editor.alerts.title")),1),ie(D,{keypath:"editor.alerts.intro",tag:"p",scope:"global"},{action:oe(()=>[...L[15]||(L[15]=[o("code",null,"show_alert",-1)])]),_:1})]),o("button",{type:"button",class:"btn quiet",id:"close-alerts",onClick:L[0]||(L[0]=M=>a(He)(""))},d(a(c)("editor.common.back")),1)]),t.value?(g(),_(q,{key:1},[o("div",Jw,[o("div",Xw,[o("div",{class:"alert-mock-card",style:Ue(C.value?{background:C.value.color}:void 0)},[o("span",Zw,d(U.value?a(Ae)(U.value.cp):""),1),o("strong",Qw,d(a(c)("editor.alerts.example.title")),1),o("span",ek,d(a(c)("editor.alerts.example.subtitle")),1),o("span",tk,d(a(c)("editor.alerts.example.button")),1)],4)]),o("nav",{class:"alerts-nav","aria-label":a(c)("editor.alerts.sections")},[(g(),_(q,null,me(E,M=>o("button",{key:M,type:"button","data-jump":M,onClick:Y=>O(M)},d(a(c)(`editor.alerts.nav.${M.slice(7)}`)),9,sk)),64))],8,nk)]),o("section",ik,[o("h2",null,d(a(c)("editor.alerts.nav.try")),1),o("p",null,d(a(c)("editor.alerts.try.text")),1),o("form",{class:"try-grid",onSubmit:Ot(r,["prevent"])},[o("div",ok,[o("label",lk,d(a(c)("editor.alerts.try.screen")),1),Te(o("select",{id:"try-screen","onUpdate:modelValue":L[1]||(L[1]=M=>n.screen=M)},[o("option",ak,d(a(c)("editor.alerts.try.all",{ready:l.value.length})),1),(g(!0),_(q,null,me(a(m).inventory.screens,M=>(g(),_("option",{key:M.id,value:M.id,disabled:!a(zn)(M)||!M.online},d(a(zn)(M)&&M.online?M.name:a(c)("editor.alerts.try.not_ready",{name:M.name})),9,rk))),128))],512),[[Wn,n.screen]])]),o("div",ck,[o("label",uk,d(a(c)("editor.alerts.try.title")),1),Te(o("input",{id:"try-title","onUpdate:modelValue":L[2]||(L[2]=M=>n.title=M),maxlength:"64"},null,512),[[Xe,n.title]])]),o("div",dk,[o("label",fk,d(a(c)("editor.alerts.try.subtitle")),1),Te(o("input",{id:"try-subtitle","onUpdate:modelValue":L[3]||(L[3]=M=>n.subtitle=M),maxlength:"240"},null,512),[[Xe,n.subtitle]])]),o("div",pk,[o("label",hk,d(a(c)("editor.alerts.try.icon")),1),Te(o("input",{id:"try-icon","onUpdate:modelValue":L[4]||(L[4]=M=>n.icon=M),list:"try-icons",placeholder:"doorbell"},null,512),[[Xe,n.icon]]),o("datalist",mk,[(g(!0),_(q,null,me(t.value.suggested_icons,M=>(g(),_("option",{key:M.name,value:M.name},d(M.label||M.name),9,bk))),128))])]),o("div",vk,[o("label",gk,d(a(c)("editor.alerts.try.color")),1),Te(o("select",{id:"try-color","onUpdate:modelValue":L[5]||(L[5]=M=>n.color=M)},[o("option",_k,d(a(c)("editor.alerts.white")),1),(g(!0),_(q,null,me(t.value.colors,M=>(g(),_("option",{key:M.name,value:M.name},d(M.label),9,yk))),128))],512),[[Wn,n.color]])]),o("div",wk,[o("label",kk,d(a(c)("editor.alerts.try.button")),1),Te(o("input",{id:"try-button","onUpdate:modelValue":L[6]||(L[6]=M=>n.button_text=M),maxlength:"16"},null,512),[[Xe,n.button_text]])]),o("div",$k,[o("label",xk,d(a(c)("editor.alerts.try.timeout")),1),Te(o("input",{id:"try-timeout","onUpdate:modelValue":L[7]||(L[7]=M=>n.timeout=M),type:"number",min:"0",max:"86400"},null,512),[[Xe,n.timeout,void 0,{number:!0}]])]),o("label",Sk,[Te(o("input",{type:"checkbox",id:"try-flash","onUpdate:modelValue":L[8]||(L[8]=M=>n.flash=M)},null,512),[[Qf,n.flash]]),o("span",null,[Me(d(a(c)("editor.alerts.try.flash")),1),o("small",null,d(a(c)("editor.alerts.try.flash_hint")),1)])]),o("div",Ck,[o("button",{type:"submit",class:"btn primary",id:"try-send",disabled:s.value||!l.value.length},d(s.value?a(c)("editor.alerts.try.sending"):a(c)("editor.alerts.try.send")),9,Tk),o("span",Ek,d(i.value),1)])],32)]),o("section",Ak,[o("h2",null,d(a(c)("editor.alerts.nav.screens")),1),ie(D,{keypath:"editor.alerts.screens.text",tag:"p",scope:"global"},{version:oe(()=>[o("code",Pk,d(t.value.min_firmware),1)]),_:1}),o("div",Ok,[a(m).inventory.screens.length?B("",!0):(g(),_("p",Ik,d(a(c)("editor.alerts.screens.none")),1)),(g(!0),_(q,null,me(a(m).inventory.screens,M=>(g(),_("div",{key:M.id,class:"alert-screen"},[o("div",Lk,[o("strong",null,d(M.name),1),o("span",{class:he(["chip",a(pn)(a(ls)(M),t.value.min_firmware)&&M.alert_action?"good":"update"])},d(a(pn)(a(ls)(M),t.value.min_firmware)&&M.alert_action?a(c)("editor.alerts.screens.ready",{version:M.firmware}):M.alert_action?a(c)("editor.alerts.screens.update",{version:M.firmware||a(c)("editor.common.unknown")}):a(c)("editor.alerts.screens.unknown")),3)]),(g(!0),_(q,null,me([[a(c)("editor.alerts.screens.show"),M.alert_action],[a(c)("editor.alerts.screens.dismiss"),M.dismiss_action]],([Y,te])=>(g(),_("div",{key:Y,class:"copy-line"},[o("span",Mk,d(Y),1),o("code",null,d(te||"esphome._show_alert"),1),te?(g(),_("button",{key:0,type:"button",class:"btn quiet mini",onClick:ye=>a(Lt)(te,void 0,"action_name")},d(a(c)("editor.common.copy")),9,Rk)):B("",!0)]))),128))]))),128))])]),o("section",Nk,[o("h2",null,d(a(c)("editor.alerts.nav.howto")),1),o("ol",Fk,[ie(D,{keypath:"editor.alerts.howto.add",tag:"li",scope:"global"},{add:oe(()=>[o("b",null,d(a(c)("editor.alerts.howto.add_bold")),1)]),esphome:oe(()=>[...L[16]||(L[16]=[o("b",null,"ESPHome",-1)])]),device:oe(()=>[o("i",null,d(a(c)("editor.alerts.howto.device")),1)]),_:1}),ie(D,{keypath:"editor.alerts.howto.fields",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.howto.fields_bold")),1)]),empty:oe(()=>[...L[17]||(L[17]=[o("code",null,'""',-1)])]),zero:oe(()=>[...L[18]||(L[18]=[o("code",null,"0",-1)])]),_:1}),ie(D,{keypath:"editor.alerts.howto.yaml",tag:"li",scope:"global"},{edit:oe(()=>[o("b",null,d(a(c)("editor.alerts.edit_yaml")),1)]),_:1})]),o("div",Dk,[o("label",Uk,d(a(c)("editor.alerts.howto.example_for")),1),Te(o("select",{id:"alerts-example-screen","onUpdate:modelValue":L[9]||(L[9]=M=>f.value=M),style:{"max-width":"360px"}},[(g(!0),_(q,null,me(v.value,M=>(g(),_("option",{key:M.id,value:M.alert_action},d(M.name),9,jk))),128)),v.value.length?B("",!0):(g(),_("option",Hk,d(a(c)("editor.alerts.howto.no_screen")),1))],512),[[Wn,f.value]])]),o("div",Vk,[o("pre",Wk,d(I.value),1),o("button",{type:"button",class:"btn quiet mini",id:"alerts-example-copy",onClick:L[10]||(L[10]=M=>a(Lt)(I.value,void 0,"yaml"))},d(a(c)("editor.alerts.copy_yaml")),1)])]),o("section",Bk,[o("h2",null,d(a(c)("editor.alerts.all.title")),1),ie(D,{keypath:"editor.alerts.all.text",tag:"p",scope:"global"},{show:oe(()=>[o("code",Kk,d(t.value.broadcast?.show||"esp_screens_show_alert"),1)]),dismiss:oe(()=>[o("code",zk,d(t.value.broadcast?.dismiss||"esp_screens_dismiss_alert"),1)]),event:oe(()=>[o("b",null,d(a(c)("editor.alerts.all.event")),1)]),edit:oe(()=>[o("b",null,d(a(c)("editor.alerts.edit_yaml")),1)]),_:1}),o("div",qk,[o("pre",Yk,d(A.value),1),o("button",{type:"button",class:"btn quiet mini",id:"alerts-all-copy",onClick:L[11]||(L[11]=M=>a(Lt)(A.value,void 0,"yaml"))},d(a(c)("editor.alerts.copy_yaml")),1)])]),o("section",Gk,[o("h2",null,d(a(c)("editor.alerts.nav.fields")),1),o("p",null,d(a(c)("editor.alerts.fields.text")),1),o("div",Jk,[o("table",Xk,[o("tr",null,[o("th",null,d(a(c)("editor.alerts.fields.field")),1),o("th",null,d(a(c)("editor.alerts.fields.type")),1),o("th",null,d(a(c)("editor.alerts.fields.what")),1),o("th",null,d(a(c)("editor.alerts.fields.example")),1),o("th",null,d(a(c)("editor.alerts.fields.limit")),1)]),(g(!0),_(q,null,me(t.value.fields,M=>(g(),_("tr",{key:M.name},[o("td",null,[o("code",null,d(M.name),1),o("small",null,d(M.label),1)]),o("td",null,d(K(M.type)),1),o("td",null,d(M.help),1),o("td",null,[o("code",null,d(typeof M.example=="string"?M.example:String(M.example)),1)]),o("td",null,d(t.value.limits.cyd[M.name]?a(c)("editor.alerts.fields.bytes",{cyd:t.value.limits.cyd[M.name],guition:t.value.limits.guition[M.name]}):M.type==="int"?a(c)("editor.alerts.fields.seconds"):"—"),1)]))),128)),t.value.camera?(g(),_("tr",Zk,[o("td",null,[o("code",null,d(t.value.camera.name),1),o("small",null,d(t.value.camera.label),1)]),o("td",null,d(a(c)("editor.alerts.fields.types.entity")),1),o("td",null,d(t.value.camera.help),1),o("td",null,[o("code",null,d(t.value.camera.example),1)]),o("td",null,d(a(c)("editor.alerts.fields.camera_limit")),1)])):B("",!0)])])]),o("section",Qk,[o("h2",null,d(a(c)("editor.alerts.nav.icons")),1),ie(D,{keypath:"editor.alerts.icons.text",tag:"p",scope:"global"},{field:oe(()=>[...L[19]||(L[19]=[o("code",null,"icon",-1)])]),example:oe(()=>[...L[20]||(L[20]=[o("code",null,"doorbell",-1)])]),mdi:oe(()=>[...L[21]||(L[21]=[o("code",null,"mdi:doorbell",-1)])]),hex:oe(()=>[...L[22]||(L[22]=[o("code",null,"F12E6",-1)])]),_:1}),o("p",e3,d(a(c)("editor.alerts.icons.handy")),1),o("div",t3,[(g(!0),_(q,null,me(t.value.suggested_icons,M=>(g(),_("button",{key:M.name,type:"button",class:"chip",onClick:Y=>a(Lt)(M.name,void 0,"icon_name")},[o("span",s3,d(a(Ae)(M.cp)),1),o("code",null,d(M.name),1)],8,n3))),128))]),o("div",i3,[o("label",o3,d(a(c)("editor.alerts.icons.search_label")),1),Te(o("input",{id:"alerts-icon-search","onUpdate:modelValue":L[12]||(L[12]=M=>h.value=M),type:"search",placeholder:a(c)("editor.alerts.icons.search"),autocomplete:"off"},null,8,l3),[[Xe,h.value]])]),o("div",a3,[(g(!0),_(q,null,me(S.value,M=>(g(),_("div",{key:M.label,class:"field"},[o("p",r3,d(M.label)+" · "+d(M.icons.length),1),o("div",c3,[(g(!0),_(q,null,me(M.icons,Y=>(g(),_("button",{key:Y.name,type:"button",class:"alert-icon",title:a(c)("editor.alerts.icons.copy",{name:Y.name}),onClick:te=>a(Lt)(Y.name,void 0,"icon_name")},[o("span",d3,d(a(Ae)(Y.cp)),1),o("code",null,d(Y.name),1),Y.label?(g(),_("small",f3,d(Y.label),1)):B("",!0)],8,u3))),128))])]))),128)),S.value.length?B("",!0):(g(),_("p",p3,d(a(c)("editor.alerts.icons.none",{query:h.value,fallback:t.value.fallback_icon})),1))])]),o("section",h3,[o("h2",null,d(a(c)("editor.alerts.nav.colors")),1),ie(D,{keypath:"editor.alerts.colors.text",tag:"p",scope:"global"},{field:oe(()=>[...L[23]||(L[23]=[o("code",null,"color",-1)])]),_:1}),o("div",m3,[o("button",{type:"button",class:"swatch",onClick:L[13]||(L[13]=M=>a(Lt)("",void 0,"empty_color"))},[L[25]||(L[25]=o("i",{style:{background:"#ffffff"}},null,-1)),o("span",null,[L[24]||(L[24]=o("code",null,"empty",-1)),o("small",null,d(a(c)("editor.alerts.white")),1)])]),(g(!0),_(q,null,me(t.value.colors,M=>(g(),_("button",{key:M.name,type:"button",class:"swatch",onClick:Y=>a(Lt)(M.name,void 0,"color_name")},[o("i",{style:Ue({background:M.color})},null,4),o("span",null,[o("code",null,d(M.name),1),o("small",null,d(M.label)+" · "+d(M.color),1)])],8,b3))),128))])]),o("section",v3,[o("h2",null,d(a(c)("editor.alerts.nav.behaviour")),1),o("ul",g3,[ie(D,{keypath:"editor.alerts.behaviour.wakes",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.wakes_bold")),1)]),_:1}),ie(D,{keypath:"editor.alerts.behaviour.on",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.on_bold")),1)]),_:1}),ie(D,{keypath:"editor.alerts.behaviour.timeout",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.timeout_bold")),1)]),zero:oe(()=>[...L[26]||(L[26]=[o("code",null,"timeout: 0",-1)])]),minute:oe(()=>[...L[27]||(L[27]=[o("code",null,"timeout: 60",-1)])]),_:1}),ie(D,{keypath:"editor.alerts.behaviour.blinking",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.blinking_bold")),1)]),flash:oe(()=>[...L[28]||(L[28]=[o("code",null,"flash: true",-1)])]),_:1}),ie(D,{keypath:"editor.alerts.behaviour.replacing",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.replacing_bold")),1)]),replaced:oe(()=>[...L[29]||(L[29]=[o("code",null,"replaced",-1)])]),_:1}),ie(D,{keypath:"editor.alerts.behaviour.closing",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.closing_bold")),1)]),dismiss:oe(()=>[...L[30]||(L[30]=[o("code",null,"dismiss_alert",-1)])]),_:1}),ie(D,{keypath:"editor.alerts.behaviour.beside",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.beside_bold")),1)]),_:1})])]),o("section",_3,[o("h2",null,d(a(c)("editor.alerts.nav.events")),1),ie(D,{keypath:"editor.alerts.events.text",tag:"p",scope:"global"},{event:oe(()=>[o("code",y3,d(t.value.event),1)]),action:oe(()=>[...L[31]||(L[31]=[o("code",null,"action",-1)])]),title:oe(()=>[...L[32]||(L[32]=[o("code",null,"title",-1)])]),screen:oe(()=>[...L[33]||(L[33]=[o("code",null,"screen",-1)])]),device_id:oe(()=>[...L[34]||(L[34]=[o("code",null,"device_id",-1)])]),_:1}),o("div",w3,[o("table",k3,[o("tr",null,[L[35]||(L[35]=o("th",null,"action",-1)),o("th",null,d(a(c)("editor.alerts.events.when")),1)]),(g(!0),_(q,null,me(t.value.endings,M=>(g(),_("tr",{key:M.action},[o("td",null,[o("code",null,d(M.action),1)]),o("td",null,d(M.label),1)]))),128))])]),o("p",$3,d(a(c)("editor.alerts.events.wait")),1),o("div",x3,[o("pre",S3,d(k.value),1),o("button",{type:"button",class:"btn quiet mini",id:"alerts-wait-copy",onClick:L[14]||(L[14]=M=>a(Lt)(k.value,void 0,"yaml"))},d(a(c)("editor.alerts.copy_yaml")),1)])]),o("section",C3,[o("h2",null,d(a(c)("editor.alerts.nav.tips")),1),o("ul",T3,[ie(D,{keypath:"editor.alerts.tips.color",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.tips.color_bold")),1)]),_:1}),ie(D,{keypath:"editor.alerts.tips.short",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.tips.short_bold")),1)]),_:1}),ie(D,{keypath:"editor.alerts.tips.button",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.tips.button_bold")),1)]),_:1}),ie(D,{keypath:"editor.alerts.tips.resolve",tag:"li",scope:"global"},{dismiss:oe(()=>[...L[36]||(L[36]=[o("code",null,"dismiss_alert",-1)])]),_:1}),ie(D,{keypath:"editor.alerts.tips.every",tag:"li",scope:"global"},{event:oe(()=>[o("code",null,d(t.value.broadcast?.show||"esp_screens_show_alert"),1)]),screen:oe(()=>[...L[37]||(L[37]=[o("code",null,"screen",-1)])]),_:1}),ie(D,{keypath:"editor.alerts.tips.claude",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.tips.claude_bold")),1)]),_:1})])])],64)):(g(),_("p",Gw,d(a(c)("editor.alerts.loading")),1))])}}}),A3={class:"panel",id:"override-dialog"},P3={class:"panel-head"},O3={class:"tx"},I3={class:"eyebrow"},L3={id:"override-title"},M3={class:"notice"},R3={class:"mdi"},N3={class:"file-row"},F3={id:"override-file"},D3={class:"yaml-editor",id:"yaml-editor-wrap"},U3=["aria-label"],j3={class:"actions"},H3={id:"override-count",class:"hint"},V3={class:"actions"},W3=["disabled"],B3=["disabled"],K3=`# Hardware-specific changes for this screen. +# This file is kept when the shared firmware package updates. +# Do not add esphome:, api:, ota:, wifi: or packages: here. + +# Example: a CYD with the ST7789V display controller. +# "!extend" changes the display the shared package already defines; +# a bare id would add a second, incomplete display and fail the build. +display: + - id: !extend my_display + model: ST7789V +`,z3=Le({__name:"OverrideView",setup(e){const t=$(()=>m.overrideProfile),n=$e(""),s=$e(""),i=$e(!1),l=$e(c("editor.common.loading")),r=$e(""),u=$e(!1),f=$e(null),h=$e(null),p=$(()=>n.value.split(` +`).length),b=$(()=>Array.from({length:p.value},(O,E)=>E+1).join(` +`)),v=$(()=>`${c("editor.override.characters",n.value.length)} · ${c("editor.override.lines",p.value)}`);let y=!0;function I(O,E=""){l.value=O,r.value=E}async function T(){if(!t.value){I(c("editor.override.no_profile"),"error");return}I(c("editor.common.loading"));try{const O=await Ft(`firmware/profiles/${encodeURIComponent(t.value)}/override`);s.value=O.override_file,i.value=!!O.attached,n.value=O.exists&&O.content!==`{} +`?O.content:"",I(c(O.attached?"editor.override.attached":"editor.override.not_attached"))}catch(O){I(O.message,"error")}}async function k(O=!1){if(!(!t.value||u.value)){u.value=!0,I(c("editor.override.saving"));try{const E=await ft(`firmware/profiles/${encodeURIComponent(t.value)}/override`,"PUT",{content:n.value});if(s.value=E.override_file,i.value=!0,!O){I(c("editor.override.saved"),"ok"),Ce(c("editor.override.saved_toast"));return}I(c("editor.override.checking")),await ft("firmware/jobs","POST",{file:t.value,action:"validate"}),A()}catch(E){I(E.message,"error")}finally{u.value=!1}}}function A(){const O=Date.now(),E=t.value,R=async()=>{if(!(!y||t.value!==E))try{const L=await Ft("firmware"),D=L.job;if(D&&D.file===E&&D.state==="running")I(D.stage?c("editor.override.checking_stage",{stage:D.stage}):c("editor.override.checking_profile"));else if(D&&D.file===E&&D.state==="success"){I(c("editor.override.valid"),"ok");return}else if(D&&D.file===E&&D.state==="failed"){const M=(L.logs||[]).filter(Y=>/error|failed/i.test(Y)).pop();I(M||c("editor.override.rejected"),"error");return}Date.now()-O<72e5&&setTimeout(R,1200)}catch(L){I(L.message,"error")}};R()}function S(){(!n.value.trim()||confirm(c("editor.override.confirm_example")))&&(n.value=K3,I(c("editor.override.example_loaded")),f.value?.focus())}function U(){(!n.value.trim()||confirm(c("editor.override.confirm_clear")))&&(n.value="",I(c("editor.override.cleared")),f.value?.focus())}function C(O){const E=f.value;if(O.key==="Tab"){O.preventDefault();const R=E.selectionStart,L=E.selectionEnd;E.setRangeText(" ",R,L,"end"),n.value=E.value}else(O.ctrlKey||O.metaKey)&&O.key.toLowerCase()==="s"&&(O.preventDefault(),k(!1))}function K(){h.value&&f.value&&(h.value.scrollTop=f.value.scrollTop)}return An(T),rs(()=>{y=!1}),(O,E)=>(g(),_("div",A3,[o("div",P3,[o("div",O3,[o("span",I3,d(a(c)("editor.override.eyebrow")),1),o("h1",L3,d(a(m).overrideFriendly?a(c)("editor.override.title_named",{name:a(m).overrideFriendly}):a(c)("editor.override.title")),1),o("p",null,d(a(c)("editor.override.intro")),1)]),o("button",{type:"button",class:"btn quiet",id:"close-override",onClick:E[0]||(E[0]=R=>a(He)(""))},d(a(c)("editor.common.back")),1)]),o("div",M3,[o("span",R3,d(a(Ae)("F0493")),1),o("div",null,[o("strong",null,d(a(c)("editor.override.safe_title")),1),o("span",null,d(a(c)("editor.override.safe_text")),1)])]),o("div",N3,[o("code",F3,d(s.value||t.value||""),1),o("span",{id:"override-state",class:he(["chip",{good:i.value}])},d(i.value?a(c)("editor.override.active"):a(c)("editor.override.ready")),3)]),o("div",D3,[o("div",{ref_key:"gutter",ref:h,class:"yaml-gutter",id:"override-gutter","aria-hidden":"true"},d(b.value),513),Te(o("textarea",{ref_key:"editor",ref:f,id:"override-editor","onUpdate:modelValue":E[1]||(E[1]=R=>n.value=R),spellcheck:"false",autocapitalize:"off",autocomplete:"off",autocorrect:"off","aria-label":a(c)("editor.override.editor_label"),placeholder:`# Example +display: + - id: !extend my_display + model: ST7789V`,onKeydown:C,onScroll:K},null,40,U3),[[Xe,n.value]])]),o("div",j3,[o("button",{type:"button",class:"btn quiet mini",id:"override-example",onClick:S},d(a(c)("editor.override.use_example")),1),o("button",{type:"button",class:"btn quiet mini",id:"override-empty",onClick:U},d(a(c)("editor.override.clear")),1),o("span",H3,d(v.value),1)]),o("p",{id:"override-status",class:he(["status-line",r.value]),role:"status"},d(l.value),3),o("div",V3,[o("button",{type:"button",class:"btn quiet",id:"override-check",disabled:u.value||!t.value,onClick:E[2]||(E[2]=R=>k(!0))},d(a(c)("editor.override.save_check")),9,W3),o("button",{type:"button",class:"btn primary",id:"override-save",disabled:u.value||!t.value,onClick:E[3]||(E[3]=R=>k(!1))},d(a(c)("editor.override.save")),9,B3)])]))}}),q3={class:"main"},Y3=Le({__name:"App",setup(e){const t=$(()=>xt.value==="#settings"?g2:xt.value==="#new-screen"?mw:xt.value==="#firmware"?Bw:xt.value==="#alerts"?E3:xt.value==="#override"?z3:ht.value&&m.layout?y1:$1);function n(s){(s.metaKey||s.ctrlKey)&&s.key.toLowerCase()==="k"&&(s.preventDefault(),m.palette=!m.palette)}return An(()=>document.addEventListener("keydown",n)),rs(()=>document.removeEventListener("keydown",n)),(s,i)=>(g(),_("div",{class:he(["app",{dragging:a(m).drag.active}])},[ie(Mb),o("main",q3,[(g(),it(Wd(t.value)))]),ie(Nb),ie(Yb)],2))}});Zh().finally(()=>{lp(Y3).use(cs).mount("#app"),Zm()}); diff --git a/screen_manager/app/static/assets/index-DGMtqWTE.css b/screen_manager/app/static/assets/index-DGMtqWTE.css new file mode 100644 index 0000000..05b5223 --- /dev/null +++ b/screen_manager/app/static/assets/index-DGMtqWTE.css @@ -0,0 +1 @@ +:root{color-scheme:light dark;--ground: #f5f6f8;--surface: #ffffff;--surface-2: #f9fafb;--line: #e4e7ec;--line-strong: #d3d8e0;--ink: #16181d;--ink-2: #565d6b;--muted: #7a8290;--accent: #2f63f0;--accent-ink: #ffffff;--accent-soft: #edf2ff;--good: #1e9a5f;--good-soft: #e6f6ee;--warn: #b56d00;--warn-soft: #fff3df;--danger: #c6372e;--danger-soft: #fdecea;--seg: #eef0f3;--shadow: 0 12px 40px rgba(20, 24, 40, .12), 0 1px 2px rgba(20, 24, 40, .06);--code-bg: #f1f3f6;--ui-font: -apple-system, BlinkMacSystemFont, system-ui, "SF Pro Text", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace}@media(prefers-color-scheme:dark){:root{--ground: #0e1014;--surface: #161a21;--surface-2: #1b2029;--line: #262c37;--line-strong: #333b49;--ink: #e9ecf1;--ink-2: #b4bbc7;--muted: #8a93a3;--accent: #6d93ff;--accent-ink: #0b1633;--accent-soft: #1b2540;--good: #3fbf7f;--good-soft: #14302a;--warn: #e0a03a;--warn-soft: #302610;--danger: #f07167;--danger-soft: #3a1b19;--seg: #222834;--shadow: 0 16px 48px rgba(0, 0, 0, .55), 0 1px 2px rgba(0, 0, 0, .4);--code-bg: #12151b}}@font-face{font-family:Tile Icons;src:url(./tile-icons-DVbFlNHb.woff) format("woff");font-display:block}@font-face{font-family:Bar Roboto;font-weight:400;src:url(./bar-roboto-400-Dv8XhZ6y.woff) format("woff");font-display:block}@font-face{font-family:Bar Roboto;font-weight:500;src:url(./bar-roboto-500-CGWR3VLQ.woff) format("woff");font-display:block}*{box-sizing:border-box}html,body,#app{height:100%}body{margin:0;background:var(--ground);color:var(--ink);font:13px/1.45 var(--ui-font);-webkit-font-smoothing:antialiased;font-variant-numeric:tabular-nums}button,input,select,textarea{font:inherit;color:inherit}button{background:none;border:0;padding:0;cursor:pointer;border-radius:8px}button:disabled{opacity:.45;cursor:default}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input,select,textarea{background:var(--surface);border:1px solid var(--line-strong);border-radius:8px;padding:7px 10px;width:100%;color:var(--ink)}input::placeholder,textarea::placeholder{color:var(--muted)}select{appearance:auto}h1,h2,h3,h4{margin:0;font-weight:600;letter-spacing:-.01em}h1{font-size:20px;letter-spacing:-.02em}h2{font-size:15px}h3,h4{font-size:13px}p{margin:0}small,.hint{display:block;color:var(--muted);font-size:11.5px;font-weight:400;line-height:1.4}.hint.warn,small.warn{color:var(--warn)}code{font-family:var(--mono);font-size:.92em;background:var(--code-bg);padding:1px 6px;border-radius:5px;overflow-wrap:anywhere}pre{margin:0;padding:12px 14px;background:var(--code-bg);border:1px solid var(--line);border-radius:10px;overflow:auto;font:12px/1.5 var(--mono);color:var(--ink);white-space:pre-wrap;overflow-wrap:anywhere}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}.mdi{font-family:Tile Icons;font-style:normal;font-weight:400;line-height:1}[hidden]{display:none!important}.app{display:grid;grid-template-columns:232px minmax(0,1fr);height:100%;min-height:100vh}.app.dragging{user-select:none;-webkit-user-select:none;cursor:grabbing}.main{display:flex;flex-direction:column;min-width:0;min-height:0}.side{background:var(--surface);border-right:1px solid var(--line);display:flex;flex-direction:column;padding:14px 10px;gap:4px;min-height:0;overflow:auto;position:sticky;top:0;height:100vh}.brand{display:flex;align-items:center;gap:9px;padding:4px 8px 6px;font-weight:600;font-size:13px}.brand .mark{width:22px;height:22px;border-radius:6px;background:var(--ink);color:var(--surface);display:grid;place-items:center;font-size:14px;line-height:1}.conn{display:block;padding:0 8px 8px;font-size:11px;color:var(--muted)}.conn:before{content:"●";margin-right:6px;color:var(--warn)}.conn.online:before{color:var(--good)}.side .label{font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:10px 8px 4px}.nav-item{display:flex;align-items:center;gap:9px;width:100%;padding:7px 8px;border-radius:8px;text-align:left;color:var(--ink-2)}.nav-item:hover{background:var(--surface-2);color:var(--ink)}.nav-item[aria-current=true]{background:var(--seg);color:var(--ink);font-weight:500}.nav-item .dot{width:7px;height:7px;border-radius:50%;background:var(--good);flex:none}.nav-item .dot.off{background:var(--line-strong)}.nav-item .unsaved{width:7px;height:7px;border-radius:50%;background:var(--warn);flex:none}.nav-item .txt{display:grid;min-width:0;flex:1}.nav-item .txt small{font-size:11px;color:var(--muted);font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-item .mdi{font-size:16px;width:18px;text-align:center;color:var(--muted)}.nav-item .plus{width:18px;text-align:center;font-size:14px}.nav-item.ghost{color:var(--muted)}.nav-item.ghost:hover{color:var(--accent);background:var(--accent-soft)}.pill{font-size:10.5px;font-weight:600;padding:2px 7px;border-radius:999px;background:var(--warn-soft);color:var(--warn);flex:none}.side .spacer{flex:1}.screen-item{display:grid;gap:4px}.screen-update{display:grid;gap:6px;padding:2px 8px 8px 24px}.screen-update.available{grid-template-columns:1fr auto;align-items:center}.screen-update.available:has(.screen-host){grid-template-columns:1fr}.screen-update small.failed{color:var(--danger)}.screen-host{display:flex;gap:6px;align-items:center}.screen-host input{padding:5px 8px;font-size:12px}.pending{margin:4px 0;padding:10px;border:1px dashed var(--line-strong);border-radius:10px;display:grid;gap:6px}.pending strong{font-size:12.5px}.pending-actions{display:flex;flex-wrap:wrap;gap:6px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 12px;border-radius:8px;font-weight:600;font-size:12.5px;white-space:nowrap}.btn.primary{background:var(--accent);color:var(--accent-ink)}.btn.primary:hover:not(:disabled){filter:brightness(1.06)}.btn.quiet{color:var(--ink-2);border:1px solid var(--line-strong);background:var(--surface)}.btn.quiet:hover:not(:disabled){background:var(--surface-2);color:var(--ink)}.btn.danger{color:var(--danger)}.btn.danger:hover:not(:disabled){background:var(--danger-soft)}.btn.mini{padding:4px 9px;font-size:11.5px}.btn.link{color:var(--accent);padding:0;font-weight:600}.icon-btn{width:30px;height:30px;display:grid;place-items:center;border-radius:8px;color:var(--ink-2);font-size:15px;flex:none}.icon-btn:hover{background:var(--seg);color:var(--ink)}.chip{display:inline-flex;align-items:center;gap:6px;padding:3px 9px;border-radius:999px;font-size:11.5px;font-weight:500;color:var(--ink-2);background:var(--surface-2);border:1px solid var(--line);white-space:nowrap}.chip .dot{width:6px;height:6px;border-radius:50%;background:var(--good);flex:none}.chip.off .dot{background:var(--line-strong)}.chip.dirty{color:var(--warn);background:var(--warn-soft);border-color:transparent}.chip.sent,.chip.good{color:var(--good);background:var(--good-soft);border-color:transparent}.chip.update{color:var(--warn);background:var(--warn-soft);border-color:transparent}.seg{display:inline-flex;padding:2px;background:var(--seg);border-radius:8px;gap:2px}.seg button{padding:4px 11px;border-radius:6px;font-size:12px;font-weight:500;color:var(--ink-2);white-space:nowrap}.seg button[aria-pressed=true]{background:var(--surface);color:var(--ink);box-shadow:0 1px 2px #14182824}.seg.wrap{flex-wrap:wrap}.seg button:hover:not(:disabled):not([aria-pressed=true]){color:var(--ink)}.spin{display:inline-block;width:14px;height:14px;border:2px solid var(--line-strong);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite;flex:none}.spin.small{width:11px;height:11px;border-width:1.5px}@keyframes spin{to{transform:rotate(360deg)}}.switch{width:34px;height:20px;border-radius:10px;background:var(--line-strong);position:relative;flex:none;padding:0}.switch:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0003;transition:left .12s}.switch[aria-checked=true]{background:var(--accent)}.switch[aria-checked=true]:after{left:16px}.switch.unknown:after{left:9px;opacity:.6}@media(prefers-reduced-motion:reduce){.switch:after,.drawer,.spin{transition:none;animation:none}}.main-head{display:flex;align-items:center;gap:12px;padding:0 18px;min-height:52px;border-bottom:1px solid var(--line);background:var(--surface);position:sticky;top:0;z-index:4}.main-head h1{font-size:15px}.main-head .eyebrow{font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.head-right{margin-left:auto;display:flex;align-items:center;gap:8px;position:relative}.menu{position:absolute;top:38px;right:0;min-width:210px;background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);padding:6px;display:grid;z-index:6}.menu button{text-align:left;padding:7px 10px;border-radius:7px;color:var(--ink);display:flex;justify-content:space-between;gap:12px;width:100%}.menu button small{color:var(--muted);display:inline}.menu button:hover:not(:disabled){background:var(--surface-2)}.body{position:relative;display:grid;grid-template-columns:minmax(0,1fr) 300px;flex:1;min-height:0;overflow:hidden}.canvas{overflow:auto;padding:22px 22px 26px;min-width:0}.canvas-head{display:flex;align-items:baseline;gap:12px;margin-bottom:14px;color:var(--muted);font-size:12px;flex-wrap:wrap}.canvas-head b{color:var(--ink);font-weight:600;font-size:13px}.canvas-head .warn{color:var(--warn)}.pages{display:flex;gap:18px;align-items:flex-start}.page{flex:0 0 292px;display:grid;gap:8px}.page-label{display:flex;justify-content:space-between;align-items:center;font-size:11.5px;color:var(--muted);padding:0 4px;min-height:22px}.page-label .btn.mini{color:var(--muted)}.page-label .btn.mini:hover{color:var(--danger);background:var(--danger-soft)}.page.ghost .device{display:grid;place-items:center;border:1.5px dashed var(--line-strong);background:transparent;color:var(--muted);font-weight:500;cursor:pointer}.page.ghost .device:hover,.page.ghost .device:focus-visible{color:var(--accent);border-color:var(--accent)}.page.ghost .device.drop{color:var(--accent);border-color:var(--accent);background:var(--accent-soft)}.page.ghost.disabled .device{opacity:.5;cursor:default}.device{background:#e7e7e7;border-radius:18px;padding:10px;display:grid;grid-template-rows:auto minmax(0,1fr);gap:8px;color:#1b1b1b;aspect-ratio:1 / 1}.device.cyd{aspect-ratio:4 / 3}.device.wide{aspect-ratio:5 / 3}.bar-wrap{cursor:pointer;border-radius:8px;padding:0 2px}.bar-wrap:hover{background:#dedede}.bar-wrap.selected{outline:2px solid var(--accent);outline-offset:1px}.bar-wrap svg{display:block;width:100%;height:auto}.tiles{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:minmax(0,1fr);gap:8px;min-height:0}.tile{position:relative;background:#fff;border:1px solid #dcdcdc;border-radius:12px;padding:8px 9px;display:flex;flex-direction:column;justify-content:space-between;gap:4px;min-height:0;cursor:pointer;text-align:left;overflow:hidden;color:#1b1b1b;touch-action:manipulation}.tile:hover{border-color:#b9c4d3}.tile.chosen{outline:2px solid var(--accent);outline-offset:1px}.tile.wide{grid-column:span 2;flex-direction:row;align-items:center;gap:8px}.tile.bare{background:transparent;border-style:dashed;border-color:#c3c9d0}.tile.placeholder{opacity:.55;border:2px dashed var(--accent);background:var(--accent-soft);cursor:default}.tile .ic{font-size:18px;line-height:1;color:#1b1b1b;flex:none}.tile .lead{display:grid;gap:2px;min-width:0;flex:1;align-content:end}.tile.wide .lead{display:flex;align-items:center;gap:8px;align-content:initial}.tile .tx{display:grid;min-width:0;gap:1px}.tile .head{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.tile .head.top{flex:none}.tile .nm{font-size:11.5px;font-weight:600;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tile .st{font-size:10.5px;color:#5a5f66;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.device.cyd .tile{padding:6px 7px}.device.cyd .tile .nm{font-size:10.5px}.device.cyd .tile .ic{font-size:15px}.device.cyd .tile .head{gap:6px}.device.cyd .tile:has(>.mini-slider){padding-block:4px;gap:3px}.device.cyd .tile .mini-slider{height:8px}.tile .mini-slider{height:10px;border-radius:5px;background:linear-gradient(to right,#ffbf38 60%,#fff1d3 60%);flex:none;width:100%}.tile.wide .mini-slider{width:70px}.tile .ctl{flex:none;display:flex;align-items:center;gap:4px;color:#1b1b1b}.tile .tog{width:30px;height:17px;border-radius:9px;background:#2196f3;position:relative}.tile .tog:after{content:"";position:absolute;top:2px;right:2px;width:13px;height:13px;border-radius:50%;background:#fff}.tile .tog.off{background:#c9ccd1}.tile .tog.off:after{right:auto;left:2px}.tile .ic.lit{color:#d9930f}.tile .ic.thumb{width:28px;height:28px;border-radius:7px;background:#d7dbe1;display:grid;place-items:center;font-size:15px;color:#5a5f66}.tile.full .ic.thumb{width:54px;height:54px;border-radius:12px;font-size:26px}.device.cyd .tile .ic.thumb{width:22px;height:22px;font-size:12px}.tile .big{font-size:19px;font-weight:600;letter-spacing:-.02em;line-height:1.05;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tile .big small{display:inline;font-size:10.5px;font-weight:500;color:#5a5f66;margin-left:2px}.device.cyd .tile .big{font-size:16px}.tile .range{width:56px;height:14px;border-radius:7px;background:linear-gradient(to right,#2196f3 35%,#d3e8fb 35%)}.tile .key{height:20px;min-width:22px;padding:0 5px;border-radius:6px;background:#eceef1;display:grid;place-items:center;font-size:12px}.tile .stp{display:flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:10px;background:#eceef1;font-size:11px;font-weight:600}.tile .stp .mdi{font-size:12px}.tile .run{height:20px;padding:0 9px;border-radius:10px;background:#eceef1;font-size:11px;font-weight:600;line-height:20px}.tile .remove{position:absolute;top:5px;right:5px;width:22px;height:22px;border-radius:50%;background:#ffffffd9;color:#5a5f66;border:1px solid #dcdcdc;font-size:10px;line-height:1;display:grid;place-items:center;opacity:0;transition:opacity .12s}.tile:hover .remove,.tile:focus-within .remove{opacity:1}.tile .remove:hover{color:var(--danger);border-color:#e7b4b0;background:#fff}@media(hover:none){.tile .remove{opacity:1}}.tile .clockface{width:46px;height:46px;margin:auto}.tile.wide .clockface{margin:0;flex:none}.cell{min-height:0;border:1px dashed #cfd4da;border-radius:12px;background:transparent;color:#a3abb5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;font-weight:500;cursor:pointer;padding:6px}.cell span{font-size:18px;line-height:1}.cell small{font-size:10.5px;color:inherit}.cell:hover,.cell:focus-visible{border-color:#9eb6cf;color:#4b5563;background:#f6f7f9}.cell.insert-here{border:2px dashed var(--accent);color:var(--accent);background:var(--accent-soft)}.drag-ghost{position:fixed;left:0;top:0;pointer-events:none;z-index:50;opacity:.92;box-shadow:var(--shadow);border-radius:12px}.library{border-left:1px solid var(--line);background:var(--surface);display:flex;flex-direction:column;min-height:0}.lib-head{padding:14px 14px 10px;display:grid;gap:10px;border-bottom:1px solid var(--line)}.lib-title{display:flex;align-items:baseline;justify-content:space-between;font-weight:600;gap:8px}.lib-title small{color:var(--muted);font-weight:400;font-size:11.5px}.filters{display:flex;gap:6px;overflow-x:auto;scrollbar-width:none;padding-bottom:2px}.filters::-webkit-scrollbar{display:none}.filters button{flex:none;display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:999px;font-size:11.5px;font-weight:500;color:var(--ink-2);background:var(--surface-2);border:1px solid var(--line)}.filters button[aria-pressed=true]{background:var(--ink);color:var(--surface);border-color:var(--ink)}.filters .domain-icon{width:16px;height:16px;font-size:11px;border-radius:50%;display:grid;place-items:center}.lib-list{overflow:auto;padding:8px;display:grid;gap:2px;align-content:start;flex:1}.ent{display:flex;align-items:center;gap:10px;padding:8px;border-radius:9px;width:100%;text-align:left;cursor:grab;touch-action:manipulation}.ent:hover:not(:disabled){background:var(--surface-2)}.ent:disabled{opacity:.55;cursor:default}.ent .av{width:30px;height:30px;border-radius:9px;display:grid;place-items:center;font-size:17px;flex:none}.ent .tx{display:grid;min-width:0;flex:1}.ent .tx b{font-weight:500;font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ent .tx small{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ent .add{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;color:var(--accent);background:var(--accent-soft);font-size:15px;font-weight:600;flex:none}.ent .add.done{color:var(--good);background:var(--good-soft);font-size:12px}.lib-foot{padding:10px 14px;border-top:1px solid var(--line);font-size:11.5px;color:var(--muted)}.domain-icon{display:inline-grid;place-items:center;border-radius:50%;font-weight:500}.drawer{position:absolute;top:0;right:0;bottom:0;width:360px;max-width:100%;background:var(--surface);border-left:1px solid var(--line);box-shadow:var(--shadow);transform:translate(102%);transition:transform .18s cubic-bezier(.2,.7,.2,1);display:flex;flex-direction:column;min-height:0;z-index:5}.drawer.open{transform:none}.dr-head{display:flex;align-items:center;gap:10px;padding:12px 12px 12px 16px;border-bottom:1px solid var(--line)}.dr-head .av{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;font-size:20px;flex:none}.dr-head .tx{flex:1;min-width:0;display:grid}.dr-head .tx b{font-weight:600;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dr-head .tx small{color:var(--muted);font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dr-head .tx small.mono{font-family:var(--mono)}.dr-body{overflow:auto;padding:14px 16px 18px;display:grid;gap:16px;align-content:start;flex:1}.f{display:grid;gap:7px}.f>.f-label{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}.f input,.f select{font-size:13px}.row{display:flex;align-items:center;gap:10px;padding:7px 10px 7px 8px;border:1px solid var(--line-strong);border-radius:9px;background:var(--surface);width:100%;text-align:left}.row .av{width:30px;height:30px;border-radius:8px;background:var(--surface-2);display:grid;place-items:center;font-size:18px;flex:none}.row .tx{flex:1;min-width:0;display:grid}.row .tx b{font-weight:500}.row .tx small{font-size:11px}.row .link{color:var(--accent);font-weight:600;font-size:12px;flex:none}.sw{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.sw button{display:grid;justify-items:center;gap:4px;padding:6px 4px 5px;border-radius:9px;border:1.5px solid transparent;font-size:10.5px;color:var(--ink-2)}.sw button i{width:30px;height:22px;border-radius:6px;border:1px solid rgba(0,0,0,.08);display:block}.sw button i.auto{background:linear-gradient(135deg,#fff 50%,#e5e7eb 50%)}.sw button i.none{background:linear-gradient(135deg,transparent 46%,#8b95a1 46%,#8b95a1 54%,transparent 54%),#e7e7e7;border-style:dashed}.sw button[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft);color:var(--ink)}.picker{display:grid;gap:10px;padding:10px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}.picker input{background:var(--surface)}.icon-list{display:grid;gap:12px;max-height:300px;overflow:auto;padding-right:2px}.icon-list small{margin-bottom:6px}.icon-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(40px,1fr));gap:6px}.icon-choice{display:grid;place-items:center;height:40px;background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:9px}.icon-choice .mdi{font-size:22px}.icon-choice[aria-pressed=true]{background:var(--accent-soft);color:var(--accent);border-color:var(--accent)}.icon-choice.icon-auto{display:flex;justify-content:flex-start;gap:10px;padding:0 12px;font-size:12.5px;font-weight:500;height:38px}.action-list{display:grid;gap:6px;max-height:300px;overflow:auto;padding-right:2px}.action-choice{display:grid;gap:2px;padding:8px 12px;background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:9px;font-size:12.5px;text-align:left}.action-choice strong{font-weight:600}.action-choice[aria-pressed=true]{background:var(--accent-soft);border-color:var(--accent)}.action-number{display:flex;align-items:center;gap:8px}.action-number input{flex:1;min-width:0}.items{display:grid;gap:6px}.item{display:flex;align-items:center;gap:8px;padding:7px 8px;border:1px solid var(--line-strong);border-radius:9px;background:var(--surface);width:100%;text-align:left;cursor:pointer;touch-action:pan-y}.item:hover{border-color:var(--accent)}.item.selected{border-color:var(--accent);background:var(--accent-soft)}.item.is-hidden{border-style:dashed}.item.is-hidden .av,.item.is-hidden b{opacity:.55}.item.is-overflow{border-style:dashed;border-color:var(--warn)}.item.is-overflow small{color:var(--warn)}.item.dragging-chip{border:2px dashed var(--accent);background:var(--accent-soft);cursor:grabbing}.item.just-added{animation:chip-added 1.2s ease-out}@keyframes chip-added{0%{background:var(--accent-soft)}to{background:var(--surface)}}.item .grip{color:var(--line-strong);font-size:13px;cursor:grab;letter-spacing:-2px;flex:none}.item .av{width:26px;height:26px;border-radius:7px;background:var(--surface-2);display:grid;place-items:center;font-size:15px;flex:none}.item .tx{flex:1;min-width:0;display:grid}.item .tx b{font-weight:500;font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item .tx small{color:var(--muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item .x{color:var(--muted);width:22px;height:22px;display:grid;place-items:center;border-radius:6px;flex:none;font-size:11px}.item .x:hover{color:var(--danger);background:var(--danger-soft)}.ghost-btn{border:1.5px dashed var(--line-strong);border-radius:9px;padding:8px;color:var(--accent);font-weight:600;width:100%;background:transparent}.ghost-btn:hover:not(:disabled){border-color:var(--accent);background:var(--accent-soft)}.dr-foot{margin-top:auto;display:flex;align-items:center;gap:8px;padding:10px 12px;border-top:1px solid var(--line);background:var(--surface-2);flex-wrap:wrap}.dr-foot .spacer{flex:1}.live{display:grid;gap:6px;padding:10px;border:1px solid var(--line);border-radius:10px;background:#e7e7e7;color:#1b1b1b;justify-items:start}.live small{color:#5a5f66}.live svg{display:block;height:28px}.option{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);border-radius:9px;background:var(--surface);width:100%;text-align:left}.option:hover:not(:disabled){border-color:var(--accent)}.option .mdi{font-size:20px;width:26px;text-align:center;color:var(--ink-2);flex:none}.option .tx{display:grid;min-width:0}.option .tx strong{font-weight:500;font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.option .tx small{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.options{display:grid;gap:6px}.inspection-tile{display:grid;gap:3px;padding:8px 10px;border:1px solid var(--line);border-radius:9px;margin-bottom:6px}.inspection-tile strong{font-size:12.5px}.settings{padding:22px;overflow:auto;display:grid;gap:14px;align-content:start;grid-column:1 / -1}.settings .status{font-size:12px;color:var(--muted)}.set-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px}.set-card{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:6px 14px 8px}.set-card h4{display:flex;align-items:center;gap:8px;padding:10px 0 8px}.set-card h4 .mdi{color:var(--muted);font-size:16px}.set-card>.hint{margin:6px 0 4px}.srow{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-top:1px solid var(--line)}.srow>.s-label{color:var(--ink-2)}.srow.inactive .s-label,.srow.inactive .s-control{opacity:.45}.settings.offline .set-grid{opacity:.6}.step{display:inline-flex;align-items:center;gap:2px}.step button{width:26px;height:26px;border-radius:6px;color:var(--ink-2);background:var(--seg);display:grid;place-items:center}.step button .mdi{font-size:15px}.step button:hover:not(:disabled){color:var(--ink);background:var(--line-strong)}.step output{min-width:56px;text-align:center;font-weight:500}.panel{padding:22px 26px 40px;overflow:auto;display:grid;gap:18px;align-content:start;max-width:960px;width:100%}.panel.wide{max-width:1120px}.panel-head{display:flex;align-items:flex-start;gap:12px}.panel-head .tx{display:grid;gap:2px;flex:1;min-width:0}.panel-head h1{font-size:20px}.panel-head p{color:var(--muted);font-size:13px}.panel p,.panel li{color:var(--ink-2);font-size:13px}.card{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:16px 18px;display:grid;gap:12px;align-content:start}.card h2{font-size:14px}.card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}.field{display:grid;gap:6px}.field>.f-label,fieldset legend{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}fieldset{border:0;padding:0;margin:0;display:grid;gap:8px;min-width:0}fieldset:disabled{opacity:.6}.boards{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px}.board{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line-strong);border-radius:10px;cursor:pointer}.board:has(input:checked){border-color:var(--accent);background:var(--accent-soft)}.board input{width:auto;margin:0;accent-color:var(--accent)}.board b{display:block;font-weight:600}.actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.status-line{font-size:12.5px;color:var(--ink-2)}.status-line.ok{color:var(--good)}.status-line.error{color:var(--danger)}.progress-head{display:flex;align-items:center;gap:10px;font-weight:600;font-size:14px}.outcome{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700}.outcome.ok{background:var(--good)}.outcome.bad{background:var(--danger)}.steps{margin:0;padding-left:20px;display:grid;gap:8px}.steps li b{color:var(--ink)}.key-box{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);flex-wrap:wrap}.key-box code{flex:1;min-width:0;background:none;padding:0;font-size:12px}.log{max-height:320px}details.log-wrap summary{cursor:pointer;font-weight:500;color:var(--ink-2);font-size:12.5px}details.log-wrap pre{margin-top:8px}.check{display:flex;align-items:flex-start;gap:10px;cursor:pointer}.check input{width:18px;height:18px;margin:1px 0 0;accent-color:var(--accent)}.check span{display:grid;gap:2px;font-weight:500}.node-line{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.tools{display:flex;gap:10px;flex-wrap:wrap}.tool{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface);text-align:left;min-width:220px}.tool:hover{border-color:var(--accent)}.tool .tool-icon{width:30px;height:30px;border-radius:8px;background:var(--seg);display:grid;place-items:center;font-size:15px;color:var(--ink-2);flex:none}.tool .tx{display:grid}.tool .tx b{font-weight:600}.yaml-editor{display:grid;grid-template-columns:44px minmax(0,1fr);border:1px solid var(--line-strong);border-radius:10px;overflow:hidden;background:var(--code-bg);min-height:280px;max-height:60vh}.yaml-gutter{padding:12px 8px;text-align:right;color:var(--muted);font:12px/1.5 var(--mono);white-space:pre;user-select:none;overflow:hidden;border-right:1px solid var(--line)}.yaml-editor textarea{border:0;border-radius:0;background:transparent;resize:none;font:12px/1.5 var(--mono);padding:12px;white-space:pre;overflow:auto;min-height:280px;tab-size:2}.file-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.file-row code{font-size:12px}.notice{display:flex;gap:12px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}.notice .mdi{font-size:20px;color:var(--ink-2)}.notice strong{display:block;font-weight:600;margin-bottom:2px}.alerts section{display:grid;gap:10px}.alerts h2{font-size:15px}.alerts-nav{display:flex;flex-wrap:wrap;gap:6px}.alerts-nav button{background:var(--accent-soft);color:var(--accent);padding:5px 11px;font-size:12px;border-radius:20px;font-weight:500}.alert-hero{display:grid;grid-template-columns:minmax(0,300px) 1fr;gap:20px;align-items:center}.alert-mock{background:#101820;border-radius:16px;padding:22px 18px;display:grid;place-items:center}.alert-mock-card{position:relative;width:100%;background:#ffe1c6;border:1px solid #0001;border-radius:14px;padding:12px 12px 48px 52px;color:#1b1b1b;display:grid;gap:2px}.alert-mock-icon{position:absolute;left:12px;top:12px;font-size:30px}.alert-mock-card strong{font-size:15px;line-height:1.2}.alert-mock-card>span{font-size:12px;color:#3a3a3c}.alert-mock-card .fake{position:absolute;right:10px;bottom:10px;padding:6px 16px;border-radius:999px;background:#1b1b1b;color:#fff;font-size:13px}.alert-screen{border:1px solid var(--line);border-radius:10px;padding:10px 12px;display:grid;gap:8px;background:var(--surface)}.alert-screen-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.copy-line{display:flex;align-items:flex-start;gap:8px;flex-wrap:wrap}.copy-line .copy-label{flex:none;width:96px;font-size:12px;color:var(--muted);padding-top:2px}.copy-line>code{flex:1;min-width:0;padding:4px 8px}.copy-line pre{flex:1;min-width:0}.table-scroll{overflow-x:auto}table{width:100%;border-collapse:collapse;font-size:12.5px;min-width:560px}th,td{text-align:left;vertical-align:top;padding:8px 12px 8px 0;border-bottom:1px solid var(--line)}th{font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600}td code{white-space:nowrap}.chips{display:flex;flex-wrap:wrap;gap:6px}.chips .chip .mdi{font-size:16px}.chips .chip code{background:none;padding:0}.alert-icon-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:8px}.alert-icon{display:grid;justify-items:center;align-content:start;gap:4px;min-height:86px;padding:10px 6px 8px;background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:10px;font-weight:500}.alert-icon:hover{border-color:var(--accent)}.alert-icon .mdi{font-size:26px}.alert-icon code{background:none;padding:0;font-size:11px;color:var(--accent);text-align:center;white-space:normal}.alert-icon small{font-size:11px;text-align:center}.swatches{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}.swatch{display:flex;align-items:center;gap:10px;padding:7px;border:1px solid var(--line);border-radius:10px;background:var(--surface);color:var(--ink);font-size:12px;text-align:left;font-weight:500}.swatch:hover{border-color:var(--accent)}.swatch i{width:32px;height:32px;border-radius:8px;border:1px solid #0001;flex:none;display:block}.swatch span{display:grid;gap:2px;min-width:0}.swatch code{background:none;padding:0}.alerts-list{padding-left:18px;margin:0;display:grid;gap:8px}.alerts-list b{color:var(--ink)}.subhead{font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-top:6px}.empty{margin:auto;max-width:420px;text-align:center;display:grid;gap:10px;justify-items:center;padding:60px 20px}.empty-icon{width:48px;height:48px;border-radius:14px;background:var(--seg);color:var(--muted);display:grid;place-items:center;font-size:26px}.empty h2{font-size:18px}.empty p{color:var(--muted)}.toast{position:fixed;left:50%;bottom:20px;transform:translate(-50%);display:flex;align-items:center;gap:14px;padding:10px 16px;background:var(--ink);color:var(--surface);border-radius:10px;box-shadow:var(--shadow);font-size:13px;z-index:60;max-width:min(92vw,560px)}.toast button{color:#9fc4ff;font-weight:650}@media(max-width:960px){.app{grid-template-columns:1fr;min-height:100vh}.side{position:static;height:auto;flex-direction:row;flex-wrap:wrap;align-items:center;border-right:0;border-bottom:1px solid var(--line);padding:10px;gap:4px 6px}.side .label,.side .spacer,.conn{display:none}.side #screens,.screen-item{display:contents}.screen-update{display:none}.side #pending{flex-basis:100%}.nav-item{width:auto}.more{display:contents}.main-head{flex-wrap:wrap;padding:10px 14px;gap:8px;position:static}.head-right{margin-left:0;width:100%}.body{grid-template-columns:1fr;overflow:visible}.canvas{padding:16px;overflow:visible}.pages{overflow-x:auto;padding-bottom:8px}.library{border-left:0;border-top:1px solid var(--line)}.lib-list{flex:none;max-height:360px}.drawer{position:fixed;top:0;width:100%}.panel{padding:16px}.alert-hero{grid-template-columns:1fr}}.progress{position:relative;height:6px;border-radius:3px;background:var(--seg);overflow:hidden}.progress i{position:absolute;inset:0 auto 0 0;background:var(--accent);border-radius:3px;transition:width .4s}.progress-text{display:flex;justify-content:space-between;gap:8px;font-size:11px;color:var(--muted)}.progress-text span:last-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;text-align:right}.whatsnew summary{cursor:pointer;font-size:11.5px;color:var(--accent);font-weight:500;list-style:none}.whatsnew summary::-webkit-details-marker{display:none}.whatsnew ul{margin:6px 0 0;padding-left:14px;display:grid;gap:4px;font-size:11px;color:var(--ink-2)}.whatsnew ul li{line-height:1.35}.log-lines{max-height:160px;font-size:11px}.palette-backdrop{position:fixed;inset:0;background:#0a0c1247;z-index:70;display:grid;align-items:start;justify-items:center;padding:12vh 16px 16px}.palette{width:min(640px,100%);background:var(--surface);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);overflow:hidden;display:flex;flex-direction:column;max-height:70vh}.palette input{border:0;border-radius:0;border-bottom:1px solid var(--line);padding:14px 16px;font-size:15px;background:transparent}.palette-list{overflow:auto;padding:6px;display:grid;gap:2px}.palette-group{font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:8px 10px 4px}.palette-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;width:100%;text-align:left;color:var(--ink)}.palette-item .mdi,.palette-item .glyph{width:22px;text-align:center;color:var(--muted);font-size:16px;flex:none}.palette-item .tx{flex:1;min-width:0;display:grid}.palette-item .tx small{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.palette-item .hint-key{font-size:10.5px;color:var(--muted);border:1px solid var(--line);border-radius:4px;padding:1px 5px}.palette-item.active,.palette-item:hover{background:var(--accent-soft)}.palette-empty{padding:18px;color:var(--muted);font-size:12.5px;text-align:center}.side .search-btn{display:flex;align-items:center;gap:8px;width:100%;margin:4px 0 6px;padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:var(--surface-2);color:var(--muted);font-size:12px;text-align:left}.side .search-btn kbd{margin-left:auto;font:10.5px var(--ui-font);border:1px solid var(--line);border-radius:4px;padding:1px 5px;background:var(--surface)}.side .search-btn:hover{color:var(--ink);border-color:var(--line-strong)}.menu .sub{display:grid;padding:2px 0 4px 10px}.menu .sub button{font-size:12.5px;padding:6px 10px}.menu .sep{height:1px;background:var(--line);margin:4px 6px}.lib-row{display:flex;gap:6px;align-items:center}.lib-row select{padding:5px 8px;font-size:12px;flex:1;min-width:0}.lib-row .chip-toggle{flex:none;padding:5px 10px;border-radius:999px;font-size:11.5px;font-weight:500;color:var(--ink-2);background:var(--surface-2);border:1px solid var(--line)}.lib-row .chip-toggle[aria-pressed=true]{background:var(--ink);color:var(--surface);border-color:var(--ink)}.ent .av.on{background:#fff3d6!important;color:#b7791f!important}.ent .av.gone{background:var(--seg)!important;color:var(--muted)!important}.try-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px}.try-grid .field.wide{grid-column:1 / -1}.tile.full{grid-column:span 2;grid-row:span 3;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:6px}.tile.full .ic{font-size:34px}.tile.full .lead{flex:0 0 auto;align-content:center;justify-items:center}.tile.full .nm{font-size:14px}.tile.full .st{font-size:11px}.tile.full .ctl{margin-top:6px}.tile.full .mini-slider{width:60%}.tile .goto{font-size:10.5px;color:#5a5f66}.device.cyd .tile.full .ic{font-size:26px} diff --git a/screen_manager/app/static/assets/index-DQxVdm_5.css b/screen_manager/app/static/assets/index-DQxVdm_5.css deleted file mode 100644 index f4e6524..0000000 --- a/screen_manager/app/static/assets/index-DQxVdm_5.css +++ /dev/null @@ -1 +0,0 @@ -:root{color-scheme:light dark;--ground: #f5f6f8;--surface: #ffffff;--surface-2: #f9fafb;--line: #e4e7ec;--line-strong: #d3d8e0;--ink: #16181d;--ink-2: #565d6b;--muted: #7a8290;--accent: #2f63f0;--accent-ink: #ffffff;--accent-soft: #edf2ff;--good: #1e9a5f;--good-soft: #e6f6ee;--warn: #b56d00;--warn-soft: #fff3df;--danger: #c6372e;--danger-soft: #fdecea;--seg: #eef0f3;--shadow: 0 12px 40px rgba(20, 24, 40, .12), 0 1px 2px rgba(20, 24, 40, .06);--code-bg: #f1f3f6;--ui-font: -apple-system, BlinkMacSystemFont, system-ui, "SF Pro Text", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace}@media(prefers-color-scheme:dark){:root{--ground: #0e1014;--surface: #161a21;--surface-2: #1b2029;--line: #262c37;--line-strong: #333b49;--ink: #e9ecf1;--ink-2: #b4bbc7;--muted: #8a93a3;--accent: #6d93ff;--accent-ink: #0b1633;--accent-soft: #1b2540;--good: #3fbf7f;--good-soft: #14302a;--warn: #e0a03a;--warn-soft: #302610;--danger: #f07167;--danger-soft: #3a1b19;--seg: #222834;--shadow: 0 16px 48px rgba(0, 0, 0, .55), 0 1px 2px rgba(0, 0, 0, .4);--code-bg: #12151b}}@font-face{font-family:Tile Icons;src:url(./tile-icons-DVbFlNHb.woff) format("woff");font-display:block}@font-face{font-family:Bar Roboto;font-weight:400;src:url(./bar-roboto-400-Dv8XhZ6y.woff) format("woff");font-display:block}@font-face{font-family:Bar Roboto;font-weight:500;src:url(./bar-roboto-500-CGWR3VLQ.woff) format("woff");font-display:block}*{box-sizing:border-box}html,body,#app{height:100%}body{margin:0;background:var(--ground);color:var(--ink);font:13px/1.45 var(--ui-font);-webkit-font-smoothing:antialiased;font-variant-numeric:tabular-nums}button,input,select,textarea{font:inherit;color:inherit}button{background:none;border:0;padding:0;cursor:pointer;border-radius:8px}button:disabled{opacity:.45;cursor:default}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible,summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input,select,textarea{background:var(--surface);border:1px solid var(--line-strong);border-radius:8px;padding:7px 10px;width:100%;color:var(--ink)}input::placeholder,textarea::placeholder{color:var(--muted)}select{appearance:auto}h1,h2,h3,h4{margin:0;font-weight:600;letter-spacing:-.01em}h1{font-size:20px;letter-spacing:-.02em}h2{font-size:15px}h3,h4{font-size:13px}p{margin:0}small,.hint{display:block;color:var(--muted);font-size:11.5px;font-weight:400;line-height:1.4}.hint.warn,small.warn{color:var(--warn)}code{font-family:var(--mono);font-size:.92em;background:var(--code-bg);padding:1px 6px;border-radius:5px;overflow-wrap:anywhere}pre{margin:0;padding:12px 14px;background:var(--code-bg);border:1px solid var(--line);border-radius:10px;overflow:auto;font:12px/1.5 var(--mono);color:var(--ink);white-space:pre-wrap;overflow-wrap:anywhere}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}.mdi{font-family:Tile Icons;font-style:normal;font-weight:400;line-height:1}[hidden]{display:none!important}.app{display:grid;grid-template-columns:232px minmax(0,1fr);height:100%;min-height:100vh}.app.dragging{user-select:none;-webkit-user-select:none;cursor:grabbing}.main{display:flex;flex-direction:column;min-width:0;min-height:0}.side{background:var(--surface);border-right:1px solid var(--line);display:flex;flex-direction:column;padding:14px 10px;gap:4px;min-height:0;overflow:auto;position:sticky;top:0;height:100vh}.brand{display:flex;align-items:center;gap:9px;padding:4px 8px 6px;font-weight:600;font-size:13px}.brand .mark{width:22px;height:22px;border-radius:6px;background:var(--ink);color:var(--surface);display:grid;place-items:center;font-size:14px;line-height:1}.conn{display:block;padding:0 8px 8px;font-size:11px;color:var(--muted)}.conn:before{content:"●";margin-right:6px;color:var(--warn)}.conn.online:before{color:var(--good)}.side .label{font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:10px 8px 4px}.nav-item{display:flex;align-items:center;gap:9px;width:100%;padding:7px 8px;border-radius:8px;text-align:left;color:var(--ink-2)}.nav-item:hover{background:var(--surface-2);color:var(--ink)}.nav-item[aria-current=true]{background:var(--seg);color:var(--ink);font-weight:500}.nav-item .dot{width:7px;height:7px;border-radius:50%;background:var(--good);flex:none}.nav-item .dot.off{background:var(--line-strong)}.nav-item .unsaved{width:7px;height:7px;border-radius:50%;background:var(--warn);flex:none}.nav-item .txt{display:grid;min-width:0;flex:1}.nav-item .txt small{font-size:11px;color:var(--muted);font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-item .mdi{font-size:16px;width:18px;text-align:center;color:var(--muted)}.nav-item .plus{width:18px;text-align:center;font-size:14px}.nav-item.ghost{color:var(--muted)}.nav-item.ghost:hover{color:var(--accent);background:var(--accent-soft)}.pill{font-size:10.5px;font-weight:600;padding:2px 7px;border-radius:999px;background:var(--warn-soft);color:var(--warn);flex:none}.side .spacer{flex:1}.screen-item{display:grid;gap:4px}.screen-update{display:grid;gap:6px;padding:2px 8px 8px 24px}.screen-update.available{grid-template-columns:1fr auto;align-items:center}.screen-update.available:has(.screen-host){grid-template-columns:1fr}.screen-update small.failed{color:var(--danger)}.screen-host{display:flex;gap:6px;align-items:center}.screen-host input{padding:5px 8px;font-size:12px}.pending{margin:4px 0;padding:10px;border:1px dashed var(--line-strong);border-radius:10px;display:grid;gap:6px}.pending strong{font-size:12.5px}.pending-actions{display:flex;flex-wrap:wrap;gap:6px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:6px 12px;border-radius:8px;font-weight:600;font-size:12.5px;white-space:nowrap}.btn.primary{background:var(--accent);color:var(--accent-ink)}.btn.primary:hover:not(:disabled){filter:brightness(1.06)}.btn.quiet{color:var(--ink-2);border:1px solid var(--line-strong);background:var(--surface)}.btn.quiet:hover:not(:disabled){background:var(--surface-2);color:var(--ink)}.btn.danger{color:var(--danger)}.btn.danger:hover:not(:disabled){background:var(--danger-soft)}.btn.mini{padding:4px 9px;font-size:11.5px}.btn.link{color:var(--accent);padding:0;font-weight:600}.icon-btn{width:30px;height:30px;display:grid;place-items:center;border-radius:8px;color:var(--ink-2);font-size:15px;flex:none}.icon-btn:hover{background:var(--seg);color:var(--ink)}.chip{display:inline-flex;align-items:center;gap:6px;padding:3px 9px;border-radius:999px;font-size:11.5px;font-weight:500;color:var(--ink-2);background:var(--surface-2);border:1px solid var(--line);white-space:nowrap}.chip .dot{width:6px;height:6px;border-radius:50%;background:var(--good);flex:none}.chip.off .dot{background:var(--line-strong)}.chip.dirty{color:var(--warn);background:var(--warn-soft);border-color:transparent}.chip.sent,.chip.good{color:var(--good);background:var(--good-soft);border-color:transparent}.chip.update{color:var(--warn);background:var(--warn-soft);border-color:transparent}.seg{display:inline-flex;padding:2px;background:var(--seg);border-radius:8px;gap:2px}.seg button{padding:4px 11px;border-radius:6px;font-size:12px;font-weight:500;color:var(--ink-2);white-space:nowrap}.seg button[aria-pressed=true]{background:var(--surface);color:var(--ink);box-shadow:0 1px 2px #14182824}.seg.wrap{flex-wrap:wrap}.seg button:hover:not(:disabled):not([aria-pressed=true]){color:var(--ink)}.spin{display:inline-block;width:14px;height:14px;border:2px solid var(--line-strong);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite;flex:none}.spin.small{width:11px;height:11px;border-width:1.5px}@keyframes spin{to{transform:rotate(360deg)}}.switch{width:34px;height:20px;border-radius:10px;background:var(--line-strong);position:relative;flex:none;padding:0}.switch:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0003;transition:left .12s}.switch[aria-checked=true]{background:var(--accent)}.switch[aria-checked=true]:after{left:16px}.switch.unknown:after{left:9px;opacity:.6}@media(prefers-reduced-motion:reduce){.switch:after,.drawer,.spin{transition:none;animation:none}}.main-head{display:flex;align-items:center;gap:12px;padding:0 18px;min-height:52px;border-bottom:1px solid var(--line);background:var(--surface);position:sticky;top:0;z-index:4}.main-head h1{font-size:15px}.main-head .eyebrow{font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.head-right{margin-left:auto;display:flex;align-items:center;gap:8px;position:relative}.menu{position:absolute;top:38px;right:0;min-width:210px;background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);padding:6px;display:grid;z-index:6}.menu button{text-align:left;padding:7px 10px;border-radius:7px;color:var(--ink);display:flex;justify-content:space-between;gap:12px;width:100%}.menu button small{color:var(--muted);display:inline}.menu button:hover:not(:disabled){background:var(--surface-2)}.body{position:relative;display:grid;grid-template-columns:minmax(0,1fr) 300px;flex:1;min-height:0;overflow:hidden}.canvas{overflow:auto;padding:22px 22px 26px;min-width:0}.canvas-head{display:flex;align-items:baseline;gap:12px;margin-bottom:14px;color:var(--muted);font-size:12px;flex-wrap:wrap}.canvas-head b{color:var(--ink);font-weight:600;font-size:13px}.canvas-head .warn{color:var(--warn)}.pages{display:flex;gap:18px;align-items:flex-start}.page{flex:0 0 292px;display:grid;gap:8px}.page-label{display:flex;justify-content:space-between;align-items:center;font-size:11.5px;color:var(--muted);padding:0 4px;min-height:22px}.page-label .btn.mini{color:var(--muted)}.page-label .btn.mini:hover{color:var(--danger);background:var(--danger-soft)}.page.ghost .device{display:grid;place-items:center;border:1.5px dashed var(--line-strong);background:transparent;color:var(--muted);font-weight:500;cursor:pointer}.page.ghost .device:hover,.page.ghost .device:focus-visible{color:var(--accent);border-color:var(--accent)}.page.ghost .device.drop{color:var(--accent);border-color:var(--accent);background:var(--accent-soft)}.page.ghost.disabled .device{opacity:.5;cursor:default}.device{background:#e7e7e7;border-radius:18px;padding:10px;display:grid;grid-template-rows:auto minmax(0,1fr);gap:8px;color:#1b1b1b;aspect-ratio:1 / 1}.device.cyd{aspect-ratio:4 / 3}.bar-wrap{cursor:pointer;border-radius:8px;padding:0 2px}.bar-wrap:hover{background:#dedede}.bar-wrap.selected{outline:2px solid var(--accent);outline-offset:1px}.bar-wrap svg{display:block;width:100%;height:auto}.tiles{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:minmax(0,1fr);gap:8px;min-height:0}.tile{position:relative;background:#fff;border:1px solid #dcdcdc;border-radius:12px;padding:8px 9px;display:flex;flex-direction:column;justify-content:space-between;gap:4px;min-height:0;cursor:pointer;text-align:left;overflow:hidden;color:#1b1b1b;touch-action:manipulation}.tile:hover{border-color:#b9c4d3}.tile.chosen{outline:2px solid var(--accent);outline-offset:1px}.tile.wide{grid-column:span 2;flex-direction:row;align-items:center;gap:8px}.tile.bare{background:transparent;border-style:dashed;border-color:#c3c9d0}.tile.placeholder{opacity:.55;border:2px dashed var(--accent);background:var(--accent-soft);cursor:default}.tile .ic{font-size:18px;line-height:1;color:#1b1b1b;flex:none}.tile .lead{display:grid;gap:2px;min-width:0;flex:1;align-content:end}.tile.wide .lead{display:flex;align-items:center;gap:8px;align-content:initial}.tile .tx{display:grid;min-width:0;gap:1px}.tile .head{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.tile .head.top{flex:none}.tile .nm{font-size:11.5px;font-weight:600;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tile .st{font-size:10.5px;color:#5a5f66;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.device.cyd .tile{padding:6px 7px}.device.cyd .tile .nm{font-size:10.5px}.device.cyd .tile .ic{font-size:15px}.device.cyd .tile .head{gap:6px}.device.cyd .tile:has(>.mini-slider){padding-block:4px;gap:3px}.device.cyd .tile .mini-slider{height:8px}.tile .mini-slider{height:10px;border-radius:5px;background:linear-gradient(to right,#ffbf38 60%,#fff1d3 60%);flex:none;width:100%}.tile.wide .mini-slider{width:70px}.tile .ctl{flex:none;display:flex;align-items:center;gap:4px;color:#1b1b1b}.tile .tog{width:30px;height:17px;border-radius:9px;background:#2196f3;position:relative}.tile .tog:after{content:"";position:absolute;top:2px;right:2px;width:13px;height:13px;border-radius:50%;background:#fff}.tile .tog.off{background:#c9ccd1}.tile .tog.off:after{right:auto;left:2px}.tile .ic.lit{color:#d9930f}.tile .ic.thumb{width:28px;height:28px;border-radius:7px;background:#d7dbe1;display:grid;place-items:center;font-size:15px;color:#5a5f66}.tile.full .ic.thumb{width:54px;height:54px;border-radius:12px;font-size:26px}.device.cyd .tile .ic.thumb{width:22px;height:22px;font-size:12px}.tile .big{font-size:19px;font-weight:600;letter-spacing:-.02em;line-height:1.05;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tile .big small{display:inline;font-size:10.5px;font-weight:500;color:#5a5f66;margin-left:2px}.device.cyd .tile .big{font-size:16px}.tile .range{width:56px;height:14px;border-radius:7px;background:linear-gradient(to right,#2196f3 35%,#d3e8fb 35%)}.tile .key{height:20px;min-width:22px;padding:0 5px;border-radius:6px;background:#eceef1;display:grid;place-items:center;font-size:12px}.tile .stp{display:flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:10px;background:#eceef1;font-size:11px;font-weight:600}.tile .stp .mdi{font-size:12px}.tile .run{height:20px;padding:0 9px;border-radius:10px;background:#eceef1;font-size:11px;font-weight:600;line-height:20px}.tile .remove{position:absolute;top:5px;right:5px;width:22px;height:22px;border-radius:50%;background:#ffffffd9;color:#5a5f66;border:1px solid #dcdcdc;font-size:10px;line-height:1;display:grid;place-items:center;opacity:0;transition:opacity .12s}.tile:hover .remove,.tile:focus-within .remove{opacity:1}.tile .remove:hover{color:var(--danger);border-color:#e7b4b0;background:#fff}@media(hover:none){.tile .remove{opacity:1}}.tile .clockface{width:46px;height:46px;margin:auto}.tile.wide .clockface{margin:0;flex:none}.cell{min-height:0;border:1px dashed #cfd4da;border-radius:12px;background:transparent;color:#a3abb5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;font-weight:500;cursor:pointer;padding:6px}.cell span{font-size:18px;line-height:1}.cell small{font-size:10.5px;color:inherit}.cell:hover,.cell:focus-visible{border-color:#9eb6cf;color:#4b5563;background:#f6f7f9}.cell.insert-here{border:2px dashed var(--accent);color:var(--accent);background:var(--accent-soft)}.drag-ghost{position:fixed;left:0;top:0;pointer-events:none;z-index:50;opacity:.92;box-shadow:var(--shadow);border-radius:12px}.library{border-left:1px solid var(--line);background:var(--surface);display:flex;flex-direction:column;min-height:0}.lib-head{padding:14px 14px 10px;display:grid;gap:10px;border-bottom:1px solid var(--line)}.lib-title{display:flex;align-items:baseline;justify-content:space-between;font-weight:600;gap:8px}.lib-title small{color:var(--muted);font-weight:400;font-size:11.5px}.filters{display:flex;gap:6px;overflow-x:auto;scrollbar-width:none;padding-bottom:2px}.filters::-webkit-scrollbar{display:none}.filters button{flex:none;display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:999px;font-size:11.5px;font-weight:500;color:var(--ink-2);background:var(--surface-2);border:1px solid var(--line)}.filters button[aria-pressed=true]{background:var(--ink);color:var(--surface);border-color:var(--ink)}.filters .domain-icon{width:16px;height:16px;font-size:11px;border-radius:50%;display:grid;place-items:center}.lib-list{overflow:auto;padding:8px;display:grid;gap:2px;align-content:start;flex:1}.ent{display:flex;align-items:center;gap:10px;padding:8px;border-radius:9px;width:100%;text-align:left;cursor:grab;touch-action:manipulation}.ent:hover:not(:disabled){background:var(--surface-2)}.ent:disabled{opacity:.55;cursor:default}.ent .av{width:30px;height:30px;border-radius:9px;display:grid;place-items:center;font-size:17px;flex:none}.ent .tx{display:grid;min-width:0;flex:1}.ent .tx b{font-weight:500;font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ent .tx small{font-size:11px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ent .add{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;color:var(--accent);background:var(--accent-soft);font-size:15px;font-weight:600;flex:none}.ent .add.done{color:var(--good);background:var(--good-soft);font-size:12px}.lib-foot{padding:10px 14px;border-top:1px solid var(--line);font-size:11.5px;color:var(--muted)}.domain-icon{display:inline-grid;place-items:center;border-radius:50%;font-weight:500}.drawer{position:absolute;top:0;right:0;bottom:0;width:360px;max-width:100%;background:var(--surface);border-left:1px solid var(--line);box-shadow:var(--shadow);transform:translate(102%);transition:transform .18s cubic-bezier(.2,.7,.2,1);display:flex;flex-direction:column;min-height:0;z-index:5}.drawer.open{transform:none}.dr-head{display:flex;align-items:center;gap:10px;padding:12px 12px 12px 16px;border-bottom:1px solid var(--line)}.dr-head .av{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;font-size:20px;flex:none}.dr-head .tx{flex:1;min-width:0;display:grid}.dr-head .tx b{font-weight:600;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dr-head .tx small{color:var(--muted);font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dr-head .tx small.mono{font-family:var(--mono)}.dr-body{overflow:auto;padding:14px 16px 18px;display:grid;gap:16px;align-content:start;flex:1}.f{display:grid;gap:7px}.f>.f-label{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}.f input,.f select{font-size:13px}.row{display:flex;align-items:center;gap:10px;padding:7px 10px 7px 8px;border:1px solid var(--line-strong);border-radius:9px;background:var(--surface);width:100%;text-align:left}.row .av{width:30px;height:30px;border-radius:8px;background:var(--surface-2);display:grid;place-items:center;font-size:18px;flex:none}.row .tx{flex:1;min-width:0;display:grid}.row .tx b{font-weight:500}.row .tx small{font-size:11px}.row .link{color:var(--accent);font-weight:600;font-size:12px;flex:none}.sw{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.sw button{display:grid;justify-items:center;gap:4px;padding:6px 4px 5px;border-radius:9px;border:1.5px solid transparent;font-size:10.5px;color:var(--ink-2)}.sw button i{width:30px;height:22px;border-radius:6px;border:1px solid rgba(0,0,0,.08);display:block}.sw button i.auto{background:linear-gradient(135deg,#fff 50%,#e5e7eb 50%)}.sw button i.none{background:linear-gradient(135deg,transparent 46%,#8b95a1 46%,#8b95a1 54%,transparent 54%),#e7e7e7;border-style:dashed}.sw button[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft);color:var(--ink)}.picker{display:grid;gap:10px;padding:10px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}.picker input{background:var(--surface)}.icon-list{display:grid;gap:12px;max-height:300px;overflow:auto;padding-right:2px}.icon-list small{margin-bottom:6px}.icon-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(40px,1fr));gap:6px}.icon-choice{display:grid;place-items:center;height:40px;background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:9px}.icon-choice .mdi{font-size:22px}.icon-choice[aria-pressed=true]{background:var(--accent-soft);color:var(--accent);border-color:var(--accent)}.icon-choice.icon-auto{display:flex;justify-content:flex-start;gap:10px;padding:0 12px;font-size:12.5px;font-weight:500;height:38px}.action-list{display:grid;gap:6px;max-height:300px;overflow:auto;padding-right:2px}.action-choice{display:grid;gap:2px;padding:8px 12px;background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:9px;font-size:12.5px;text-align:left}.action-choice strong{font-weight:600}.action-choice[aria-pressed=true]{background:var(--accent-soft);border-color:var(--accent)}.action-number{display:flex;align-items:center;gap:8px}.action-number input{flex:1;min-width:0}.items{display:grid;gap:6px}.item{display:flex;align-items:center;gap:8px;padding:7px 8px;border:1px solid var(--line-strong);border-radius:9px;background:var(--surface);width:100%;text-align:left;cursor:pointer;touch-action:pan-y}.item:hover{border-color:var(--accent)}.item.selected{border-color:var(--accent);background:var(--accent-soft)}.item.is-hidden{border-style:dashed}.item.is-hidden .av,.item.is-hidden b{opacity:.55}.item.is-overflow{border-style:dashed;border-color:var(--warn)}.item.is-overflow small{color:var(--warn)}.item.dragging-chip{border:2px dashed var(--accent);background:var(--accent-soft);cursor:grabbing}.item.just-added{animation:chip-added 1.2s ease-out}@keyframes chip-added{0%{background:var(--accent-soft)}to{background:var(--surface)}}.item .grip{color:var(--line-strong);font-size:13px;cursor:grab;letter-spacing:-2px;flex:none}.item .av{width:26px;height:26px;border-radius:7px;background:var(--surface-2);display:grid;place-items:center;font-size:15px;flex:none}.item .tx{flex:1;min-width:0;display:grid}.item .tx b{font-weight:500;font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item .tx small{color:var(--muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item .x{color:var(--muted);width:22px;height:22px;display:grid;place-items:center;border-radius:6px;flex:none;font-size:11px}.item .x:hover{color:var(--danger);background:var(--danger-soft)}.ghost-btn{border:1.5px dashed var(--line-strong);border-radius:9px;padding:8px;color:var(--accent);font-weight:600;width:100%;background:transparent}.ghost-btn:hover:not(:disabled){border-color:var(--accent);background:var(--accent-soft)}.dr-foot{margin-top:auto;display:flex;align-items:center;gap:8px;padding:10px 12px;border-top:1px solid var(--line);background:var(--surface-2);flex-wrap:wrap}.dr-foot .spacer{flex:1}.live{display:grid;gap:6px;padding:10px;border:1px solid var(--line);border-radius:10px;background:#e7e7e7;color:#1b1b1b;justify-items:start}.live small{color:#5a5f66}.live svg{display:block;height:28px}.option{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);border-radius:9px;background:var(--surface);width:100%;text-align:left}.option:hover:not(:disabled){border-color:var(--accent)}.option .mdi{font-size:20px;width:26px;text-align:center;color:var(--ink-2);flex:none}.option .tx{display:grid;min-width:0}.option .tx strong{font-weight:500;font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.option .tx small{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.options{display:grid;gap:6px}.inspection-tile{display:grid;gap:3px;padding:8px 10px;border:1px solid var(--line);border-radius:9px;margin-bottom:6px}.inspection-tile strong{font-size:12.5px}.settings{padding:22px;overflow:auto;display:grid;gap:14px;align-content:start;grid-column:1 / -1}.settings .status{font-size:12px;color:var(--muted)}.set-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px}.set-card{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:6px 14px 8px}.set-card h4{display:flex;align-items:center;gap:8px;padding:10px 0 8px}.set-card h4 .mdi{color:var(--muted);font-size:16px}.set-card>.hint{margin:6px 0 4px}.srow{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-top:1px solid var(--line)}.srow>.s-label{color:var(--ink-2)}.srow.inactive .s-label,.srow.inactive .s-control{opacity:.45}.settings.offline .set-grid{opacity:.6}.step{display:inline-flex;align-items:center;gap:2px}.step button{width:26px;height:26px;border-radius:6px;color:var(--ink-2);background:var(--seg);display:grid;place-items:center}.step button .mdi{font-size:15px}.step button:hover:not(:disabled){color:var(--ink);background:var(--line-strong)}.step output{min-width:56px;text-align:center;font-weight:500}.panel{padding:22px 26px 40px;overflow:auto;display:grid;gap:18px;align-content:start;max-width:960px;width:100%}.panel.wide{max-width:1120px}.panel-head{display:flex;align-items:flex-start;gap:12px}.panel-head .tx{display:grid;gap:2px;flex:1;min-width:0}.panel-head h1{font-size:20px}.panel-head p{color:var(--muted);font-size:13px}.panel p,.panel li{color:var(--ink-2);font-size:13px}.card{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:16px 18px;display:grid;gap:12px;align-content:start}.card h2{font-size:14px}.card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}.field{display:grid;gap:6px}.field>.f-label,fieldset legend{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}fieldset{border:0;padding:0;margin:0;display:grid;gap:8px;min-width:0}fieldset:disabled{opacity:.6}.boards{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px}.board{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line-strong);border-radius:10px;cursor:pointer}.board:has(input:checked){border-color:var(--accent);background:var(--accent-soft)}.board input{width:auto;margin:0;accent-color:var(--accent)}.board b{display:block;font-weight:600}.actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.status-line{font-size:12.5px;color:var(--ink-2)}.status-line.ok{color:var(--good)}.status-line.error{color:var(--danger)}.progress-head{display:flex;align-items:center;gap:10px;font-weight:600;font-size:14px}.outcome{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700}.outcome.ok{background:var(--good)}.outcome.bad{background:var(--danger)}.steps{margin:0;padding-left:20px;display:grid;gap:8px}.steps li b{color:var(--ink)}.key-box{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2);flex-wrap:wrap}.key-box code{flex:1;min-width:0;background:none;padding:0;font-size:12px}.log{max-height:320px}details.log-wrap summary{cursor:pointer;font-weight:500;color:var(--ink-2);font-size:12.5px}details.log-wrap pre{margin-top:8px}.check{display:flex;align-items:flex-start;gap:10px;cursor:pointer}.check input{width:18px;height:18px;margin:1px 0 0;accent-color:var(--accent)}.check span{display:grid;gap:2px;font-weight:500}.node-line{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.tools{display:flex;gap:10px;flex-wrap:wrap}.tool{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--surface);text-align:left;min-width:220px}.tool:hover{border-color:var(--accent)}.tool .tool-icon{width:30px;height:30px;border-radius:8px;background:var(--seg);display:grid;place-items:center;font-size:15px;color:var(--ink-2);flex:none}.tool .tx{display:grid}.tool .tx b{font-weight:600}.yaml-editor{display:grid;grid-template-columns:44px minmax(0,1fr);border:1px solid var(--line-strong);border-radius:10px;overflow:hidden;background:var(--code-bg);min-height:280px;max-height:60vh}.yaml-gutter{padding:12px 8px;text-align:right;color:var(--muted);font:12px/1.5 var(--mono);white-space:pre;user-select:none;overflow:hidden;border-right:1px solid var(--line)}.yaml-editor textarea{border:0;border-radius:0;background:transparent;resize:none;font:12px/1.5 var(--mono);padding:12px;white-space:pre;overflow:auto;min-height:280px;tab-size:2}.file-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.file-row code{font-size:12px}.notice{display:flex;gap:12px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}.notice .mdi{font-size:20px;color:var(--ink-2)}.notice strong{display:block;font-weight:600;margin-bottom:2px}.alerts section{display:grid;gap:10px}.alerts h2{font-size:15px}.alerts-nav{display:flex;flex-wrap:wrap;gap:6px}.alerts-nav button{background:var(--accent-soft);color:var(--accent);padding:5px 11px;font-size:12px;border-radius:20px;font-weight:500}.alert-hero{display:grid;grid-template-columns:minmax(0,300px) 1fr;gap:20px;align-items:center}.alert-mock{background:#101820;border-radius:16px;padding:22px 18px;display:grid;place-items:center}.alert-mock-card{position:relative;width:100%;background:#ffe1c6;border:1px solid #0001;border-radius:14px;padding:12px 12px 48px 52px;color:#1b1b1b;display:grid;gap:2px}.alert-mock-icon{position:absolute;left:12px;top:12px;font-size:30px}.alert-mock-card strong{font-size:15px;line-height:1.2}.alert-mock-card>span{font-size:12px;color:#3a3a3c}.alert-mock-card .fake{position:absolute;right:10px;bottom:10px;padding:6px 16px;border-radius:999px;background:#1b1b1b;color:#fff;font-size:13px}.alert-screen{border:1px solid var(--line);border-radius:10px;padding:10px 12px;display:grid;gap:8px;background:var(--surface)}.alert-screen-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.copy-line{display:flex;align-items:flex-start;gap:8px;flex-wrap:wrap}.copy-line .copy-label{flex:none;width:96px;font-size:12px;color:var(--muted);padding-top:2px}.copy-line>code{flex:1;min-width:0;padding:4px 8px}.copy-line pre{flex:1;min-width:0}.table-scroll{overflow-x:auto}table{width:100%;border-collapse:collapse;font-size:12.5px;min-width:560px}th,td{text-align:left;vertical-align:top;padding:8px 12px 8px 0;border-bottom:1px solid var(--line)}th{font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600}td code{white-space:nowrap}.chips{display:flex;flex-wrap:wrap;gap:6px}.chips .chip .mdi{font-size:16px}.chips .chip code{background:none;padding:0}.alert-icon-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:8px}.alert-icon{display:grid;justify-items:center;align-content:start;gap:4px;min-height:86px;padding:10px 6px 8px;background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:10px;font-weight:500}.alert-icon:hover{border-color:var(--accent)}.alert-icon .mdi{font-size:26px}.alert-icon code{background:none;padding:0;font-size:11px;color:var(--accent);text-align:center;white-space:normal}.alert-icon small{font-size:11px;text-align:center}.swatches{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}.swatch{display:flex;align-items:center;gap:10px;padding:7px;border:1px solid var(--line);border-radius:10px;background:var(--surface);color:var(--ink);font-size:12px;text-align:left;font-weight:500}.swatch:hover{border-color:var(--accent)}.swatch i{width:32px;height:32px;border-radius:8px;border:1px solid #0001;flex:none;display:block}.swatch span{display:grid;gap:2px;min-width:0}.swatch code{background:none;padding:0}.alerts-list{padding-left:18px;margin:0;display:grid;gap:8px}.alerts-list b{color:var(--ink)}.subhead{font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-top:6px}.empty{margin:auto;max-width:420px;text-align:center;display:grid;gap:10px;justify-items:center;padding:60px 20px}.empty-icon{width:48px;height:48px;border-radius:14px;background:var(--seg);color:var(--muted);display:grid;place-items:center;font-size:26px}.empty h2{font-size:18px}.empty p{color:var(--muted)}.toast{position:fixed;left:50%;bottom:20px;transform:translate(-50%);display:flex;align-items:center;gap:14px;padding:10px 16px;background:var(--ink);color:var(--surface);border-radius:10px;box-shadow:var(--shadow);font-size:13px;z-index:60;max-width:min(92vw,560px)}.toast button{color:#9fc4ff;font-weight:650}@media(max-width:960px){.app{grid-template-columns:1fr;min-height:100vh}.side{position:static;height:auto;flex-direction:row;flex-wrap:wrap;align-items:center;border-right:0;border-bottom:1px solid var(--line);padding:10px;gap:4px 6px}.side .label,.side .spacer,.conn{display:none}.side #screens,.screen-item{display:contents}.screen-update{display:none}.side #pending{flex-basis:100%}.nav-item{width:auto}.more{display:contents}.main-head{flex-wrap:wrap;padding:10px 14px;gap:8px;position:static}.head-right{margin-left:0;width:100%}.body{grid-template-columns:1fr;overflow:visible}.canvas{padding:16px;overflow:visible}.pages{overflow-x:auto;padding-bottom:8px}.library{border-left:0;border-top:1px solid var(--line)}.lib-list{flex:none;max-height:360px}.drawer{position:fixed;top:0;width:100%}.panel{padding:16px}.alert-hero{grid-template-columns:1fr}}.progress{position:relative;height:6px;border-radius:3px;background:var(--seg);overflow:hidden}.progress i{position:absolute;inset:0 auto 0 0;background:var(--accent);border-radius:3px;transition:width .4s}.progress-text{display:flex;justify-content:space-between;gap:8px;font-size:11px;color:var(--muted)}.progress-text span:last-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;text-align:right}.whatsnew summary{cursor:pointer;font-size:11.5px;color:var(--accent);font-weight:500;list-style:none}.whatsnew summary::-webkit-details-marker{display:none}.whatsnew ul{margin:6px 0 0;padding-left:14px;display:grid;gap:4px;font-size:11px;color:var(--ink-2)}.whatsnew ul li{line-height:1.35}.log-lines{max-height:160px;font-size:11px}.palette-backdrop{position:fixed;inset:0;background:#0a0c1247;z-index:70;display:grid;align-items:start;justify-items:center;padding:12vh 16px 16px}.palette{width:min(640px,100%);background:var(--surface);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);overflow:hidden;display:flex;flex-direction:column;max-height:70vh}.palette input{border:0;border-radius:0;border-bottom:1px solid var(--line);padding:14px 16px;font-size:15px;background:transparent}.palette-list{overflow:auto;padding:6px;display:grid;gap:2px}.palette-group{font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding:8px 10px 4px}.palette-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px;width:100%;text-align:left;color:var(--ink)}.palette-item .mdi,.palette-item .glyph{width:22px;text-align:center;color:var(--muted);font-size:16px;flex:none}.palette-item .tx{flex:1;min-width:0;display:grid}.palette-item .tx small{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.palette-item .hint-key{font-size:10.5px;color:var(--muted);border:1px solid var(--line);border-radius:4px;padding:1px 5px}.palette-item.active,.palette-item:hover{background:var(--accent-soft)}.palette-empty{padding:18px;color:var(--muted);font-size:12.5px;text-align:center}.side .search-btn{display:flex;align-items:center;gap:8px;width:100%;margin:4px 0 6px;padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:var(--surface-2);color:var(--muted);font-size:12px;text-align:left}.side .search-btn kbd{margin-left:auto;font:10.5px var(--ui-font);border:1px solid var(--line);border-radius:4px;padding:1px 5px;background:var(--surface)}.side .search-btn:hover{color:var(--ink);border-color:var(--line-strong)}.menu .sub{display:grid;padding:2px 0 4px 10px}.menu .sub button{font-size:12.5px;padding:6px 10px}.menu .sep{height:1px;background:var(--line);margin:4px 6px}.lib-row{display:flex;gap:6px;align-items:center}.lib-row select{padding:5px 8px;font-size:12px;flex:1;min-width:0}.lib-row .chip-toggle{flex:none;padding:5px 10px;border-radius:999px;font-size:11.5px;font-weight:500;color:var(--ink-2);background:var(--surface-2);border:1px solid var(--line)}.lib-row .chip-toggle[aria-pressed=true]{background:var(--ink);color:var(--surface);border-color:var(--ink)}.ent .av.on{background:#fff3d6!important;color:#b7791f!important}.ent .av.gone{background:var(--seg)!important;color:var(--muted)!important}.try-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px}.try-grid .field.wide{grid-column:1 / -1}.tile.full{grid-column:span 2;grid-row:span 3;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:6px}.tile.full .ic{font-size:34px}.tile.full .lead{flex:0 0 auto;align-content:center;justify-items:center}.tile.full .nm{font-size:14px}.tile.full .st{font-size:11px}.tile.full .ctl{margin-top:6px}.tile.full .mini-slider{width:60%}.tile .goto{font-size:10.5px;color:#5a5f66}.device.cyd .tile.full .ic{font-size:26px} diff --git a/screen_manager/app/static/assets/index-plSjhIie.js b/screen_manager/app/static/assets/index-plSjhIie.js deleted file mode 100644 index 6831a92..0000000 --- a/screen_manager/app/static/assets/index-plSjhIie.js +++ /dev/null @@ -1,28 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const l of i)if(l.type==="childList")for(const r of l.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(i){const l={};return i.integrity&&(l.integrity=i.integrity),i.referrerPolicy&&(l.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?l.credentials="include":i.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function s(i){if(i.ep)return;i.ep=!0;const l=n(i);fetch(i.href,l)}})();function Jo(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Re={},Un=[],Kt=()=>{},hr=()=>!1,Ei=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ai=e=>e.startsWith("onUpdate:"),tt=Object.assign,Xo=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Nu=Object.prototype.hasOwnProperty,Te=(e,t)=>Nu.call(e,t),pe=Array.isArray,wn=e=>Hs(e)==="[object Map]",rn=e=>Hs(e)==="[object Set]",Il=e=>Hs(e)==="[object Date]",_e=e=>typeof e=="function",We=e=>typeof e=="string",qt=e=>typeof e=="symbol",Pe=e=>e!==null&&typeof e=="object",mr=e=>(Pe(e)||_e(e))&&_e(e.then)&&_e(e.catch),br=Object.prototype.toString,Hs=e=>br.call(e),Fu=e=>Hs(e).slice(8,-1),vr=e=>Hs(e)==="[object Object]",Zo=e=>We(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ys=Jo(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Pi=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Du=/-\w/g,ct=Pi(e=>e.replace(Du,t=>t.slice(1).toUpperCase())),Uu=/\B([A-Z])/g,En=Pi(e=>e.replace(Uu,"-$1").toLowerCase()),Oi=Pi(e=>e.charAt(0).toUpperCase()+e.slice(1)),Gi=Pi(e=>e?`on${Oi(e)}`:""),Bt=(e,t)=>!Object.is(e,t),si=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Ii=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Ll;const Li=()=>Ll||(Ll=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ue(e){if(pe(e)){const t={};for(let n=0;nn.startsWith("/*")?"":n).split(ju).forEach(n=>{if(n){const s=n.split(Hu);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function he(e){let t="";if(We(e))t=e;else if(pe(e))for(let n=0;nRt(n,t))}const yr=e=>!!(e&&e.__v_isRef===!0),d=e=>We(e)?e:e==null?"":pe(e)||Pe(e)&&(e.toString===br||!_e(e.toString))?yr(e)?d(e.value):JSON.stringify(e,wr,2):String(e),wr=(e,t)=>yr(t)?wr(e,t.value):wn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,i],l)=>(n[Ji(s,l)+" =>"]=i,n),{})}:rn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Ji(n))}:qt(t)?Ji(t):Pe(t)&&!pe(t)&&!vr(t)?String(t):t,Ji=(e,t="")=>{var n;return qt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};let Je;class kr{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&Je&&(Je.active?(this.parent=Je,this.index=(Je.scopes||(Je.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes){const s=this.scopes.slice();for(t=0,n=s.length;t0&&--this._on===0){if(Je===this)Je=this.prevScope;else{let t=Je;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(ks){let t=ks;for(ks=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;ws;){let t=ws;for(ws=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Tr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Er(e){let t,n=e.depsTail,s=n;for(;s;){const i=s.prevDep;s.version===-1?(s===n&&(n=i),nl(s),Ju(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=i}e.deps=t,e.depsTail=n}function yo(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ar(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ar(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ts)||(e.globalVersion=Ts,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!yo(e))))return;e.flags|=2;const t=e.dep,n=Ne,s=Mt;Ne=e,Mt=!0;try{Tr(e);const i=e.fn(e._value);(t.version===0||Bt(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{Ne=n,Mt=s,Er(e),e.flags&=-3}}function nl(e,t=!1){const{dep:n,prevSub:s,nextSub:i}=e;if(s&&(s.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let l=n.computed.deps;l;l=l.nextDep)nl(l,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ju(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Mt=!0;const Pr=[];function cn(){Pr.push(Mt),Mt=!1}function un(){const e=Pr.pop();Mt=e===void 0?!0:e}function Nl(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Ne;Ne=void 0;try{t()}finally{Ne=n}}}let Ts=0;class Xu{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class sl{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Ne||!Mt||Ne===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Ne)n=this.activeLink=new Xu(Ne,this),Ne.deps?(n.prevDep=Ne.depsTail,Ne.depsTail.nextDep=n,Ne.depsTail=n):Ne.deps=Ne.depsTail=n,Or(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=Ne.depsTail,n.nextDep=void 0,Ne.depsTail.nextDep=n,Ne.depsTail=n,Ne.deps===n&&(Ne.deps=s)}return n}trigger(t){this.version++,Ts++,this.notify(t)}notify(t){el();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{tl()}}}function Or(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Or(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const wo=new WeakMap,Hn=Symbol(""),ko=Symbol(""),Es=Symbol("");function nt(e,t,n){if(Mt&&Ne){let s=wo.get(e);s||wo.set(e,s=new Map);let i=s.get(n);i||(s.set(n,i=new sl),i.map=s,i.key=n),i.track()}}function en(e,t,n,s,i,l){const r=wo.get(e);if(!r){Ts++;return}const u=f=>{f&&f.trigger()};if(el(),t==="clear")r.forEach(u);else{const f=pe(e),h=f&&Zo(n);if(f&&n==="length"){const p=Number(s);r.forEach((b,v)=>{(v==="length"||v===Es||!qt(v)&&v>=p)&&u(b)})}else switch((n!==void 0||r.has(void 0))&&u(r.get(n)),h&&u(r.get(Es)),t){case"add":f?h&&u(r.get("length")):(u(r.get(Hn)),wn(e)&&u(r.get(ko)));break;case"delete":f||(u(r.get(Hn)),wn(e)&&u(r.get(ko)));break;case"set":wn(e)&&u(r.get(Hn));break}}tl()}function Gn(e){const t=xe(e);return t===e||(nt(t,"iterate",Es),Ct(e))?t:Yt(e)?kn(e)?t.map(n=>$n(Pt(n))):t.map($n):t.map(Pt)}function Mi(e){return nt(e=xe(e),"iterate",Es),e}function Vt(e,t){return Yt(e)?$n(kn(e)?Pt(t):t):Pt(t)}const Zu={__proto__:null,[Symbol.iterator](){return Zi(this,Symbol.iterator,e=>Vt(this,e))},concat(...e){return Gn(this).concat(...e.map(t=>pe(t)?Gn(t):t))},entries(){return Zi(this,"entries",e=>(e[1]=Vt(this,e[1]),e))},every(e,t){return Gt(this,"every",e,t,void 0,arguments)},filter(e,t){return Gt(this,"filter",e,t,n=>n.map(s=>Vt(this,s)),arguments)},find(e,t){return Gt(this,"find",e,t,n=>Vt(this,n),arguments)},findIndex(e,t){return Gt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Gt(this,"findLast",e,t,n=>Vt(this,n),arguments)},findLastIndex(e,t){return Gt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Gt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Qi(this,"includes",e)},indexOf(...e){return Qi(this,"indexOf",e)},join(e){return Gn(this).join(e)},lastIndexOf(...e){return Qi(this,"lastIndexOf",e)},map(e,t){return Gt(this,"map",e,t,void 0,arguments)},pop(){return ds(this,"pop")},push(...e){return ds(this,"push",e)},reduce(e,...t){return Fl(this,"reduce",e,t)},reduceRight(e,...t){return Fl(this,"reduceRight",e,t)},shift(){return ds(this,"shift")},some(e,t){return Gt(this,"some",e,t,void 0,arguments)},splice(...e){return ds(this,"splice",e)},toReversed(){return Gn(this).toReversed()},toSorted(e){return Gn(this).toSorted(e)},toSpliced(...e){return Gn(this).toSpliced(...e)},unshift(...e){return ds(this,"unshift",e)},values(){return Zi(this,"values",e=>Vt(this,e))}};function Zi(e,t,n){const s=Mi(e),i=s[t]();return s!==e&&!Ct(e)&&(i._next=i.next,i.next=()=>{const l=i._next();return l.done||(l.value=n(l.value)),l}),i}const Qu=Array.prototype;function Gt(e,t,n,s,i,l){const r=Mi(e),u=r!==e&&!Ct(e),f=r[t];if(f!==Qu[t]){const b=f.apply(e,l);return u?Pt(b):b}let h=n;r!==e&&(u?h=function(b,v){return n.call(this,Vt(e,b),v,e)}:n.length>2&&(h=function(b,v){return n.call(this,b,v,e)}));const p=f.call(r,h,s);return u&&i?i(p):p}function Fl(e,t,n,s){const i=Mi(e),l=i!==e&&!Ct(e);let r=n,u=!1;i!==e&&(l?(u=s.length===0,r=function(h,p,b){return u&&(u=!1,h=Vt(e,h)),n.call(this,h,Vt(e,p),b,e)}):n.length>3&&(r=function(h,p,b){return n.call(this,h,p,b,e)}));const f=i[t](r,...s);return u?Vt(e,f):f}function Qi(e,t,n){const s=xe(e);nt(s,"iterate",Es);const i=s[t](...n);return(i===-1||i===!1)&&ll(n[0])?(n[0]=xe(n[0]),s[t](...n)):i}function ds(e,t,n=[]){cn(),el();const s=xe(e)[t].apply(e,n);return tl(),un(),s}const ed=Jo("__proto__,__v_isRef,__isVue"),Ir=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(qt));function td(e){qt(e)||(e=String(e));const t=xe(this);return nt(t,"has",e),t.hasOwnProperty(e)}class Lr{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const i=this._isReadonly,l=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return l;if(n==="__v_raw")return s===(i?l?dd:Fr:l?Nr:Rr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const r=pe(t);if(!i){let f;if(r&&(f=Zu[n]))return f;if(n==="hasOwnProperty")return td}const u=Reflect.get(t,n,et(t)?t:s);if((qt(n)?Ir.has(n):ed(n))||(i||nt(t,"get",n),l))return u;if(et(u)){const f=r&&Zo(n)?u:u.value;return i&&Pe(f)?xo(f):f}return Pe(u)?i?xo(u):qn(u):u}}class Mr extends Lr{constructor(t=!1){super(!1,t)}set(t,n,s,i){let l=t[n];const r=pe(t)&&Zo(n);if(!this._isShallow){const h=Yt(l);if(!Ct(s)&&!Yt(s)&&(l=xe(l),s=xe(s)),!r&&et(l)&&!et(s))return h||(l.value=s),!0}const u=r?Number(n)e,Gs=e=>Reflect.getPrototypeOf(e);function ld(e,t,n){return function(...s){const i=this.__v_raw,l=xe(i),r=wn(l),u=e==="entries"||e===Symbol.iterator&&r,f=e==="keys"&&r,h=i[e](...s),p=n?$o:t?$n:Pt;return!t&&nt(l,"iterate",f?ko:Hn),tt(Object.create(h),{next(){const{value:b,done:v}=h.next();return v?{value:b,done:v}:{value:u?[p(b[0]),p(b[1])]:p(b),done:v}}})}}function Js(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function ad(e,t){const n={get(i){const l=this.__v_raw,r=xe(l),u=xe(i);e||(Bt(i,u)&&nt(r,"get",i),nt(r,"get",u));const{has:f}=Gs(r),h=t?$o:e?$n:Pt;if(f.call(r,i))return h(l.get(i));if(f.call(r,u))return h(l.get(u));l!==r&&l.get(i)},get size(){const i=this.__v_raw;return!e&&nt(xe(i),"iterate",Hn),i.size},has(i){const l=this.__v_raw,r=xe(l),u=xe(i);return e||(Bt(i,u)&&nt(r,"has",i),nt(r,"has",u)),i===u?l.has(i):l.has(i)||l.has(u)},forEach(i,l){const r=this,u=r.__v_raw,f=xe(u),h=t?$o:e?$n:Pt;return!e&&nt(f,"iterate",Hn),u.forEach((p,b)=>i.call(l,h(p),h(b),r))}};return tt(n,e?{add:Js("add"),set:Js("set"),delete:Js("delete"),clear:Js("clear")}:{add(i){const l=xe(this),r=Gs(l),u=xe(i),f=!t&&!Ct(i)&&!Yt(i)?u:i;return r.has.call(l,f)||Bt(i,f)&&r.has.call(l,i)||Bt(u,f)&&r.has.call(l,u)||(l.add(f),en(l,"add",f,f)),this},set(i,l){!t&&!Ct(l)&&!Yt(l)&&(l=xe(l));const r=xe(this),{has:u,get:f}=Gs(r);let h=u.call(r,i);h||(i=xe(i),h=u.call(r,i));const p=f.call(r,i);return r.set(i,l),h?Bt(l,p)&&en(r,"set",i,l):en(r,"add",i,l),this},delete(i){const l=xe(this),{has:r,get:u}=Gs(l);let f=r.call(l,i);f||(i=xe(i),f=r.call(l,i)),u&&u.call(l,i);const h=l.delete(i);return f&&en(l,"delete",i,void 0),h},clear(){const i=xe(this),l=i.size!==0,r=i.clear();return l&&en(i,"clear",void 0,void 0),r}}),["keys","values","entries",Symbol.iterator].forEach(i=>{n[i]=ld(i,e,t)}),n}function il(e,t){const n=ad(e,t);return(s,i,l)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?s:Reflect.get(Te(n,i)&&i in s?n:s,i,l)}const rd={get:il(!1,!1)},cd={get:il(!1,!0)},ud={get:il(!0,!1)};const Rr=new WeakMap,Nr=new WeakMap,Fr=new WeakMap,dd=new WeakMap;function fd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function qn(e){return Yt(e)?e:ol(e,!1,sd,rd,Rr)}function pd(e){return ol(e,!1,od,cd,Nr)}function xo(e){return ol(e,!0,id,ud,Fr)}function ol(e,t,n,s,i){if(!Pe(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const l=i.get(e);if(l)return l;const r=fd(Fu(e));if(r===0)return e;const u=new Proxy(e,r===2?s:n);return i.set(e,u),u}function kn(e){return Yt(e)?kn(e.__v_raw):!!(e&&e.__v_isReactive)}function Yt(e){return!!(e&&e.__v_isReadonly)}function Ct(e){return!!(e&&e.__v_isShallow)}function ll(e){return e?!!e.__v_raw:!1}function xe(e){const t=e&&e.__v_raw;return t?xe(t):e}function hd(e){return!Te(e,"__v_skip")&&Object.isExtensible(e)&&gr(e,"__v_skip",!0),e}const Pt=e=>Pe(e)?qn(e):e,$n=e=>Pe(e)?xo(e):e;function et(e){return e?e.__v_isRef===!0:!1}function $e(e){return Dr(e,!1)}function md(e){return Dr(e,!0)}function Dr(e,t){return et(e)?e:new bd(e,t)}class bd{constructor(t,n){this.dep=new sl,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:xe(t),this._value=n?t:Pt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Ct(t)||Yt(t);t=s?t:xe(t),Bt(t,n)&&(this._rawValue=t,this._value=s?t:Pt(t),this.dep.trigger())}}function a(e){return et(e)?e.value:e}const vd={get:(e,t,n)=>t==="__v_raw"?e:a(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const i=e[t];return et(i)&&!et(n)?(i.value=n,!0):Reflect.set(e,t,n,s)}};function Ur(e){return kn(e)?e:new Proxy(e,vd)}class gd{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new sl(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ts-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&Ne!==this)return Cr(this,!0),!0}get value(){const t=this.dep.track();return Ar(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function _d(e,t,n=!1){let s,i;return _e(e)?s=e:(s=e.get,i=e.set),new gd(s,i,n)}const Xs={},ai=new WeakMap;let Fn;function yd(e,t=!1,n=Fn){if(n){let s=ai.get(n);s||ai.set(n,s=[]),s.push(e)}}function wd(e,t,n=Re){const{immediate:s,deep:i,once:l,scheduler:r,augmentJob:u,call:f}=n,h=C=>i?C:Ct(C)||i===!1||i===0?tn(C,1):tn(C);let p,b,v,y,I=!1,T=!1;if(et(e)?(b=()=>e.value,I=Ct(e)):kn(e)?(b=()=>h(e),I=!0):pe(e)?(T=!0,I=e.some(C=>kn(C)||Ct(C)),b=()=>e.map(C=>{if(et(C))return C.value;if(kn(C))return h(C);if(_e(C))return f?f(C,2):C()})):_e(e)?t?b=f?()=>f(e,2):e:b=()=>{if(v){cn();try{v()}finally{un()}}const C=Fn;Fn=p;try{return f?f(e,3,[y]):e(y)}finally{Fn=C}}:b=Kt,t&&i){const C=b,K=i===!0?1/0:i;b=()=>tn(C(),K)}const k=$r(),A=()=>{p.stop(),k&&k.active&&Xo(k.effects,p)};if(l&&t){const C=t;t=(...K)=>{const O=C(...K);return A(),O}}let S=T?new Array(e.length).fill(Xs):Xs;const U=C=>{if(!(!(p.flags&1)||!p.dirty&&!C))if(t){const K=p.run();if(C||i||I||(T?K.some((O,E)=>Bt(O,S[E])):Bt(K,S))){v&&v();const O=Fn;Fn=p;try{const E=[K,S===Xs?void 0:T&&S[0]===Xs?[]:S,y];S=K,f?f(t,3,E):t(...E)}finally{Fn=O}}}else p.run()};return u&&u(U),p=new xr(b),p.scheduler=r?()=>r(U,!1):U,y=C=>yd(C,!1,p),v=p.onStop=()=>{const C=ai.get(p);if(C){if(f)f(C,4);else for(const K of C)K();ai.delete(p)}},t?s?U(!0):S=p.run():r?r(U.bind(null,!0),!0):p.run(),A.pause=p.pause.bind(p),A.resume=p.resume.bind(p),A.stop=A,A}function tn(e,t=1/0,n){if(t<=0||!Pe(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,et(e))tn(e.value,t,n);else if(pe(e))for(let s=0;s{tn(s,t,n)});else if(vr(e)){for(const s in e)tn(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&tn(e[s],t,n)}return e}function Vs(e,t,n,s){try{return s?e(...s):e()}catch(i){Ri(i,t,n)}}function Nt(e,t,n,s){if(_e(e)){const i=Vs(e,t,n,s);return i&&mr(i)&&i.catch(l=>{Ri(l,t,n)}),i}if(pe(e)){const i=[];for(let l=0;l>>1,i=rt[s],l=As(i);l=As(n)?rt.push(e):rt.splice($d(t),0,e),e.flags|=1,Hr()}}function Hr(){ri||(ri=jr.then(Wr))}function xd(e){if(!pe(e))gn&&e.id===-1?gn.splice(Jn+1,0,e):e.flags&1||(Qn.push(e),e.flags|=1);else for(let t=0;tAs(n)-As(s));if(Qn.length=0,gn){for(let n=0;ne.id==null?e.flags&2?-1:1/0:e.id;function Wr(e){try{for(jt=0;jt{s._d&&fi(-1);const l=ci(t),r=Vn.length;let u;try{u=e(...i)}finally{for(let f=Vn.length;f>r;f--)bc();ci(l),s._d&&fi(1)}return u};return s._n=!0,s._c=!0,s._d=!0,s}function Ee(e,t){if(bt===null)return e;const n=ji(bt),s=e.dirs||(e.dirs=[]);for(let i=0;i1)return n&&_e(t)?t.call(s&&s.proxy):t}}const Cd=Symbol.for("v-scx"),Td=()=>$s(Cd);function Tt(e,t,n){return Kr(e,t,n)}function Kr(e,t,n=Re){const{immediate:s,deep:i,flush:l,once:r}=n,u=tt({},n),f=t&&s||!t&&l!=="post";let h;if(Is){if(l==="sync"){const y=Td();h=y.__watcherHandles||(y.__watcherHandles=[])}else if(!f){const y=()=>{};return y.stop=Kt,y.resume=Kt,y.pause=Kt,y}}const p=st;u.call=(y,I,T)=>Nt(y,p,I,T);let b=!1;l==="post"?u.scheduler=y=>{dt(y,p&&p.suspense)}:l!=="sync"&&(b=!0,u.scheduler=(y,I)=>{I?y():al(y)}),u.augmentJob=y=>{t&&(y.flags|=4),b&&(y.flags|=2,p&&(y.id=p.uid,y.i=p))};const v=wd(e,t,u);return Is&&(h?h.push(v):f&&v()),v}function Ed(e,t,n){const s=this.proxy,i=We(e)?e.includes(".")?zr(s,e):()=>s[e]:e.bind(s,s);let l;_e(t)?l=t:(l=t.handler,n=t);const r=Ks(this),u=Kr(i,l.bind(s),n);return r(),u}function zr(e,t){const n=t.split(".");return()=>{let s=e;for(let i=0;ie.__isTeleport,eo=Symbol("_leaveCb");function Pd(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==dn){t=n;break}}return t}function qr(e){if(!cl(e))return Fi(e.type)&&e.children?Pd(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&_e(n.default))return n.default()}}function rl(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;const n=e.component.subTree;rl(Fi(n.type)&&qr(n)||n,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Le(e,t){return _e(e)?tt({name:e.name},t,{setup:e}):e}function Yr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Ul(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const ui=new WeakMap;function xs(e,t,n,s,i=!1){if(pe(e)){e.forEach((T,k)=>xs(T,t&&(pe(t)?t[k]:t),n,s,i));return}if(Ss(s)&&!i){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&xs(e,t,n,s.component.subTree);return}const l=s.shapeFlag&4?ji(s.component):s.el,r=i?null:l,{i:u,r:f}=e,h=t&&t.r,p=u.refs===Re?u.refs={}:u.refs,b=u.setupState,v=xe(b),y=b===Re?hr:T=>Ul(p,T)?!1:Te(v,T),I=(T,k)=>!(k&&Ul(p,k));if(h!=null&&h!==f){if(jl(t),We(h))p[h]=null,y(h)&&(b[h]=null);else if(et(h)){const T=t;I(h,T.k)&&(h.value=null),T.k&&(p[T.k]=null)}}if(_e(f))Vs(f,u,12,[r,p]);else{const T=We(f),k=et(f);if(T||k){const A=()=>{if(e.f){const S=T?y(f)?b[f]:p[f]:I()||!e.k?f.value:p[e.k];if(i)pe(S)&&Xo(S,l);else if(pe(S))S.includes(l)||S.push(l);else if(T)p[f]=[l],y(f)&&(b[f]=p[f]);else{const U=[l];I(f,e.k)&&(f.value=U),e.k&&(p[e.k]=U)}}else T?(p[f]=r,y(f)&&(b[f]=r)):k&&(I(f,e.k)&&(f.value=r),e.k&&(p[e.k]=r))};if(r){const S=()=>{A(),ui.delete(e)};S.id=-1,ui.set(e,S),dt(S,n)}else jl(e),A()}}}function jl(e){const t=ui.get(e);t&&(t.flags|=8,ui.delete(e))}Li().requestIdleCallback;Li().cancelIdleCallback;const Ss=e=>!!e.type.__asyncLoader,cl=e=>e.type.__isKeepAlive;function Od(e,t){Gr(e,"a",t)}function Id(e,t){Gr(e,"da",t)}function Gr(e,t,n=st){const s=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Di(t,s,n),n){let i=n.parent;for(;i&&i.parent;)cl(i.parent.vnode)&&Ld(s,t,n,i),i=i.parent}}function Ld(e,t,n,s){const i=Di(t,e,s,!0);ul(()=>{Xo(s[t],i)},n)}function Di(e,t,n=st,s=!1){if(n){const i=n[e]||(n[e]=[]),l=t.__weh||(t.__weh=(...r)=>{cn();const u=Ks(n),f=Nt(t,n,e,r);return u(),un(),f});return s?i.unshift(l):i.push(l),l}}const mn=e=>(t,n=st)=>{(!Is||e==="sp")&&Di(e,(...s)=>t(...s),n)},Md=mn("bm"),An=mn("m"),Rd=mn("bu"),Nd=mn("u"),rs=mn("bum"),ul=mn("um"),Fd=mn("sp"),Dd=mn("rtg"),Ud=mn("rtc");function jd(e,t=st){Di("ec",e,t)}const Jr="components";function Ws(e,t){return Zr(Jr,e,!0,t)||e}const Xr=Symbol.for("v-ndc");function Hd(e){return We(e)?Zr(Jr,e,!1)||e:e||Xr}function Zr(e,t,n=!0,s=!1){const i=bt||st;if(i){const l=i.type;{const u=Sf(l,!1);if(u&&(u===t||u===ct(t)||u===Oi(ct(t))))return l}const r=Hl(i[e]||l[e],t)||Hl(i.appContext[e],t);return!r&&s?l:r}}function Hl(e,t){return e&&(e[t]||e[ct(t)]||e[Oi(ct(t))])}function me(e,t,n,s){let i;const l=n,r=pe(e);if(r||We(e)){const u=r&&kn(e);let f=!1,h=!1;u&&(f=!Ct(e),h=Yt(e),e=Mi(e)),i=new Array(e.length);for(let p=0,b=e.length;pt(u,f,void 0,l));else{const u=Object.keys(e);i=new Array(u.length);for(let f=0,h=u.length;fe?yc(e)?ji(e):So(e.parent):null,Cs=tt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>So(e.parent),$root:e=>So(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>ec(e),$forceUpdate:e=>e.f||(e.f=()=>{al(e.update)}),$nextTick:e=>e.n||(e.n=Ni.bind(e.proxy)),$watch:e=>Ed.bind(e)}),to=(e,t)=>e!==Re&&!e.__isScriptSetup&&Te(e,t),Vd={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:i,props:l,accessCache:r,type:u,appContext:f}=e;if(t[0]!=="$"){const v=r[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return i[t];case 4:return n[t];case 3:return l[t]}else{if(to(s,t))return r[t]=1,s[t];if(i!==Re&&Te(i,t))return r[t]=2,i[t];if(Te(l,t))return r[t]=3,l[t];if(n!==Re&&Te(n,t))return r[t]=4,n[t];Co&&(r[t]=0)}}const h=Cs[t];let p,b;if(h)return t==="$attrs"&&nt(e.attrs,"get",""),h(e);if((p=u.__cssModules)&&(p=p[t]))return p;if(n!==Re&&Te(n,t))return r[t]=4,n[t];if(b=f.config.globalProperties,Te(b,t))return b[t]},set({_:e},t,n){const{data:s,setupState:i,ctx:l}=e;return to(i,t)?(i[t]=n,!0):s!==Re&&Te(s,t)?(s[t]=n,!0):Te(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:i,props:l,type:r}},u){let f;return!!(n[u]||e!==Re&&u[0]!=="$"&&Te(e,u)||to(t,u)||Te(l,u)||Te(s,u)||Te(Cs,u)||Te(i.config.globalProperties,u)||(f=r.__cssModules)&&f[u])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Te(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Vl(e){return pe(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Co=!0;function Wd(e){const t=ec(e),n=e.proxy,s=e.ctx;Co=!1,t.beforeCreate&&Wl(t.beforeCreate,e,"bc");const{data:i,computed:l,methods:r,watch:u,provide:f,inject:h,created:p,beforeMount:b,mounted:v,beforeUpdate:y,updated:I,activated:T,deactivated:k,beforeDestroy:A,beforeUnmount:S,destroyed:U,unmounted:C,render:K,renderTracked:O,renderTriggered:E,errorCaptured:R,serverPrefetch:L,expose:D,inheritAttrs:M,components:Y,directives:te,filters:ye}=t;if(h&&Bd(h,s,null),r)for(const ge in r){const we=r[ge];_e(we)&&(s[ge]=we.bind(n))}if(i){const ge=i.call(n,n);Pe(ge)&&(e.data=qn(ge))}if(Co=!0,l)for(const ge in l){const we=l[ge],Ge=_e(we)?we.bind(n,n):_e(we.get)?we.get.bind(n,n):Kt,qe=!_e(we)&&_e(we.set)?we.set.bind(n):Kt,le=$({get:Ge,set:qe});Object.defineProperty(s,ge,{enumerable:!0,configurable:!0,get:()=>le.value,set:Z=>le.value=Z})}if(u)for(const ge in u)Qr(u[ge],s,n,ge);if(f){const ge=_e(f)?f.call(n):f;Reflect.ownKeys(ge).forEach(we=>{Sd(we,ge[we])})}p&&Wl(p,e,"c");function be(ge,we){pe(we)?we.forEach(Ge=>ge(Ge.bind(n))):we&&ge(we.bind(n))}if(be(Md,b),be(An,v),be(Rd,y),be(Nd,I),be(Od,T),be(Id,k),be(jd,R),be(Ud,O),be(Dd,E),be(rs,S),be(ul,C),be(Fd,L),pe(D))if(D.length){const ge=e.exposed||(e.exposed={});D.forEach(we=>{Object.defineProperty(ge,we,{get:()=>n[we],set:Ge=>n[we]=Ge,enumerable:!0})})}else e.exposed||(e.exposed={});K&&e.render===Kt&&(e.render=K),M!=null&&(e.inheritAttrs=M),Y&&(e.components=Y),te&&(e.directives=te),L&&Yr(e)}function Bd(e,t,n=Kt){pe(e)&&(e=To(e));for(const s in e){const i=e[s];let l;Pe(i)?"default"in i?l=$s(i.from||s,i.default,!0):l=$s(i.from||s):l=$s(i),et(l)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>l.value,set:r=>l.value=r}):t[s]=l}}function Wl(e,t,n){Nt(pe(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Qr(e,t,n,s){let i=s.includes(".")?zr(n,s):()=>n[s];if(We(e)){const l=t[e];_e(l)&&Tt(i,l)}else if(_e(e))Tt(i,e.bind(n));else if(Pe(e))if(pe(e))e.forEach(l=>Qr(l,t,n,s));else{const l=_e(e.handler)?e.handler.bind(n):t[e.handler];_e(l)&&Tt(i,l,e)}}function ec(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:i,optionsCache:l,config:{optionMergeStrategies:r}}=e.appContext,u=l.get(t);let f;return u?f=u:!i.length&&!n&&!s?f=t:(f={},i.length&&i.forEach(h=>di(f,h,r,!0)),di(f,t,r)),Pe(t)&&l.set(t,f),f}function di(e,t,n,s=!1){const{mixins:i,extends:l}=t;l&&di(e,l,n,!0),i&&i.forEach(r=>di(e,r,n,!0));for(const r in t)if(!(s&&r==="expose")){const u=Kd[r]||n&&n[r];e[r]=u?u(e[r],t[r]):t[r]}return e}const Kd={data:Bl,props:Kl,emits:Kl,methods:ms,computed:ms,beforeCreate:lt,created:lt,beforeMount:lt,mounted:lt,beforeUpdate:lt,updated:lt,beforeDestroy:lt,beforeUnmount:lt,destroyed:lt,unmounted:lt,activated:lt,deactivated:lt,errorCaptured:lt,serverPrefetch:lt,components:ms,directives:ms,watch:qd,provide:Bl,inject:zd};function Bl(e,t){return t?e?function(){return tt(_e(e)?e.call(this,this):e,_e(t)?t.call(this,this):t)}:t:e}function zd(e,t){return ms(To(e),To(t))}function To(e){if(pe(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${ct(t)}Modifiers`]||e[`${En(t)}Modifiers`];function Xd(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Re;let i=n;const l=t.startsWith("update:"),r=l&&Jd(s,t.slice(7));r&&(r.trim&&(i=n.map(p=>We(p)?p.trim():p)),r.number&&(i=i.map(Ii)));let u,f=s[u=Gi(t)]||s[u=Gi(ct(t))];!f&&l&&(f=s[u=Gi(En(t))]),f&&Nt(f,e,6,i);const h=s[u+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[u])return;e.emitted[u]=!0,Nt(h,e,6,i)}}const Zd=new WeakMap;function nc(e,t,n=!1){const s=n?Zd:t.emitsCache,i=s.get(e);if(i!==void 0)return i;const l=e.emits;let r={},u=!1;if(!_e(e)){const f=h=>{const p=nc(h,t,!0);p&&(u=!0,tt(r,p))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!l&&!u?(Pe(e)&&s.set(e,null),null):(pe(l)?l.forEach(f=>r[f]=null):tt(r,l),Pe(e)&&s.set(e,r),r)}function Ui(e,t){return!e||!Ei(t)?!1:(t=t.slice(2),t=t==="Once"?t:t.replace(/Once$/,""),Te(e,t[0].toLowerCase()+t.slice(1))||Te(e,En(t))||Te(e,t))}function zl(e){const{type:t,vnode:n,proxy:s,withProxy:i,propsOptions:[l],slots:r,attrs:u,emit:f,render:h,renderCache:p,props:b,data:v,setupState:y,ctx:I,inheritAttrs:T}=e,k=ci(e);let A,S;try{if(n.shapeFlag&4){const C=i||s,K=C;A=Wt(h.call(K,C,p,b,y,v,I)),S=u}else{const C=t;A=Wt(C.length>1?C(b,{attrs:u,slots:r,emit:f}):C(b,null)),S=t.props?u:Qd(u)}}catch(C){Vn.length=0,Ri(C,e,1),A=se(dn)}let U=A;if(S&&T!==!1){const C=Object.keys(S),{shapeFlag:K}=U;C.length&&K&7&&(l&&C.some(Ai)&&(S=ef(S,l)),U=ss(U,S,!1,!0))}if(n.dirs&&(U=ss(U,null,!1,!0),U.dirs=U.dirs?U.dirs.concat(n.dirs):n.dirs),n.transition){const C=Fi(U.type)&&qr(U)||U;rl(C,n.transition)}return A=U,ci(k),A}const Qd=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ei(n))&&((t||(t={}))[n]=e[n]);return t},ef=(e,t)=>{const n={};for(const s in e)(!Ai(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function tf(e,t,n){const{props:s,children:i,component:l}=e,{props:r,children:u,patchFlag:f}=t,h=l.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return s?ql(s,r,h):!!r;if(f&8){const p=t.dynamicProps;for(let b=0;bObject.create(ic),lc=e=>Object.getPrototypeOf(e)===ic;function sf(e,t,n,s=!1){const i={},l=oc();e.propsDefaults=Object.create(null),ac(e,t,i,l);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);n?e.props=s?i:pd(i):e.type.props?e.props=i:e.props=l,e.attrs=l}function of(e,t,n,s){const{props:i,attrs:l,vnode:{patchFlag:r}}=e,u=xe(i),[f]=e.propsOptions;let h=!1;if((s||r>0)&&!(r&16)){if(r&8){const p=e.vnode.dynamicProps;for(let b=0;b{f=!0;const[v,y]=rc(b,t,!0);tt(r,v),y&&u.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!l&&!f)return Pe(e)&&s.set(e,Un),Un;if(pe(l))for(let p=0;pe==="_"||e==="_ctx"||e==="$stable",fl=e=>pe(e)?e.map(Wt):[Wt(e)],af=(e,t,n)=>{if(t._n)return t;const s=oe((...i)=>fl(t(...i)),n);return s._c=!1,s},cc=(e,t,n)=>{const s=e._ctx;for(const i in e){if(dl(i))continue;const l=e[i];if(_e(l))t[i]=af(i,l,s);else if(l!=null){const r=fl(l);t[i]=()=>r}}},uc=(e,t)=>{const n=fl(t);e.slots.default=()=>n},dc=(e,t,n)=>{for(const s in t)(n||!dl(s))&&(e[s]=t[s])},rf=(e,t,n)=>{const s=e.slots=oc();if(e.vnode.shapeFlag&32){const i=t._;i?(dc(s,t,n),n&&gr(s,"_",i,!0)):cc(t,s)}else t&&uc(e,t)},cf=(e,t,n)=>{const{vnode:s,slots:i}=e;let l=!0,r=Re;if(s.shapeFlag&32){const u=t._;u?n&&u===1?l=!1:dc(i,t,n):(l=!t.$stable,cc(t,i)),r=t}else t&&(uc(e,t),r={default:1});if(l)for(const u in i)!dl(u)&&r[u]==null&&delete i[u]},dt=hf;function uf(e){return df(e)}function df(e,t){const n=Li();n.__VUE__=!0;const{insert:s,remove:i,patchProp:l,createElement:r,createText:u,createComment:f,setText:h,setElementText:p,parentNode:b,nextSibling:v,setScopeId:y=Kt,insertStaticContent:I}=e,T=(w,x,N,z=null,j=null,V=null,X=void 0,J=null,G=!!x.dynamicChildren)=>{if(w===x)return;w&&!fs(w,x)&&(z=ie(w),Z(w,j,V,!0),w=null),x.patchFlag===-2&&(G=!1,x.dynamicChildren=null),x.dynamicChildren&&w&&w.dynamicChildren&&w.dynamicChildren.hasOnce&&(x.dynamicChildren===Un&&(x.dynamicChildren=[]),x.dynamicChildren.hasOnce=!0);const{type:H,ref:de,shapeFlag:ee}=x;switch(H){case Bs:k(w,x,N,z);break;case dn:A(w,x,N,z);break;case so:w==null&&S(x,N,z,X);break;case q:Y(w,x,N,z,j,V,X,J,G);break;default:ee&1?K(w,x,N,z,j,V,X,J,G):ee&6?te(w,x,N,z,j,V,X,J,G):(ee&64||ee&128)&&H.process(w,x,N,z,j,V,X,J,G,Mn)}de!=null&&j?xs(de,w&&w.ref,V,x||w,!x):de==null&&w&&w.ref!=null&&xs(w.ref,null,V,w,!0)},k=(w,x,N,z)=>{if(w==null)s(x.el=u(x.children),N,z);else{const j=x.el=w.el;x.children!==w.children&&h(j,x.children)}},A=(w,x,N,z)=>{w==null?s(x.el=f(x.children||""),N,z):x.el=w.el},S=(w,x,N,z)=>{[w.el,w.anchor]=I(w.children,x,N,z,w.el,w.anchor)},U=({el:w,anchor:x},N,z)=>{let j;for(;w&&w!==x;)j=v(w),s(w,N,z),w=j;s(x,N,z)},C=({el:w,anchor:x})=>{let N;for(;w&&w!==x;)N=v(w),i(w),w=N;i(x)},K=(w,x,N,z,j,V,X,J,G)=>{if(x.type==="svg"?X="svg":x.type==="math"&&(X="mathml"),w==null)O(x,N,z,j,V,X,J,G);else{const H=w.el&&w.el._isVueCE?w.el:null;try{H&&H._beginPatch(),L(w,x,j,V,X,J,G)}finally{H&&H._endPatch()}}},O=(w,x,N,z,j,V,X,J)=>{let G,H;const{props:de,shapeFlag:ee,transition:Q,dirs:P}=w;if(G=w.el=r(w.type,V,de&&de.is,de),ee&8?p(G,w.children):ee&16&&R(w.children,G,null,z,j,no(w,V),X,J),P&&Rn(w,null,z,"created"),E(G,w,w.scopeId,X,z),de){for(const ce in de)ce!=="value"&&!ys(ce)&&l(G,ce,null,de[ce],V,z);"value"in de&&l(G,"value",null,de.value,V),(H=de.onVnodeBeforeMount)&&Ut(H,z,w)}P&&Rn(w,null,z,"beforeMount");const F=ff(j,Q);F&&Q.beforeEnter(G),s(G,x,N),((H=de&&de.onVnodeMounted)||F||P)&&dt(()=>{H&&Ut(H,z,w),F&&Q.enter(G),P&&Rn(w,null,z,"mounted")},j)},E=(w,x,N,z,j)=>{if(N&&y(w,N),z)for(let V=0;V{for(let H=G;H{const J=x.el=w.el;let{patchFlag:G,dynamicChildren:H,dirs:de}=x;G|=w.patchFlag&16;const ee=w.props||Re,Q=x.props||Re;let P;if(N&&Nn(N,!1),(P=Q.onVnodeBeforeUpdate)&&Ut(P,N,x,w),de&&Rn(x,w,N,"beforeUpdate"),N&&Nn(N,!0),H&&(!w.dynamicChildren||w.dynamicChildren.length!==H.length)&&(G=0,X=!1,H=null),(ee.innerHTML&&Q.innerHTML==null||ee.textContent&&Q.textContent==null)&&p(J,""),H?D(w.dynamicChildren,H,J,N,z,no(x,j),V):X||we(w,x,J,null,N,z,no(x,j),V,!1),G>0){if(G&16)M(J,ee,Q,N,j);else if(G&2&&ee.class!==Q.class&&l(J,"class",null,Q.class,j),G&4&&l(J,"style",ee.style,Q.style,j),G&8){const F=x.dynamicProps;for(let ce=0;ce{P&&Ut(P,N,x,w),de&&Rn(x,w,N,"updated")},z)},D=(w,x,N,z,j,V,X)=>{for(let J=0;J{if(x!==N){if(x!==Re)for(const V in x)!ys(V)&&!(V in N)&&l(w,V,x[V],null,j,z);for(const V in N){if(ys(V))continue;const X=N[V],J=x[V];X!==J&&V!=="value"&&l(w,V,J,X,j,z)}"value"in N&&l(w,"value",x.value,N.value,j)}},Y=(w,x,N,z,j,V,X,J,G)=>{const H=x.el=w?w.el:u(""),de=x.anchor=w?w.anchor:u("");let{patchFlag:ee,dynamicChildren:Q,slotScopeIds:P}=x;P&&(J=J?J.concat(P):P),w==null?(s(H,N,z),s(de,N,z),R(x.children||[],N,de,j,V,X,J,G)):ee>0&&ee&64&&Q&&w.dynamicChildren&&w.dynamicChildren.length===Q.length?(D(w.dynamicChildren,Q,N,j,V,X,J),(x.key!=null||j&&x===j.subTree)&&fc(w,x,!0)):we(w,x,N,de,j,V,X,J,G)},te=(w,x,N,z,j,V,X,J,G)=>{x.slotScopeIds=J,w==null?x.shapeFlag&512?j.ctx.activate(x,N,z,X,G):ye(x,N,z,j,V,X,G):re(w,x,G)},ye=(w,x,N,z,j,V,X)=>{const J=w.component=yf(w,z,j);if(cl(w)&&(J.ctx.renderer=Mn),wf(J,!1,X),J.asyncDep){if(j&&j.registerDep(J,be,X),!w.el){const G=J.subTree=se(dn);A(null,G,x,N),w.placeholder=G.el}}else be(J,w,x,N,j,V,X)},re=(w,x,N)=>{const z=x.component=w.component;if(tf(w,x,N))if(z.asyncDep&&!z.asyncResolved){x.el=w.el,ge(z,x,N);return}else z.next=x,z.update();else x.el=w.el,z.vnode=x},be=(w,x,N,z,j,V,X)=>{const J=()=>{if(w.isMounted){let{next:ee,bu:Q,u:P,parent:F,vnode:ce}=w;{const kt=pc(w);if(kt){ee&&(ee.el=ce.el,ge(w,ee,X)),kt.asyncDep.then(()=>{dt(()=>{w.isUnmounted||H()},j)});return}}let fe=ee,Oe;Nn(w,!1),ee?(ee.el=ce.el,ge(w,ee,X)):ee=ce,Q&&si(Q),(Oe=ee.props&&ee.props.onVnodeBeforeUpdate)&&Ut(Oe,F,ee,ce),Nn(w,!0);const De=zl(w),Ve=w.subTree;w.subTree=De,T(Ve,De,b(Ve.el),ie(Ve),w,j,V),ee.el=De.el,fe===null&&nf(w,De.el),P&&dt(P,j),(Oe=ee.props&&ee.props.onVnodeUpdated)&&dt(()=>Ut(Oe,F,ee,ce),j)}else{let ee;const{el:Q,props:P}=x,{bm:F,m:ce,parent:fe,root:Oe,type:De}=w,Ve=Ss(x);Nn(w,!1),F&&si(F),!Ve&&(ee=P&&P.onVnodeBeforeMount)&&Ut(ee,fe,x),Nn(w,!0);{Oe.ce&&Oe.ce._hasShadowRoot()&&Oe.ce._injectChildStyle(De,w.parent?w.parent.type:void 0);const kt=w.subTree=zl(w);T(null,kt,N,z,w,j,V),x.el=kt.el}if(ce&&dt(ce,j),!Ve&&(ee=P&&P.onVnodeMounted)){const kt=x;dt(()=>Ut(ee,fe,kt),j)}(x.shapeFlag&256||fe&&Ss(fe.vnode)&&fe.vnode.shapeFlag&256)&&w.a&&dt(w.a,j),w.isMounted=!0,x=N=z=null}};w.scope.on();const G=w.effect=new xr(J);w.scope.off();const H=w.update=G.run.bind(G),de=w.job=G.runIfDirty.bind(G);de.i=w,de.id=w.uid,G.scheduler=()=>al(de),Nn(w,!0),H()},ge=(w,x,N)=>{x.component=w;const z=w.vnode.props;w.vnode=x,w.next=null,of(w,x.props,z,N),cf(w,x.children,N),cn(),Dl(w),un()},we=(w,x,N,z,j,V,X,J,G=!1)=>{const H=w&&w.children,de=w?w.shapeFlag:0,ee=x.children,{patchFlag:Q,shapeFlag:P}=x;if(Q>0){if(Q&128){qe(H,ee,N,z,j,V,X,J,G);return}else if(Q&256){Ge(H,ee,N,z,j,V,X,J,G);return}}P&8?(de&16&&ne(H,j,V),ee!==H&&p(N,ee)):de&16?P&16?qe(H,ee,N,z,j,V,X,J,G):ne(H,j,V,!0):(de&8&&p(N,""),P&16&&R(ee,N,z,j,V,X,J,G))},Ge=(w,x,N,z,j,V,X,J,G)=>{w=w||Un,x=x||Un;const H=w.length,de=x.length,ee=Math.min(H,de);let Q;for(Q=0;Qde?ne(w,j,V,!0,!1,ee):R(x,N,z,j,V,X,J,G,ee)},qe=(w,x,N,z,j,V,X,J,G)=>{let H=0;const de=x.length;let ee=w.length-1,Q=de-1;for(;H<=ee&&H<=Q;){const P=w[H],F=x[H]=G?Zt(x[H]):Wt(x[H]);if(fs(P,F))T(P,F,N,null,j,V,X,J,G);else break;H++}for(;H<=ee&&H<=Q;){const P=w[ee],F=x[Q]=G?Zt(x[Q]):Wt(x[Q]);if(fs(P,F))T(P,F,N,null,j,V,X,J,G);else break;ee--,Q--}if(H>ee){if(H<=Q){const P=Q+1,F=PQ)for(;H<=ee;)Z(w[H],j,V,!0),H++;else{const P=H,F=H,ce=new Map;for(H=F;H<=Q;H++){const ht=x[H]=G?Zt(x[H]):Wt(x[H]);ht.key!=null&&ce.set(ht.key,H)}let fe,Oe=0;const De=Q-F+1;let Ve=!1,kt=0;const Yn=new Array(De);for(H=0;H=De){Z(ht,j,V,!0);continue}let Dt;if(ht.key!=null)Dt=ce.get(ht.key);else for(fe=F;fe<=Q;fe++)if(Yn[fe-F]===0&&fs(ht,x[fe])){Dt=fe;break}Dt===void 0?Z(ht,j,V,!0):(Yn[Dt-F]=H+1,Dt>=kt?kt=Dt:Ve=!0,T(ht,x[Dt],N,null,j,V,X,J,G),Oe++)}const Al=Ve?pf(Yn):Un;for(fe=Al.length-1,H=De-1;H>=0;H--){const ht=F+H,Dt=x[ht],Pl=x[ht+1],Ol=ht+1{const{el:V,type:X,transition:J,children:G,shapeFlag:H}=w;if(H&6){le(w.component.subTree,x,N,z);return}if(H&128){w.suspense.move(x,N,z);return}if(H&64){X.move(w,x,N,Mn);return}if(X===q){s(V,x,N);for(let ee=0;eeJ.enter(V),j));else{const{leave:ee,delayLeave:Q,afterLeave:P}=J,F=()=>{w.ctx.isUnmounted?i(V):s(V,x,N)},ce=()=>{const fe=V._isLeaving||!!V[eo];V._isLeaving&&V[eo](!0),J.persisted&&!fe?F():ee(V,()=>{F(),P&&P()})};Q?Q(V,F,ce):ce()}else s(V,x,N)},Z=(w,x,N,z=!1,j=!1)=>{const{type:V,props:X,ref:J,children:G,dynamicChildren:H,shapeFlag:de,patchFlag:ee,dirs:Q,cacheIndex:P,memo:F}=w;if((ee===-2||H&&H.hasOnce)&&(j=!1),J!=null&&(cn(),xs(J,null,N,w,!0),un()),P!=null&&(!w.ctx||w.ctx===x)&&(x.renderCache[P]=void 0),de&256){x.ctx.deactivate(w);return}const ce=de&1&&Q,fe=!Ss(w);let Oe;if(fe&&(Oe=X&&X.onVnodeBeforeUnmount)&&Ut(Oe,x,w),de&6)B(w.component,N,z);else{if(de&128){w.suspense.unmount(N,z);return}ce&&Rn(w,null,x,"beforeUnmount"),de&64?w.type.remove(w,x,N,Mn,z):H&&!H.hasOnce&&(V!==q||ee>0&&ee&64)?ne(H,x,N,!1,!0):(V===q&&ee&384||!j&&de&16)&&ne(G,x,N),z&&ue(w)}const De=F!=null&&P==null;(fe&&(Oe=X&&X.onVnodeUnmounted)||ce||De)&&dt(()=>{Oe&&Ut(Oe,x,w),ce&&Rn(w,null,x,"unmounted"),De&&(w.el=null)},N)},ue=w=>{const{type:x,el:N,anchor:z,transition:j}=w;if(x===q){ke(N,z);return}if(x===so){C(w),j&&!j.persisted&&j.afterLeave&&j.afterLeave();return}const V=()=>{i(N),j&&!j.persisted&&j.afterLeave&&j.afterLeave()};if(w.shapeFlag&1&&j&&!j.persisted){const{leave:X,delayLeave:J}=j,G=()=>X(N,V);J?J(w.el,V,G):G()}else V()},ke=(w,x)=>{let N;for(;w!==x;)N=v(w),i(w),w=N;i(x)},B=(w,x,N)=>{const{bum:z,scope:j,job:V,subTree:X,um:J,m:G,a:H}=w;Gl(G),Gl(H),z&&si(z),j.stop(),V?(V.flags|=8,Z(X,w,x,N)):w.vnode.el&&X&&(X.transition=w.vnode.transition,Z(X,w,x,N)),J&&dt(J,x),dt(()=>{w.isUnmounted=!0},x)},ne=(w,x,N,z=!1,j=!1,V=0)=>{for(let X=V;X{if(w.shapeFlag&6)return ie(w.component.subTree);if(w.shapeFlag&128)return w.suspense.next();const x=v(w.anchor||w.el),N=x&&x[Ad];return N?v(N):x};let wt=!1;const Ln=(w,x,N)=>{let z;w==null?x._vnode&&(Z(x._vnode,null,null,!0),z=x._vnode.component):T(x._vnode||null,w,x,null,null,null,N),x._vnode=w,wt||(wt=!0,Dl(z),Vr(),wt=!1)},Mn={p:T,um:Z,m:le,r:ue,mt:ye,mc:R,pc:we,pbc:D,n:ie,o:e};return{render:Ln,hydrate:void 0,createApp:Gd(Ln)}}function no({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Nn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ff(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function fc(e,t,n=!1){const s=e.children,i=t.children;if(pe(s)&&pe(i))for(let l=0;l>1,e[n[u]]0&&(t[s]=n[l-1]),n[l]=s)}}for(l=n.length,r=n[l-1];l-- >0;)n[l]=r,r=t[r];return n}function pc(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:pc(t)}function Gl(e){if(e)for(let t=0;te.__isSuspense;function hf(e,t){t&&t.pendingBranch?pe(e)?t.effects.push(...e):t.effects.push(e):xd(e)}const q=Symbol.for("v-fgt"),Bs=Symbol.for("v-txt"),dn=Symbol.for("v-cmt"),so=Symbol.for("v-stc"),Vn=[];let vt=null;function g(e=!1){Vn.push(vt=e?null:[])}function bc(){Vn.pop(),vt=Vn[Vn.length-1]||null}let Ps=1;function fi(e,t=!1){Ps+=e,e<0&&vt&&t&&(vt.hasOnce=!0)}function vc(e){return e.dynamicChildren=Ps>0?vt||Un:null,bc(),Ps>0&&vt&&vt.push(e),e}function _(e,t,n,s,i,l){return vc(o(e,t,n,s,i,l,!0))}function it(e,t,n,s,i){return vc(se(e,t,n,s,i,!0))}function pi(e){return e?e.__v_isVNode===!0:!1}function fs(e,t){return e.type===t.type&&e.key===t.key}const gc=({key:e})=>e??null,ii=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?We(e)||et(e)||_e(e)?{i:bt,r:e,k:t,f:!!n}:e:null);function o(e,t=null,n=null,s=0,i=null,l=e===q?0:1,r=!1,u=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&gc(t),ref:t&&ii(t),scopeId:Br,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:s,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:bt};return u?(hi(f,n),l&128&&e.normalize(f)):n&&(f.shapeFlag|=We(n)?8:16),Ps>0&&!r&&vt&&(f.patchFlag>0||l&6)&&f.patchFlag!==32&&vt.push(f),f}const se=mf;function mf(e,t=null,n=null,s=0,i=null,l=!1){if((!e||e===Xr)&&(e=dn),pi(e)){const u=ss(e,t,!0);return n&&hi(u,n),Ps>0&&!l&&vt&&(u.shapeFlag&6?vt[vt.indexOf(e)]=u:vt.push(u)),u.patchFlag=-2,u}if(Cf(e)&&(e=e.__vccOpts),t){t=bf(t);let{class:u,style:f}=t;u&&!We(u)&&(t.class=he(u)),Pe(f)&&(ll(f)&&!pe(f)&&(f=tt({},f)),t.style=Ue(f))}const r=We(e)?1:mc(e)?128:Fi(e)?64:Pe(e)?4:_e(e)?2:0;return o(e,t,n,s,i,r,l,!0)}function bf(e){return e?ll(e)||lc(e)?tt({},e):e:null}function ss(e,t,n=!1,s=!1){const{props:i,ref:l,patchFlag:r,children:u,transition:f}=e,h=t?vf(i||{},t):i,p={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&gc(h),ref:t&&t.ref?n&&l?pe(l)?l.concat(ii(t)):[l,ii(t)]:ii(t):l,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:u,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==q?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ss(e.ssContent),ssFallback:e.ssFallback&&ss(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return f&&s&&rl(p,f.clone(p)),p}function Me(e=" ",t=0){return se(Bs,null,e,t)}function W(e="",t=!1){return t?(g(),it(dn,null,e)):se(dn,null,e)}function Wt(e){return e==null||typeof e=="boolean"?se(dn):pe(e)?se(q,null,e.slice()):pi(e)?Zt(e):se(Bs,null,String(e))}function Zt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ss(e)}function hi(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(pe(t))n=16;else if(typeof t=="object")if(s&65){const i=t.default;i&&(i._c&&(i._d=!1),hi(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!lc(t)?t._ctx=bt:i===3&&bt&&(bt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else if(_e(t)){if(s&65){hi(e,{default:t});return}t={default:t,_ctx:bt},n=32}else t=String(t),s&64?(n=16,t=[Me(t)]):n=8;e.children=t,e.shapeFlag|=n}function vf(...e){const t={};for(let n=0;nst||bt;let mi,Os;{const e=Li(),t=(n,s)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(s),l=>{i.length>1?i.forEach(r=>r(l)):i[0](l)}};mi=t("__VUE_INSTANCE_SETTERS__",n=>st=n),Os=t("__VUE_SSR_SETTERS__",n=>Is=n)}const Ks=e=>{const t=st;return mi(e),e.scope.on(),()=>{e.scope.off(),mi(t)}},Jl=()=>{st&&st.scope.off(),mi(null)};function yc(e){return e.vnode.shapeFlag&4}let Is=!1;function wf(e,t=!1,n=!1){t&&Os(t);const{props:s,children:i}=e.vnode,l=yc(e);sf(e,s,l,t),rf(e,i,n||t);const r=l?kf(e,t):void 0;return t&&Os(!1),r}function kf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Vd);const{setup:s}=n;if(s){cn();const i=e.setupContext=s.length>1?xf(e):null,l=Ks(e),r=Vs(s,e,0,[e.props,i]),u=mr(r);if(un(),l(),(u||e.sp)&&!Ss(e)&&Yr(e),u){if(r.then(Jl,Jl),t)return r.then(f=>{Os(!0);try{Xl(e,f,t)}finally{Os(!1)}}).catch(f=>{Ri(f,e,0)});e.asyncDep=r}else Xl(e,r)}else wc(e)}function Xl(e,t,n){_e(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Pe(t)&&(e.setupState=Ur(t)),wc(e)}function wc(e,t,n){const s=e.type;e.render||(e.render=s.render||Kt);{const i=Ks(e);cn();try{Wd(e)}finally{un(),i()}}}const $f={get(e,t){return nt(e,"get",""),e[t]}};function xf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,$f),slots:e.slots,emit:e.emit,expose:t}}function ji(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ur(hd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Cs)return Cs[n](e)},has(t,n){return n in t||n in Cs}})):e.proxy}function Sf(e,t=!0){return _e(e)?e.displayName||e.name:e.name||t&&e.__name}function Cf(e){return _e(e)&&"__vccOpts"in e}const $=(e,t)=>_d(e,t,Is);function bi(e,t,n){try{fi(-1);const s=arguments.length;return s===2?Pe(t)&&!pe(t)?pi(t)?se(e,null,[t]):se(e,t):se(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&pi(n)&&(n=[n]),se(e,t,n))}finally{fi(1)}}const Tf="3.5.43";let Ao;const Zl=typeof window<"u"&&window.trustedTypes;if(Zl)try{Ao=Zl.createPolicy("vue",{createHTML:e=>e})}catch{}const kc=Ao?e=>Ao.createHTML(e):e=>e,Ef="http://www.w3.org/2000/svg",Af="http://www.w3.org/1998/Math/MathML",Xt=typeof document<"u"?document:null,Ql=Xt&&Xt.createElement("template"),Pf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const i=t==="svg"?Xt.createElementNS(Ef,e):t==="mathml"?Xt.createElementNS(Af,e):n?Xt.createElement(e,{is:n}):Xt.createElement(e);return e==="select"&&s&&s.multiple!=null&&i.setAttribute("multiple",s.multiple),i},createText:e=>Xt.createTextNode(e),createComment:e=>Xt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Xt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,i,l){const r=n?n.previousSibling:t.lastChild;if(i&&(i===l||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===l||!(i=i.nextSibling)););else{Ql.innerHTML=kc(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const u=Ql.content;if(s==="svg"||s==="mathml"){const f=u.firstChild;for(;f.firstChild;)u.appendChild(f.firstChild);u.removeChild(f)}t.insertBefore(u,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Of=Symbol("_vtc");function If(e,t,n){const s=e[Of];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ea=Symbol("_vod"),Lf=Symbol("_vsh"),Mf=Symbol(""),Rf=/(?:^|;)\s*display\s*:/;function Nf(e,t,n){const s=e.style,i=We(n);let l=!1;if(n&&!i){if(t)if(We(t))for(const r of t.split(";")){const u=r.slice(0,r.indexOf(":")).trim();n[u]==null&&bs(s,u,"")}else for(const r in t)n[r]==null&&bs(s,r,"");for(const r in n){r==="display"&&(l=!0);const u=n[r];u!=null?Df(e,r,!We(t)&&t?t[r]:void 0,u)||bs(s,r,u):bs(s,r,"")}}else if(i){if(t!==n){const r=s[Mf];r&&(n+=";"+r),s.cssText=n,l=Rf.test(n)}}else t&&e.removeAttribute("style");ea in e&&(e[ea]=l?s.display:"",e[Lf]&&(s.display="none"))}const Zs=/\s*!important$/;function bs(e,t,n){if(pe(n))n.forEach(s=>bs(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))Zs.test(n)?e.setProperty(t,n.replace(Zs,""),"important"):e.setProperty(t,n);else{const s=Ff(e,t);Zs.test(n)?e.setProperty(En(s),n.replace(Zs,""),"important"):e[s]=n}}const ta=["Webkit","Moz","ms"],io={};function Ff(e,t){const n=io[t];if(n)return n;let s=ct(t);if(s!=="filter"&&s in e)return io[t]=s;s=Oi(s);for(let i=0;ioo||(Bf.then(()=>oo=0),oo=Date.now());function zf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;const i=n.value;if(pe(i)){const l=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{l.call(s),s._stopped=!0};const r=i.slice(),u=[s];for(let f=0;fe.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,qf=(e,t,n,s,i,l)=>{const r=i==="svg";t==="class"?If(e,s,r):t==="style"?Nf(e,n,s):Ei(t)?Ai(t)||jf(e,t,n,s,l):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Yf(e,t,s,r))?(ia(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&sa(e,t,s,r,l,t!=="value")):e._isVueCE&&(Gf(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!We(s)))?ia(e,ct(t),s,l,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),sa(e,t,s,r))};function Yf(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&la(t)&&_e(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return la(t)&&We(n)?!1:t in e}function Gf(e,t){const n=e._def.props;if(!n)return!1;const s=ct(t);return Array.isArray(n)?n.some(i=>ct(i)===s):Object.keys(n).some(i=>ct(i)===s)}const xn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return pe(t)?n=>si(t,n):t};function Jf(e){e.target.composing=!0}function aa(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const gt=Symbol("_assign"),Qs=Symbol("_initialValue");function lo(e,t,n){return t&&(e=e.trim()),n&&(e=Ii(e)),e}const Xe={created(e,{modifiers:{lazy:t,trim:n,number:s}},i){e.parentNode&&(e.type==="text"?e[Qs]=e.defaultValue.replace(/[\r\n]/g,""):e.type==="textarea"&&(e[Qs]=e.defaultValue.replace(/\r\n?/g,` -`))),e[gt]=xn(i);const l=s||i.props&&i.props.type==="number";nn(e,t?"change":"input",r=>{r.target.composing||e[gt](lo(e.value,n,l))}),(n||l)&&nn(e,"change",()=>{e.value=lo(e.value,n,l)}),t||(nn(e,"compositionstart",Jf),nn(e,"compositionend",aa),nn(e,"change",aa))},mounted(e,{value:t,modifiers:{trim:n,number:s}}){const i=t??"",l=e[Qs];delete e[Qs],l!==void 0&&(e.type==="text"||e.type==="textarea")&&e.value!==l?e[gt](lo(e.value,n,s)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:i,number:l}},r){if(e[gt]=xn(r),e.composing)return;const u=(l||e.type==="number")&&!/^0\d/.test(e.value)?Ii(e.value):e.value,f=t??"";if(u===f)return;const h=e.getRootNode();(h instanceof Document||h instanceof ShadowRoot)&&h.activeElement===e&&e.type!=="range"&&(s&&t===n||i&&e.value.trim()===f)||(e.value=f)}},Xf={deep:!0,created(e,t,n){e[gt]=xn(n),nn(e,"change",()=>{const s=e._modelValue,i=is(e),l=e.checked,r=e[gt];if(pe(s)){const u=Qo(s,i),f=u!==-1;if(l&&!f)r(s.concat(i));else if(!l&&f){const h=[...s];h.splice(u,1),r(h)}}else if(rn(s)){const u=new Set(s);l?u.add(i):u.delete(i),r(u)}else r($c(e,l))})},mounted:ra,beforeUpdate(e,t,n){e[gt]=xn(n),ra(e,t,n)}};function ra(e,{value:t,oldValue:n},s){e._modelValue=t;let i;if(pe(t))i=Qo(t,s.props.value)>-1;else if(rn(t))i=t.has(s.props.value);else{if(t===n)return;i=Rt(t,$c(e,!0))}e.checked!==i&&(e.checked=i)}const ca={created(e,{value:t},n){e.checked=Rt(t,n.props.value),e[gt]=xn(n),nn(e,"change",()=>{e[gt](is(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e[gt]=xn(s),t!==n&&(e.checked=Rt(t,s.props.value))}},Wn={deep:!0,created(e,{value:t,modifiers:{number:n}},s){e._modelValue=t,nn(e,"change",()=>{const i=Array.prototype.filter.call(e.options,f=>f.selected).map(f=>n?Ii(is(f)):is(f)),l=e.multiple,r=l?rn(e._modelValue)?new Set(i):i:i[0],u=e._pendingValue=[l,l?pe(r)?i.slice():i:r];try{e[gt](r)}finally{Ni(()=>{e._pendingValue===u&&(e._pendingValue=void 0)})}}),e[gt]=xn(s)},mounted(e,{value:t}){ua(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[gt]=xn(n)},updated(e,{value:t}){const n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Zf(t,n[1],n[0]))&&ua(e,t)}};function Zf(e,t,n){if(!n||pe(e))return Rt(e,t);if(rn(e)){if(e.size!==t.length)return!1;for(const s of t)if(!e.has(s))return!1;return!0}return!1}function ua(e,t){const n=e.multiple,s=pe(t);if(!(n&&!s&&!rn(t))){for(let i=0,l=e.options.length;iString(h)===String(u)):r.selected=Qo(t,u)>-1}else r.selected=t.has(u);else if(Rt(is(r),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function is(e){return"_value"in e?e._value:e.value}function $c(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Qf=["ctrl","shift","alt","meta"],ep={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Qf.some(n=>e[`${n}Key`]&&!t.includes(n))},Ot=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((i,...l)=>{for(let r=0;r{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(i=>{if(!("key"in i))return;const l=En(i.key);if(t.some(r=>r===l||tp[r]===l))return e(i)}))},np=tt({patchProp:qf},Pf);let da;function sp(){return da||(da=uf(np))}const ip=((...e)=>{const t=sp().createApp(...e),{mount:n}=t;return t.mount=s=>{const i=lp(s);if(!i)return;const l=t._component;!_e(l)&&!l.render&&!l.template&&(l.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const r=n(i,!1,op(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),r},t});function op(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function lp(e){return We(e)?document.querySelector(e):e}const ap="modulepreload",rp=function(e,t){return new URL(e,t).href},fa={},bn=function(t,n,s){let i=Promise.resolve();if(n&&n.length>0){let h=function(p){return Promise.all(p.map(b=>Promise.resolve(b).then(v=>({status:"fulfilled",value:v}),v=>({status:"rejected",reason:v}))))};const r=document.getElementsByTagName("link"),u=document.querySelector("meta[property=csp-nonce]"),f=u?.nonce||u?.getAttribute("nonce");i=h(n.map(p=>{if(p=rp(p,s),p in fa)return;fa[p]=!0;const b=p.endsWith(".css"),v=b?'[rel="stylesheet"]':"";if(s)for(let I=r.length-1;I>=0;I--){const T=r[I];if(T.href===p&&(!b||T.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${p}"]${v}`))return;const y=document.createElement("link");if(y.rel=b?"stylesheet":ap,b||(y.as="script"),y.crossOrigin="",y.href=p,f&&y.setAttribute("nonce",f),document.head.appendChild(y),b)return new Promise((I,T)=>{y.addEventListener("load",I),y.addEventListener("error",()=>T(new Error(`Unable to preload CSS for ${p}`)))})}))}function l(r){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=r,window.dispatchEvent(u),!u.defaultPrevented)throw r}return i.then(r=>{for(const u of r||[])u.status==="rejected"&&l(u.reason);return t().catch(l)})},cp={de:{name:"Deutsch",english:"German",script:"latin",plural:"one_other",clock:"24",checked:!1},"en-GB":{name:"English (UK)",english:"English (UK)",script:"latin",plural:"one_other",clock:"24",checked:!0},en:{name:"English (US)",english:"English (US)",script:"latin",plural:"one_other",clock:"12",checked:!0},es:{name:"Español",english:"Spanish",script:"latin",plural:"one_other",clock:"24",checked:!1},fr:{name:"Français",english:"French",script:"latin",plural:"one_upto_1",clock:"24",checked:!1},it:{name:"Italiano",english:"Italian",script:"latin",plural:"one_other",clock:"24",checked:!1},nl:{name:"Nederlands",english:"Dutch",script:"latin",plural:"one_other",clock:"24",checked:!1},pl:{name:"Polski",english:"Polish",script:"latin",plural:"slavic_pl",clock:"24",checked:!1},pt:{name:"Português",english:"Portuguese",script:"latin",plural:"one_other",clock:"24",checked:!1}};const vi=typeof window<"u",Pn=(e,t=!1)=>t?Symbol.for(e):Symbol(e),up=(e,t,n)=>dp({l:e,k:t,s:n}),dp=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Ye=e=>typeof e=="number"&&isFinite(e),Sc=e=>hl(e)==="[object Date]",gi=e=>hl(e)==="[object RegExp]",pl=e=>Fe(e)&&Object.keys(e).length===0,ot=Object.assign,fp=Object.create,Ie=(e=null)=>fp(e);let pa;const pp=()=>pa||(pa=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:Ie()),hp=Object.prototype.hasOwnProperty;function St(e,t){return hp.call(e,t)}const je=Array.isArray,Be=e=>typeof e=="function",ae=e=>typeof e=="string",Ke=e=>typeof e=="boolean",Se=e=>e!==null&&typeof e=="object",mp=e=>Se(e)&&Be(e.then)&&Be(e.catch),Cc=Object.prototype.toString,hl=e=>Cc.call(e),Fe=e=>hl(e)==="[object Object]",bp=e=>e==null?"":je(e)||Fe(e)&&e.toString===Cc?JSON.stringify(e,null,2):String(e);function vp(e,t=""){return e.reduce((n,s,i)=>i===0?n+s:n+t+s,"")}function gp(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}function ha(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/").replace(/=/g,"=")}function _p(e){return e.replace(/&(?![a-z0-9#]{2,6};)/gi,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}const yp=/^javascript:/i,wp=/^(?:href|src|action|formaction)$/i,kp=/&#(?:x([0-9a-f]+)|(\d+));?/gi,$p=/&(?:Tab|NewLine);/g,xp=/:?/gi,Sp=/[\u0000-\u0020\u007f-\u009f]/g,Cp=/(?:^|[\s"'<>/])on\w+\s*=\s*["']?[^"'>]+["']?/i,Tp=/(^|[\s"'<>/])on(\w+\s*=)/gi,Ep=/(^|[\s"'<>/])((?:href|src|action|formaction)\s*=\s*)([^\s"'=<>`]+)/gi;function Ap(e,t,n){const s=t||n;if(!s)return e;const i=Number.parseInt(s,t?16:10);return i<=127?String.fromCharCode(i):e}function ml(e){const t=e.replace(kp,Ap).replace($p,"").replace(xp,":").replace(Sp,"");return yp.test(t)}function Pp(e){const t=/url\s*\(/gi;let n="",s=0,i;for(;(i=t.exec(e))!==null;){const l=i.index,r=t.lastIndex-1;let u=r+1,f=1,h=null;for(;u`${n}="${ma(n,s)}"`),e=e.replace(/([\w:-]+)\s*=\s*'([^']*)'/g,(t,n,s)=>`${n}='${ma(n,s)}'`),Cp.test(e)&&(e=e.replace(Tp,"$1on$2")),e=e.replace(Ep,(t,n,s,i)=>ml(i)?`${n}${s}about:blank`:t),e}const ba=e=>!Se(e)||je(e);function oi(e,t){if(ba(e)||ba(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:s,des:i}=n.pop();Object.keys(s).forEach(l=>{if(l==="__proto__")return;const r=s[l];if(je(r)){const u=[];u.length=r.length,i[l]=u,n.push({src:r,des:u})}else Se(r)?((!Se(i[l])||je(i[l]))&&(i[l]=Ie()),n.push({src:r,des:i[l]})):i[l]=r})}}const Ip=17;function Tc(e,t,n={}){const{domain:s,messages:i,args:l}=n,r=e,u=new SyntaxError(String(r));return u.code=e,u.domain=s,u}function zt(e){return Se(e)&&bl(e)===0&&(St(e,"b")||St(e,"body"))}const Ec=["b","body"];function Lp(e){return On(e,Ec)}const Ac=["c","cases"];function Mp(e){return On(e,Ac,[])}const Pc=["s","static"];function Rp(e){return On(e,Pc)}const Oc=["i","items"];function Np(e){return On(e,Oc,[])}const Ic=["t","type"];function bl(e){return On(e,Ic)}const Lc=["v","value"];function ei(e,t){const n=On(e,Lc);if(n!=null)return n;throw Ls(t)}const Mc=["m","modifier"];function Fp(e){return On(e,Mc)}const Rc=["k","key"];function Dp(e){const t=On(e,Rc);if(t)return t;throw Ls(6)}function On(e,t,n){for(let s=0;sUp(n,e)}function Up(e,t){const n=Lp(t);if(n==null)throw Ls(0);if(bl(n)===1){const l=Mp(n);return e.plural(l.reduce((r,u)=>[...r,ga(e,u)],[]))}else return ga(e,n)}function ga(e,t){const n=Rp(t);if(n!=null)return e.type==="text"?n:e.normalize([n]);{const s=Np(t).reduce((i,l)=>[...i,Po(e,l)],[]);return e.normalize(s)}}function Po(e,t){const n=bl(t);switch(n){case 3:return ei(t,n);case 9:return ei(t,n);case 4:{const s=t;if(St(s,"k")&&s.k)return e.interpolate(e.named(s.k));if(St(s,"key")&&s.key)return e.interpolate(e.named(s.key));throw Ls(n)}case 5:{const s=t;if(St(s,"i")&&Ye(s.i))return e.interpolate(e.list(s.i));if(St(s,"index")&&Ye(s.index))return e.interpolate(e.list(s.index));throw Ls(n)}case 6:{const s=t,i=Fp(s),l=Dp(s);return e.linked(Po(e,l),i?Po(e,i):void 0,e.type)}case 7:return ei(t,n);case 8:return ei(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}let _a=Ie();function jp(e,t){{const n=e.cacheKey;if(n){const s=_a[n];return s||(_a[n]=va(e))}else return va(e)}}const sn={INVALID_ARGUMENT:Ip,INVALID_DATE_ARGUMENT:18,INVALID_ISO_DATE_ARGUMENT:19,NOT_SUPPORT_LOCALE_PROMISE_VALUE:21,NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:22,NOT_SUPPORT_LOCALE_TYPE:23},Hp=24;function on(e){return Tc(e,null,void 0)}function vl(e,t){return t.locale!=null?ya(t.locale):ya(e.locale)}let ao;function ya(e){if(ae(e))return e;if(Be(e)){if(e.resolvedOnce&&ao!=null)return ao;if(e.constructor.name==="Function"){const t=e();if(mp(t))throw on(sn.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return ao=t}else throw on(sn.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw on(sn.NOT_SUPPORT_LOCALE_TYPE)}function Vp(e,t,n){return[...new Set([n,...je(t)?t:Se(t)?Object.keys(t).filter(s=>s!=="default"):ae(t)?[t]:[n]])]}function Oo(e,t,n){const s=ae(n)?n:_i,i=e;let l;Se(t)?(i.__localeChainObjectCache||(i.__localeChainObjectCache=new WeakMap),l=i.__localeChainObjectCache.get(t),l||(l=new Map,i.__localeChainObjectCache.set(t,l))):(i.__localeChainCache||(i.__localeChainCache=new Map),l=i.__localeChainCache.get(t),l||(l=new Map,i.__localeChainCache.set(t,l)));const r=l.get(s);if(r)return r;const u=[];let f=[n];for(;je(f);)f=wa(u,f,t);const h=je(t)||!Fe(t)?t:t.default?t.default:null;return f=ae(h)?[h]:h,je(f)&&wa(u,f,!1),l.set(s,u),u}function wa(e,t,n){let s=!0;for(let i=0;i{r===void 0?r=u:r+=u},v[1]=()=>{r!==void 0&&(t.push(r),r=void 0)},v[2]=()=>{v[0](),i++},v[3]=()=>{if(i>0)i--,s=4,v[0]();else{if(i=0,r===void 0||(r=Gp(r),r===!1))return!1;v[1]()}};function y(){const I=e[n+1];if(s===5&&I==="'"||s===6&&I==='"')return n++,u="\\"+I,v[0](),!0}for(;s!==null;)if(n++,l=e[n],!(l==="\\"&&y())){if(f=Yp(l),b=In[s],h=b[f]||b.l||8,h===8||(s=h[0],h[1]!==void 0&&(p=v[h[1]],p&&(u=l,p()===!1))))return;if(s===7)return t}}const ka=new Map;function Xp(e,t){return Se(e)?e[t]:null}function Zp(e,t){if(!Se(e))return null;let n=ka.get(t);if(n||(n=Jp(t),n&&ka.set(t,n)),!n)return null;const s=n.length;let i=e,l=0;for(;l`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function eh(){return{upper:(e,t)=>t==="text"&&ae(e)?e.toUpperCase():t==="vnode"&&Se(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&ae(e)?e.toLowerCase():t==="vnode"&&Se(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&ae(e)?$a(e):t==="vnode"&&Se(e)&&"__v_isVNode"in e?$a(e.children):e}}let Fc;function th(e){Fc=e}let Dc;function nh(e){Dc=e}let Uc;function sh(e){Uc=e}let jc=null;const xa=e=>{jc=e},Sa=()=>jc;let Ca=0;function ih(e={}){const t=Be(e.onWarn)?e.onWarn:gp,n=ae(e.version)?e.version:Qp,s=ae(e.locale)||Be(e.locale)?e.locale:_i,i=Be(s)?_i:s,l=je(e.fallbackLocale)||Fe(e.fallbackLocale)||ae(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:i,r=Fe(e.messages)?e.messages:ro(i),u=Fe(e.datetimeFormats)?e.datetimeFormats:ro(i),f=Fe(e.numberFormats)?e.numberFormats:ro(i),h=ot(Ie(),e.modifiers,eh()),p=e.pluralRules||Ie(),b=Be(e.missing)?e.missing:null,v=Ke(e.missingWarn)||gi(e.missingWarn)?e.missingWarn:!0,y=Ke(e.fallbackWarn)||gi(e.fallbackWarn)?e.fallbackWarn:!0,I=!!e.fallbackFormat,T=!!e.unresolving,k=Be(e.postTranslation)?e.postTranslation:null,A=Fe(e.processor)?e.processor:null,S=Ke(e.warnHtmlMessage)?e.warnHtmlMessage:!0,U=!!e.escapeParameter,C=Be(e.messageCompiler)?e.messageCompiler:Fc,K=Be(e.messageResolver)?e.messageResolver:Dc||Xp,O=Be(e.localeFallbacker)?e.localeFallbacker:Uc||Vp,E=Se(e.fallbackContext)?e.fallbackContext:void 0,R=e,L=Se(R.__datetimeFormatters)?R.__datetimeFormatters:new Map,D=Se(R.__numberFormatters)?R.__numberFormatters:new Map,M=Se(R.__meta)?R.__meta:{};Ca++;const Y={version:n,cid:Ca,locale:s,fallbackLocale:l,messages:r,modifiers:h,pluralRules:p,missing:b,missingWarn:v,fallbackWarn:y,fallbackFormat:I,unresolving:T,postTranslation:k,processor:A,warnHtmlMessage:S,escapeParameter:U,messageCompiler:C,messageResolver:K,localeFallbacker:O,fallbackContext:E,onWarn:t,__meta:M};return Y.datetimeFormats=u,Y.numberFormats=f,Y.__datetimeFormatters=L,Y.__numberFormatters=D,Y}const ro=e=>({[e]:Ie()});function Hc(e,t,n,s,i){const{missing:l,onWarn:r}=e;if(l!==null){const u=l(e,n,t,i);return ae(u)?u:t}else return t}function Ta(e,t){const n=e;Se(t)?n.__localeChainObjectCache?.delete(t):n.__localeChainCache?.delete(t)}function ti(e,t,n){Ta(e,n),e.fallbackContext&&Ta(e.fallbackContext,n),e.localeFallbacker(e,n,t)}function oh(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function lh(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let s=n+1;s{s.includes(f)?u[f]=i[f]:t[f]=i[f]}),ae(l)?t.locale=l:Fe(l)&&(u=l),Fe(r)&&(u=r),u}function Ea(e,...t){const{datetimeFormats:n,unresolving:s,onWarn:i}=e,{__datetimeFormatters:l}=e;if(!ae(t[0])&&!Sc(t[0])&&!Ye(t[0]))return yi;const[r,u,f,h]=Io(...t),p=Ke(f.missingWarn)?f.missingWarn:e.missingWarn,b=Ke(f.fallbackWarn)?f.fallbackWarn:e.fallbackWarn,v=!!f.part,y=vl(e,f);if(!ae(r)||r===""){const S=new Intl.DateTimeFormat(y.replace(/!/g,""),h);return v?S.formatToParts(u):S.format(u)}const I=Vc(e,r,y,n,p,b,"datetime format");if(!ae(I))return s?Hi:r;const T=n[I][r],k=Wc(I,r,h);let A=l.get(k);return A||(A=new Intl.DateTimeFormat(I,ot({},T,h)),l.set(k,A)),v?A.formatToParts(u):A.format(u)}const zc=["localeMatcher","weekday","era","year","month","day","hour","minute","second","timeZoneName","formatMatcher","hour12","timeZone","dateStyle","timeStyle","calendar","dayPeriod","numberingSystem","hourCycle","fractionalSecondDigits"];function Io(...e){const[t]=e,n=Ie(),s=Ie();let i;if(ae(t)){const r=t.match(/(\d{4}-\d{2}-\d{2})(T|\s)?(.*)/);if(!r)throw on(sn.INVALID_ISO_DATE_ARGUMENT);const u=r[3]?r[3].trim().startsWith("T")?`${r[1].trim()}${r[3].trim()}`:`${r[1].trim()}T${r[3].trim()}`:r[1].trim();i=new Date(u);try{i.toISOString()}catch{throw on(sn.INVALID_ISO_DATE_ARGUMENT)}}else if(Sc(t)){if(isNaN(t.getTime()))throw on(sn.INVALID_DATE_ARGUMENT);i=t}else if(Ye(t))i=t;else throw on(sn.INVALID_ARGUMENT);const l=Kc(e,n,s,zc);return[n.key||"",i,n,l]}function Aa(e,t,n){Bc(e.__datetimeFormatters,t,n)}function Pa(e,...t){const{numberFormats:n,unresolving:s,onWarn:i}=e,{__numberFormatters:l}=e;if(!Ye(t[0]))return yi;const[r,u,f,h]=Lo(...t),p=Ke(f.missingWarn)?f.missingWarn:e.missingWarn,b=Ke(f.fallbackWarn)?f.fallbackWarn:e.fallbackWarn,v=!!f.part,y=vl(e,f);if(!ae(r)||r===""){const S=new Intl.NumberFormat(y.replace(/!/g,""),h);return v?S.formatToParts(u):S.format(u)}const I=Vc(e,r,y,n,p,b,"number format");if(!ae(I))return s?Hi:r;const T=n[I][r],k=Wc(I,r,h);let A=l.get(k);return A||(A=new Intl.NumberFormat(I,ot({},T,h)),l.set(k,A)),v?A.formatToParts(u):A.format(u)}const qc=["localeMatcher","style","currency","currencyDisplay","currencySign","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","compactDisplay","notation","signDisplay","unit","unitDisplay","roundingMode","roundingPriority","roundingIncrement","trailingZeroDisplay"];function Lo(...e){const[t]=e,n=Ie(),s=Ie();if(!Ye(t))throw on(sn.INVALID_ARGUMENT);const i=t,l=Kc(e,n,s,qc);return[n.key||"",i,n,l]}function Oa(e,t,n){Bc(e.__numberFormatters,t,n)}const ah=e=>e,rh=e=>"",ch="text",uh=e=>e.length===0?"":vp(e),dh=bp;function co(e,t){return e=Math.abs(e),t===2?e===1?0:1:Math.min(e,2)}function fh(e){const t=Ye(e.pluralIndex)?e.pluralIndex:-1;return Ye(e.named?.count)?e.named.count:Ye(e.named?.n)?e.named.n:t}function ph(e={}){const t=e.locale,n=fh(e),s=ae(t)&&Be(e.pluralRules?.[t])?e.pluralRules[t]:co,i=s===co?void 0:co,l=A=>A[s(n,A.length,i)],r=e.list||[],u=A=>r[A],f=e.named||Ie();Ye(e.pluralIndex)&&(f.count||=e.pluralIndex,f.n||=e.pluralIndex);const h=A=>f[A];function p(A,S){const U=Be(e.messages)?e.messages(A,!!S):Se(e.messages)?e.messages[A]:!1;return U||(e.parent?e.parent.message(A):rh)}const b=A=>e.modifiers?e.modifiers[A]:ah,v=Be(e.processor?.normalize)?e.processor.normalize:uh,y=Be(e.processor?.interpolate)?e.processor.interpolate:dh,I=ae(e.processor?.type)?e.processor.type:ch,k={list:u,named:h,plural:l,linked:(A,...S)=>{const[U,C]=S;let K="text",O="";S.length===1?Se(U)?(O=U.modifier||O,K=U.type||K):ae(U)&&(O=U||O):S.length===2&&(ae(U)&&(O=U||O),ae(C)&&(K=C||K));const E=p(A,!0)(k),R=E===""||E===void 0?A:E,L=K==="vnode"&&je(R)&&O?R[0]:R;return O?b(O)(L,K):L},message:p,type:I,interpolate:y,normalize:v,values:ot(Ie(),r,f)};return k}const Ia=()=>"",ln=e=>Be(e);function La(e,...t){const{fallbackFormat:n,postTranslation:s,unresolving:i,messageCompiler:l,fallbackLocale:r,messages:u}=e,[f,h]=Mo(...t),p=Ke(h.missingWarn)?h.missingWarn:e.missingWarn,b=Ke(h.fallbackWarn)?h.fallbackWarn:e.fallbackWarn,v=Ke(h.escapeParameter)?h.escapeParameter:e.escapeParameter,y=!!h.resolvedMessage,I=ae(h.default)||Ke(h.default)?Ke(h.default)?l?f:()=>f:h.default:n?l?f:()=>f:null,T=n||I!=null&&(ae(I)||Be(I)),k=vl(e,h);v&&hh(h);let[A,S,U]=y?[f,k,u[k]||Ie()]:Yc(e,f,k,r,b,p),C=A,K=f;if(!y&&!(ae(C)||zt(C)||ln(C))&&T&&(C=I,K=C),!y&&(!(ae(C)||zt(C)||ln(C))||!ae(S)))return i?Hi:f;let O=!1;const E=()=>{O=!0},R=ln(C)?C:Gc(e,f,S,C,K,E);if(O)return C;const L=vh(e,S,U,h),D=ph(L),M=mh(e,R,D);let Y=s?s(M,f):M;return v&&ae(Y)&&(Y=Op(Y)),Y}function hh(e){je(e.list)?e.list=e.list.map(t=>ae(t)?ha(t):t):Se(e.named)&&Object.keys(e.named).forEach(t=>{ae(e.named[t])&&(e.named[t]=ha(e.named[t]))})}function Yc(e,t,n,s,i,l){const{messages:r,onWarn:u,messageResolver:f,localeFallbacker:h}=e,p=h(e,s,n);let b=Ie(),v,y=null;const I="translate";for(let T=0;Ts);return h.locale=n,h.key=t,h}const f=r(s,bh(e,n,i,s,u,l));return f.locale=n,f.key=t,f.source=s,f}function mh(e,t,n){return t(n)}function Mo(...e){const[t,n,s]=e,i=Ie();if(!ae(t)&&!Ye(t)&&!ln(t)&&!zt(t))throw on(sn.INVALID_ARGUMENT);const l=Ye(t)?String(t):(ln(t),t);return Ye(n)?i.plural=n:ae(n)?i.default=n:Fe(n)&&!pl(n)?i.named=n:je(n)&&(i.list=n),Ye(s)?i.plural=s:ae(s)?i.default=s:Fe(s)&&ot(i,s),[l,i]}function bh(e,t,n,s,i,l){return{locale:t,key:n,warnHtmlMessage:i,onError:r=>{throw l&&l(r),r},onCacheKey:r=>up(t,n,r)}}function vh(e,t,n,s){const{modifiers:i,pluralRules:l,messageResolver:r,fallbackLocale:u,fallbackWarn:f,missingWarn:h,fallbackContext:p}=e,v={locale:t,modifiers:i,pluralRules:l,messages:(y,I)=>{let T=r(n,y);if(T==null&&(p||I)){const[k,,A]=Yc(p||e,y,t,u,f,h);T=k??r(A,y)}if(ae(T)||zt(T)){let k=!1;const S=Gc(e,y,t,T,y,()=>{k=!0});return k?Ia:S}else return ln(T)?T:Ia}};return e.processor&&(v.processor=e.processor),s.list&&(v.list=s.list),s.named&&(v.named=s.named),Ye(s.plural)&&(v.pluralIndex=s.plural),v}const gh="11.4.12",_t={UNEXPECTED_RETURN_TYPE:Hp,INVALID_ARGUMENT:25,MUST_BE_CALL_SETUP_TOP:26,NOT_INSTALLED:27,REQUIRED_VALUE:28,INVALID_VALUE:29,NOT_INSTALLED_WITH_PROVIDE:31,UNEXPECTED_ERROR:32,NOT_AVAILABLE_COMPOSITION_IN_LEGACY:34};function Et(e,...t){return Tc(e,null,void 0)}const Ro=Pn("__translateVNode"),No=Pn("__datetimeParts"),Fo=Pn("__numberParts"),_h=Pn("__setPluralRules"),yh=Pn("__injectWithOption"),Zn=Pn("__dispose");let Jc=null;{const e=pp().__VUE_INSTANCE_SETTERS__;je(e)&&e.push(t=>{Jc=t})}function Ms(e){if(!Se(e)||zt(e))return e;for(const t in e)if(St(e,t))if(!t.includes("."))Se(e[t])&&Ms(e[t]);else{const n=t.split("."),s=n.length-1;let i=e,l=!1;for(let r=0;r{if("locale"in u&&"resource"in u){const{locale:f,resource:h}=u;f?(r[f]=r[f]||Ie(),oi(h,r[f])):oi(h,r)}else ae(u)&&oi(JSON.parse(u),r)}),i==null&&l)for(const u in r)St(r,u)&&Ms(r[u]);return r}function wh(e){return e.type}function kh(e,t,n){let s=Se(t.messages)?t.messages:Ie();"__i18nGlobal"in n&&(s=Xc(e.locale.value,{messages:s,__i18n:n.__i18nGlobal}));const i=Object.keys(s);i.length&&i.forEach(l=>{e.mergeLocaleMessage(l,s[l])});{if(Se(t.datetimeFormats)){const l=Object.keys(t.datetimeFormats);l.length&&l.forEach(r=>{e.mergeDateTimeFormat(r,t.datetimeFormats[r])})}if(Se(t.numberFormats)){const l=Object.keys(t.numberFormats);l.length&&l.forEach(r=>{e.mergeNumberFormat(r,t.numberFormats[r])})}}}function Ma(e){return se(Bs,null,e,0)}function Zc(){return Jc??_c()}const Ra=()=>[],$h=()=>!1;let Na=0;function Fa(e){return((t,n,s,i)=>e(n,s,Zc()||void 0,i))}function Do(e={}){const{__root:t,__injectWithOption:n}=e,s=t===void 0,i=e.flatJson,l=vi?$e:md;let r=Ke(e.inheritLocale)?e.inheritLocale:!0;const u=l(t&&r?t.locale.value:ae(e.locale)?e.locale:_i),f=l(t&&r?t.fallbackLocale.value:ae(e.fallbackLocale)||je(e.fallbackLocale)||Fe(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:u.value),h=l(Xc(u.value,e)),p=l(Fe(e.datetimeFormats)?e.datetimeFormats:{[u.value]:{}}),b=l(Fe(e.numberFormats)?e.numberFormats:{[u.value]:{}});let v=t?t.missingWarn:Ke(e.missingWarn)||gi(e.missingWarn)?e.missingWarn:!0,y=t?t.fallbackWarn:Ke(e.fallbackWarn)||gi(e.fallbackWarn)?e.fallbackWarn:!0,I=t?t.fallbackRoot:Ke(e.fallbackRoot)?e.fallbackRoot:!0,T=!!e.fallbackFormat,k=Be(e.missing)?e.missing:null,A=Be(e.missing)?Fa(e.missing):null,S=Be(e.postTranslation)?e.postTranslation:null,U=t?t.warnHtmlMessage:Ke(e.warnHtmlMessage)?e.warnHtmlMessage:!0,C=!!e.escapeParameter;const K=t?t.modifiers:Fe(e.modifiers)?e.modifiers:{};let O=e.pluralRules||t&&t.pluralRules,E;E=(()=>{s&&xa(null);const P={version:gh,locale:u.value,fallbackLocale:f.value,messages:h.value,modifiers:K,pluralRules:O,missing:A===null?void 0:A,missingWarn:v,fallbackWarn:y,fallbackFormat:T,unresolving:!0,postTranslation:S===null?void 0:S,warnHtmlMessage:U,escapeParameter:C,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};P.datetimeFormats=p.value,P.numberFormats=b.value,P.__datetimeFormatters=Fe(E)?E.__datetimeFormatters:void 0,P.__numberFormatters=Fe(E)?E.__numberFormatters:void 0;const F=ih(P);return s&&xa(F),F})(),ti(E,u.value,f.value);function L(){return[u.value,f.value,h.value,p.value,b.value]}const D=$({get:()=>u.value,set:P=>{E.locale=P,u.value=P}});function M(P){s||(E.fallbackContext=t?Sa():void 0);try{ti(E,u.value,P)}finally{s||(E.fallbackContext=void 0)}}const Y=$({get:()=>f.value,set:P=>{f.value=P,E.fallbackLocale=f.value,M(f.value)}}),te=$(()=>h.value),ye=$(()=>p.value),re=$(()=>b.value);function be(){return Be(S)?S:null}function ge(P){S=P,E.postTranslation=P}function we(){return k}function Ge(P){P!==null&&(A=Fa(P)),k=P,E.missing=A}const qe=(P,F,ce,fe,Oe,De)=>{L();let Ve;try{s||(E.fallbackContext=t?Sa():void 0),Ve=P(E)}finally{s||(E.fallbackContext=void 0)}if(ce!=="translate exists"&&Ye(Ve)&&Ve===Hi||ce==="translate exists"&&!Ve){const[kt,Yn]=F();return t&&I?fe(t):Oe(kt)}else{if(De(Ve))return Ve;throw Et(_t.UNEXPECTED_RETURN_TYPE)}};function le(...P){return qe(F=>Reflect.apply(La,null,[F,...P]),()=>Mo(...P),"translate",F=>Reflect.apply(F.t,F,[...P]),F=>F,F=>ae(F))}function Z(...P){const[F,ce,fe]=P;if(fe&&!Se(fe))throw Et(_t.INVALID_ARGUMENT);return le(F,ce,ot({resolvedMessage:!0},fe||{}))}function ue(...P){return qe(F=>Reflect.apply(Ea,null,[F,...P]),()=>Io(...P),"datetime format",F=>Reflect.apply(F.d,F,[...P]),()=>yi,F=>ae(F)||je(F))}function ke(...P){return qe(F=>Reflect.apply(Pa,null,[F,...P]),()=>Lo(...P),"number format",F=>Reflect.apply(F.n,F,[...P]),()=>yi,F=>ae(F)||je(F))}function B(P){return P.map(F=>ae(F)||Ye(F)||Ke(F)?Ma(String(F)):F)}const ie={normalize:B,interpolate:P=>P,type:"vnode"};function wt(...P){return qe(F=>{let ce;const fe=F;try{fe.processor=ie,ce=Reflect.apply(La,null,[fe,...P])}finally{fe.processor=null}return ce},()=>Mo(...P),"translate",F=>F[Ro](...P),F=>[Ma(F)],F=>je(F))}function Ln(...P){return qe(F=>Reflect.apply(Pa,null,[F,...P]),()=>Lo(...P),"number format",F=>F[Fo](...P),Ra,F=>ae(F)||je(F))}function Mn(...P){return qe(F=>Reflect.apply(Ea,null,[F,...P]),()=>Io(...P),"datetime format",F=>F[No](...P),Ra,F=>ae(F)||je(F))}function El(P){O=P,E.pluralRules=O}function w(P,F){return qe(()=>{if(!P)return!1;const ce=ae(F)?F:u.value,fe=ae(F)?[ce]:Oo(E,f.value,ce);for(let Oe=0;Oe[P],"translate exists",ce=>Reflect.apply(ce.te,ce,[P,F]),$h,ce=>Ke(ce))}function x(P){let F=null;const ce=Oo(E,f.value,u.value);for(let fe=0;feM(f.value),{deep:!0,flush:"sync"}),t&&vi&&(Tt(t.locale,P=>{r&&(u.value=P,E.locale=P,ti(E,u.value,f.value))}),Tt(t.fallbackLocale,P=>{r&&(f.value=P,E.fallbackLocale=f.value,ti(E,u.value,f.value))}));const Q={id:Na,locale:D,fallbackLocale:Y,get inheritLocale(){return r},set inheritLocale(P){r=P,P&&t&&(D.value=t.locale.value,Y.value=t.fallbackLocale.value)},get availableLocales(){return Object.keys(h.value).sort()},messages:te,get modifiers(){return K},get pluralRules(){return O||{}},get isGlobal(){return s},get missingWarn(){return v},set missingWarn(P){v=P,E.missingWarn=v},get fallbackWarn(){return y},set fallbackWarn(P){y=P,E.fallbackWarn=y},get fallbackRoot(){return I},set fallbackRoot(P){I=P},get fallbackFormat(){return T},set fallbackFormat(P){T=P,E.fallbackFormat=T},get warnHtmlMessage(){return U},set warnHtmlMessage(P){U=P,E.warnHtmlMessage=P},get escapeParameter(){return C},set escapeParameter(P){C=P,E.escapeParameter=P},t:le,getLocaleMessage:z,setLocaleMessage:j,mergeLocaleMessage:V,getPostTranslationHandler:be,setPostTranslationHandler:ge,getMissingHandler:we,setMissingHandler:Ge,[_h]:El};return Q.datetimeFormats=ye,Q.numberFormats=re,Q.rt=Z,Q.te=w,Q.tm=N,Q.d=ue,Q.n=ke,Q.getDateTimeFormat=X,Q.setDateTimeFormat=J,Q.mergeDateTimeFormat=G,Q.getNumberFormat=H,Q.setNumberFormat=de,Q.mergeNumberFormat=ee,Q[yh]=n,Q[Ro]=wt,Q[No]=Mn,Q[Fo]=Ln,Q}const gl={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function xh({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((s,i)=>[...s,...i.type===q?i.children:[i]],[]):t.reduce((n,s)=>{const i=e[s];return i&&(n[s]=i()),n},Ie())}function Qc(){return q}const Sh=Le({name:"i18n-t",props:ot({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>Ye(e)||!isNaN(e)}},gl),setup(e,t){const{slots:n,attrs:s}=t,i=e.i18n||_l({useScope:e.scope,__useComponent:!0});return()=>{const l=()=>{const f=Object.keys(n).filter(b=>b[0]!=="_"),h=Ie();e.locale&&(h.locale=e.locale),e.plural!==void 0&&(h.plural=ae(e.plural)?+e.plural:e.plural);const p=xh(t,f);return i[Ro](e.keypath,p,h)},r=ot(Ie(),s),u=ae(e.tag)||Se(e.tag)?e.tag:Qc();return Se(u)?bi(u,r,{default:l}):bi(u,r,l())}}}),Da=Sh;function Ch(e){return je(e)&&!ae(e[0])}function eu(e,t,n,s){const{slots:i,attrs:l}=t;return()=>{const r=()=>{const h={part:!0};let p=Ie();e.locale&&(h.locale=e.locale),ae(e.format)?h.key=e.format:Se(e.format)&&(ae(e.format.key)&&(h.key=e.format.key),p=Object.keys(e.format).reduce((y,I)=>n.includes(I)?ot(Ie(),y,{[I]:e.format[I]}):y,Ie()));const b=s(e.value,h,p);let v=[h.key];return je(b)?v=b.map((y,I)=>{const T=i[y.type],k=T?T({[y.type]:y.value,index:I,parts:b}):[y.value];return Ch(k)&&(k[0].key=`${y.type}-${I}`),k}):ae(b)&&(v=[b]),v},u=ot(Ie(),l),f=ae(e.tag)||Se(e.tag)?e.tag:Qc();return Se(f)?bi(f,u,{default:r}):bi(f,u,r())}}const Th=Le({name:"i18n-n",props:ot({value:{type:Number,required:!0},format:{type:[String,Object]}},gl),setup(e,t){const n=e.i18n||_l({useScope:e.scope,__useComponent:!0});return eu(e,t,qc,(...s)=>n[Fo](...s))}}),Ua=Th;function Eh(e,t){const n=e;if(e.mode==="composition")return n.__getInstance(t)||e.global;{const s=n.__getInstance(t);return s!=null?s.__composer:e.global.__composer}}function Ah(e){const t=r=>{const{instance:u,value:f}=r;if(!u||!u.$)throw Et(_t.UNEXPECTED_ERROR);const h=Eh(e,u.$),p=ja(f);return[Reflect.apply(h.t,h,[...Ha(p)]),h]};return{created:(r,u)=>{const[f,h]=t(u);vi&&(r.__i18nWatcher=Tt(h.locale,()=>{u.instance&&u.instance.$forceUpdate()})),r.__composer=h,r.textContent=f},unmounted:r=>{vi&&r.__i18nWatcher&&(r.__i18nWatcher(),r.__i18nWatcher=void 0,delete r.__i18nWatcher),r.__composer&&(r.__composer=void 0,delete r.__composer)},beforeUpdate:(r,{value:u})=>{if(r.__composer){const f=r.__composer,h=ja(u);r.textContent=Reflect.apply(f.t,f,[...Ha(h)])}},getSSRProps:r=>{const[u]=t(r);return{textContent:u}}}}function ja(e){if(ae(e))return{path:e};if(Fe(e)){if(!("path"in e))throw Et(_t.REQUIRED_VALUE,"path");return e}else throw Et(_t.INVALID_VALUE)}function Ha(e){const{path:t,locale:n,args:s,choice:i,plural:l}=e,r={},u=s||{};return ae(n)&&(r.locale=n),Ye(i)&&(r.plural=i),Ye(l)&&(r.plural=l),[t,u,r]}function Ph(e,t,...n){const s=Fe(n[0])?n[0]:{};(!Ke(s.globalInstall)||s.globalInstall)&&([Da.name,"I18nT"].forEach(l=>e.component(l,Da)),[Ua.name,"I18nN"].forEach(l=>e.component(l,Ua)),[Ba.name,"I18nD"].forEach(l=>e.component(l,Ba))),e.directive("t",Ah(t))}const Oh=Pn("global-vue-i18n");function Ih(e={}){const t=Ke(e.globalInjection)?e.globalInjection:!0,n=new Map,[s,i]=Lh(e),l=Pn("");function r(p){return n.get(p)||null}function u(p,b){n.set(p,b)}function f(p){n.delete(p)}const h={get mode(){return"composition"},async install(p,...b){if(p.__VUE_I18N_SYMBOL__=l,p.provide(p.__VUE_I18N_SYMBOL__,h),Fe(b[0])){const I=b[0];h.__composerExtend=I.__composerExtend,h.__vueI18nExtend=I.__vueI18nExtend}let v=null;t&&(v=jh(p,h.global)),Ph(p,h,...b);const y=p.unmount;p.unmount=()=>{v&&v(),h.dispose(),y()}},get global(){return i},dispose(){s.stop()},__instances:n,__getInstance:r,__setInstance:u,__deleteInstance:f};return h}function _l(e={}){const t=Zc();if(t==null)throw Et(_t.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw Et(_t.NOT_INSTALLED);const n=Mh(t),s=Nh(n),i=wh(t),l=Rh(e,i);if(l==="global")return kh(s,e,i),s;if(l==="parent"){let f=Va(n,t,e.__useComponent);return f==null&&(f=s),f}if(l==="isolated"){if(n.mode!=="composition")throw Et(_t.NOT_AVAILABLE_COMPOSITION_IN_LEGACY);const f=n,h=ot({},e),p=Va(n,t);h.__root=p||s;const b=Do(h);return f.__composerExtend&&(b[Zn]=f.__composerExtend(b)),$r()&&Gu(()=>{const y=b[Zn];y&&(y(),delete b[Zn])}),b}const r=n;let u=r.__getInstance(t);if(u==null){const f=ot({},e);"__i18n"in i&&(f.__i18n=i.__i18n),s&&(f.__root=s),u=Do(f),r.__composerExtend&&(u[Zn]=r.__composerExtend(u)),Dh(r,t,u),r.__setInstance(t,u)}return u}function Lh(e,t){const n=Yu(),s=n.run(()=>Do(e));if(s==null)throw Et(_t.UNEXPECTED_ERROR);return[n,s]}function Mh(e){const t=$s(e.isCE?Oh:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw Et(e.isCE?_t.NOT_INSTALLED_WITH_PROVIDE:_t.UNEXPECTED_ERROR);return t}function Rh(e,t){return pl(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function Nh(e){return e.mode==="composition"?e.global:e.global.__composer}function Va(e,t,n=!1){let s=null;const i=t.root;let l=Fh(t,n);for(;l!=null;){const r=e;if(e.mode==="composition"&&(s=r.__getInstance(l)),s!=null||i===l)break;l=l.parent}return s}function Fh(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function Dh(e,t,n){An(()=>{},t),ul(()=>{const s=n;e.__deleteInstance(t);const i=s[Zn];i&&(i(),delete s[Zn])},t)}const Uh=["locale","fallbackLocale","availableLocales"],Wa=["t","rt","d","n","tm","te"];function jh(e,t){const n=Object.create(null);return Uh.forEach(i=>{const l=Object.getOwnPropertyDescriptor(t,i);if(!l)throw Et(_t.UNEXPECTED_ERROR);const r=et(l.value)?{get(){return l.value.value},set(u){l.value.value=u}}:{get(){return l.get&&l.get()}};Object.defineProperty(n,i,r)}),e.config.globalProperties.$i18n=n,Wa.forEach(i=>{const l=Object.getOwnPropertyDescriptor(t,i);if(!l||!l.value)throw Et(_t.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${i}`,l)}),()=>{delete e.config.globalProperties.$i18n,Wa.forEach(i=>{delete e.config.globalProperties[`$${i}`]})}}const Hh=Le({name:"i18n-d",props:ot({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},gl),setup(e,t){const n=e.i18n||_l({useScope:e.scope,__useComponent:!0});return eu(e,t,zc,(...s)=>n[No](...s))}}),Ba=Hh;th(jp);nh(Zp);sh(Oo);const Vh={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Undo"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"unknown"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Unsaved changes"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Cancel"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Open Devices & services"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Save & send"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Saving…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Read current data"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 result. Keep typing to narrow it down."},{t:2,i:[{t:4,k:"n"},{t:3,v:" results. Keep typing to narrow it down."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Close"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remove"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Change"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Loading…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Back"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copy"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"New screen"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware & USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alerts"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Settings"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Connect and install"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"That didn't work. Refresh the page and try again."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"API key copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"API key is selected. Copy with Ctrl+C or Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Layout JSON copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Layout JSON is selected. Copy with Ctrl+C or Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Action name copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Action name is selected. Copy with Ctrl+C or Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"YAML is selected. Copy with Ctrl+C or Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Icon name copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Icon name is selected. Copy with Ctrl+C or Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Empty color copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Empty color is selected. Copy with Ctrl+C or Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Color name copied."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Color name is selected. Copy with Ctrl+C or Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Management page unreachable · retrying…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant connected"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Reconnecting to Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Screens"}},more:{t:0,b:{t:2,i:[{t:3}],s:"More"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Update"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Update"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"Queued for the update"}},available:{t:0,b:{t:2,i:[{t:3,v:"Update "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"No ESPHome profile found with this device name."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"What's new"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Full log"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"The IP address, once; new firmware reports it itself."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"IP address, e.g. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"IP address"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Start"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Installed, but not yet in Home Assistant. Add the discovered ESPHome device under Settings → Devices & services, paste the API key there, and turn on “Allow the device to perform Home Assistant actions” under Configure."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware downloaded, not yet in Home Assistant. Put it on the screen with ESPHome Web, then add the discovered ESPHome device under Settings → Devices & services, paste the API key there, and allow the Home Assistant actions under Configure."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Not yet in Home Assistant. Already flashed? Add the ESPHome device under Settings → Devices & services, then allow the Home Assistant actions under Configure. Not flashed yet? Firmware & USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copy API key"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Screens"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Add to this screen"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Cheatsheet and a test alert"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Updates, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nothing to save"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identify this screen"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Blinks the backlight and shows a card"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Needs a newer firmware"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Export layout"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Download and copy as JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Search screens, entities, actions…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Nothing matches. Type part of a screen, entity or action."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Choose a screen"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Pick one of your screens on the left to change its tiles, top bar and settings."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Start with a screen"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Connect a CYD or Guition via USB to your Home Assistant machine. Profile, firmware, and the first flash happen in one go."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Install new screen"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"You have unsaved changes. Open a different screen anyway?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Replace the unsaved layout with a copy of the other screen's?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Replace the unsaved layout with the imported one?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Saved. Your screen is being updated."}},other:{t:0,b:{t:2,i:[{t:3,v:"Saved. "},{t:4,k:"name"},{t:3,v:" is being updated."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Saved. The screen is being updated."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Saved. Your newest change isn't sent yet: press Save & send again."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" blinks and shows a card for a few seconds."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · changes are saved"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Layout"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Screen settings"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Saved · sent to screen"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"All saved"}},more:{t:0,b:{t:2,i:[{t:3}],s:"More"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identify"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"blink the screen"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Needs firmware 0.2.31 or newer"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"from Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copy layout from…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" screen"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" screens"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"no other screen"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" tile"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" tiles"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Export layout"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Import layout…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"Override YAML"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"advanced"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"No ESPHome profile found for this screen"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Update firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" removed"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"There is no room for this tile on page "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"No page is free for a full-page tile. Free a page first."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"This screen already has a tile that goes to page "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Layout of "},{t:4,k:"name"},{t:3,v:" copied. Save & send when it looks right."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Layout of "},{t:4,k:"name"},{t:3,v:" copied: "},{t:4,k:"kept"},{t:3,v:" of "},{t:4,k:"total"},{t:3,v:" tiles fit this screen's firmware. Save & send when it looks right."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Layout imported. Save & send when it looks right."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Layout imported: "},{t:4,k:"kept"},{t:3,v:" of "},{t:4,k:"total"},{t:3,v:" tiles fit this screen's firmware. Save & send when it looks right."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"That isn't JSON. Export a layout first, or paste one from another ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"No tiles in this file. Expected a layout exported from ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" page · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tiles"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pages · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tiles"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Add your first light, scene, or device from the library."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Tap the top bar or a tile to change it. Drag to move; drop on the next page for a new one."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Empty slots and fixed positions work from firmware 0.2.26. This screen (firmware "},{t:4,k:"firmware"},{t:3,v:") shifts the tiles up to the first free slot until that update."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Screen layout"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Add page"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 page is the most"},{t:2,i:[{t:4,k:"n"},{t:3,v:" pages is the most"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Page "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remove page"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"The pages after this one shift up one slot"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Edit top bar"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Empty slot. Click to add a tile here, or drag one over."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Empty slot "},{t:4,k:"slot"},{t:3,v:" on page "},{t:4,k:"page"},{t:3,v:": add the next tile here"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Next tile goes here"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Empty"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Library"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entity"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entities"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search by name, device, or room…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Add an entity"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"All"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Lights"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climate"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Switches"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Actions"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Fans"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Covers"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scenes"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Vacuum"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensors"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Weather"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Values"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selects"}},person:{t:0,b:{t:2,i:[{t:3}],s:"People"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timers"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Screen"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Room"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"All rooms"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Hide placed"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Hide what is already on this screen"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Everything here is already on this screen."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No entities found. Try a different name, room or filter."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"This screen holds 1 tile."},{t:2,i:[{t:3,v:"This screen holds "},{t:4,k:"n"},{t:3,v:" tiles."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"This screen holds 1 tile; update its firmware for 48."},{t:2,i:[{t:3,v:"This screen holds "},{t:4,k:"n"},{t:3,v:" tiles; update its firmware for 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Drag onto a page, or tap + to add to the first free slot. ⌘K searches everything."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Light"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climate"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Vacuum"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Fan"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Cover"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Switch"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Switch"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scene"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Weather"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Value"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Value"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Select"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Select"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Screen"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sun"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Person"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Camera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Image"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entity"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"large value"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"weather forecast"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"graph"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"digital clock"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"analog clock"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"sun path"}},live:{t:0,b:{t:2,i:[{t:3}],s:"live picture"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"album cover"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"double"}},full:{t:0,b:{t:2,i:[{t:3}],s:"full page"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Name on the screen"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatic (from Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatic (default)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The screen shows a chosen icon from firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Goes to page"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (empty)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Navigation tiles need firmware 0.2.62: press Update on the screen first."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"This screen has no page "},{t:4,k:"page"},{t:3,v:", so a tap opens its last page. Choose another page."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"A tap on the tile opens that page."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Display"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Digital clock"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Analog clock"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Name and status"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Large value"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Weather forecast"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Graph"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Sun path"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Live picture"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"A small picture of the camera in the icon's place, refreshed at the pace below while the page is on screen. A tap still opens it full screen."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"A live picture needs firmware 0.2.77 or newer: press Update on the screen after saving."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Album cover"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"The album cover of what plays in the icon's place, like Home Assistant's own tile; a player without a picture keeps its icon. A tap still opens the card."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The album cover on the tile needs firmware 0.2.78 or newer: press Update on the screen after saving."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant has no numbers for this entity, so the graph stays empty. Choose another display."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"This weather service has no daily forecast in Home Assistant. Choose another display."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Refresh"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Every "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Size"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Double-width"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Full page"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Full page: one big button in the tile's own colour; a slider, controls or a graph sit at the bottom of it."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"A full-page tile needs firmware 0.2.62: press Update on the screen first."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Page"}},new:{t:0,b:{t:2,i:[{t:3}],s:"New page"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Direct control on the tile"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant doesn't offer this control for this entity, so it stays empty on the screen. Choose another one."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"At the bottom of the full-page tile; a tap anywhere else works as set below."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"On the right of the double-width tile, like the rows in Home Assistant. Tapping the name works as set below."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The screen shows direct control from firmware 0.2.19; until then the tile stays as it was."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"On tap"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatic"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Open control"}},none:{t:0,b:{t:2,i:[{t:3}],s:"View only"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"On / off"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Perform action"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant can't turn this on and off, so a tap does nothing. Choose another option."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The screen switches this from firmware 0.2.58: press Update on the screen. Until then a tap opens its card."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Hold the tile to open its card."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Small slider on the tile"}},no:{t:0,b:{t:2,i:[{t:3}],s:"No"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Yes, control directly"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant has nothing a slider can change for this entity. Choose No."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"History"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" hour"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" hours"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pastel background"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Background: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", slot "},{t:4,k:"slot"},{t:3,v:" on page "},{t:4,k:"page"},{t:3,v:". Enter: configure, arrow keys: move"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remove tile"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Remove "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Action"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Asking Home Assistant which actions this entity has…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant isn't answering right now. Try again in a moment."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Choose an action"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search, for example toggle, position, or play"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Search for an action"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No action found."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant doesn't offer this action for this entity any more, so a tap does nothing. Choose another one."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (optional)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Not set"}},on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant needs "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"The screen performs an action from firmware 0.2.58: press Update on the screen. Until then a tap works as Automatic."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icon"}},none:{t:0,b:{t:2,i:[{t:3}],s:"No icon"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search, for example lamp, music, or door"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Search for an icon"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"No icon, text only"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icon: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No icon found."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Current data"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Connection, status, and supported properties"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Reading…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Fetching current HA status…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Status: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Small slider: "},{t:4,k:"slider"},{t:3,v:" · Display: "},{t:4,k:"display"},{t:3,v:" · Size: "},{t:4,k:"size"},{t:3,v:" · Control: "},{t:4,k:"control"},{t:3,v:" · Background: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"yes"}},no:{t:0,b:{t:2,i:[{t:3}],s:"no"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"none"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Default"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Read again"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" removed from the top bar"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"The top bar has room for 1 item."},{t:2,i:[{t:3,v:"The top bar has room for "},{t:4,k:"n"},{t:3,v:" items."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"This is already in the top bar."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Top bar"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Top bar: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"From the screen itself, also works without Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" of "},{t:4,k:"n"},{t:3,v:" item"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" of "},{t:4,k:"n"},{t:3,v:" items"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Left: name"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"For example: Living room"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Right: time, sensors, or a clock"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", slot "},{t:4,k:"slot"},{t:3,v:". Enter: configure, arrows: move"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Remove "},{t:4,k:"name"},{t:3,v:" from the top bar"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maximum 1 item"},{t:2,i:[{t:3,v:"Maximum "},{t:4,k:"n"},{t:3,v:" items"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Add the time, date, analog clock, or an entity"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Add time, date, or an entity"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Not everything fits next to the name: the screen drops the dashed items. Remove one or choose a shorter name."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Drag to reorder; tap an item to configure it."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensors, the date, and the analog clock appear from firmware "},{t:4,k:"version"},{t:3,v:"; until that update, this screen shows the name and, if the time is in the bar, the clock."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Hidden: not active right now"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Doesn't fit next to the name"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Dial"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Hidden right now: not active"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Doesn't currently fit next to the name"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"How it looks on the screen"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Small dial with the time"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"What to show"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Last changed keeps counting on the screen itself: “Just now”, “5 min ago”, “Yesterday”."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatic (like Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Show"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Only when active hides the item as long as it's off, closed, away, or 0. Handy for an open door, a running washing machine, or who's home."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"24 hour clock · change under "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"12 hour clock · change under "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Settings → Language & region"}},date_hint:{t:0,b:{t:2,i:[{t:4,k:"date"},{t:3,v:" today. The date follows the screen's own clock."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Up"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Down"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Add to the top bar"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" of "},{t:4,k:"n"},{t:3,v:" slot used"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" of "},{t:4,k:"n"},{t:3,v:" slots used"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"From the screen itself"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Already added"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Suggestions from Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"An entity"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search by name, room, or entity, e.g. temperature or door"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Search for an entity for the top bar"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"No entities found."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brightness"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Night"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Screen"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brightness"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Dark mode"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Auto standby"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Standby after"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Standby brightness"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Night mode"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Starts"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Ends"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Night brightness"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Back to page 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"After"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Also on standby"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Swipe between pages"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Page buttons"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotation"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" sec"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Still saving the other screen's settings. Try again in a moment."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Page buttons and swiping are off, so only Go to page tiles change the page."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"page "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"pages "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tile, to "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tiles, to "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tile, to "},{t:4,k:"targets"},{t:3,v:", but none to "},{t:4,k:"missing"},{t:3,v:", so you can't reach it."}]},{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tiles, to "},{t:4,k:"targets"},{t:3,v:", but none to "},{t:4,k:"missing"},{t:3,v:", so you can't reach it."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tile, to "},{t:4,k:"targets"},{t:3,v:", but none to "},{t:4,k:"missing"},{t:3,v:", so you can't reach them."}]},{t:2,i:[{t:3,v:"You have "},{t:4,k:"n"},{t:3,v:" Go to page tiles, to "},{t:4,k:"targets"},{t:3,v:", but none to "},{t:4,k:"missing"},{t:3,v:", so you can't reach them."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"You have no Go to page tiles."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"You have no Go to page tiles to "},{t:4,k:"missing"},{t:3,v:", so you can't reach it."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"You have no Go to page tiles to "},{t:4,k:"missing"},{t:3,v:", so you can't reach them."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"The tiles to "},{t:4,k:"pages"},{t:3,v:" are only on pages you can't reach."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"From "},{t:4,k:"pages"},{t:3,v:" no tile leads back to page 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"This screen is offline. Its settings can change once it's back."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Changes apply on the screen at once, and show up here when they change there."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Changes apply at once. Firmware 0.2.49 lets the screen keep them itself."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"This entity is off in Home Assistant, or the screen is restarting."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" lower"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" higher"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Starting update…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Building the firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Writing the firmware over Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Building and installing…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Waiting for the screen to come back…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Checking that it stays stable…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"New language: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Screens will now update automatically at night."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Automatic updates are off."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Firmware updates"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Updating to firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"No screen paired yet. New screens get firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" is available for "},{t:4,k:"n"},{t:3,v:" screen."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" is available for "},{t:4,k:"n"},{t:3,v:" screens."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"All screens have firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Update 1 screen"},{t:2,i:[{t:3,v:"Update all "},{t:4,k:"n"},{t:3,v:" screens"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"What's new in firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Update automatically every night"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Between 03:00 and 06:00, one screen at a time. Stops on an error and reports it in Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Skill installed. Claude Code picks it up right away."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Skill installed. Restart Claude Code once so it finds the new skills folder."}},text:{t:0,b:{t:2,i:[{t:3}],s:'Teach Claude about ESP Screens, then ask: "Show an alert on all my screens when the mailbox is full." Claude knows the alert events, every field, color, and icon.'}},install:{t:0,b:{t:2,i:[{t:3}],s:"Install for Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Install again"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Update the skill"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Not installed"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Installed"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Installed · a newer version is ready"}},writes:{t:0,b:{t:2,i:[{t:3,v:"For Claude Code in Home Assistant. Writes one file to "},{t:4,k:"path"},{t:3,v:"; installing again replaces it."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download for claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Upload the zip in Claude under Customize → Skills."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Everything around your screens."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← My screens"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Screens"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Add a screen, or build and reinstall the firmware of one you already have."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Build and install via USB or Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Language & region"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Screen language"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant's language ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant's language"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"The screens use English until Home Assistant's language is available."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · not checked yet, help welcome"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" is not checked yet, help welcome: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"how to translate"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"After a change every screen needs a firmware update, one build each: with its Update button, or in the nightly updates."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Time format"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatic, follows the language ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 hour"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 hour"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Number format"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatic, follows the language ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Your Home Assistant profile: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Use these"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"The editor itself follows the language of your Home Assistant profile."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Saved."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Saved. Every screen takes the new language with its next update."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"A card over the whole screen from an automation, on one screen or on all of them. The cheatsheet has the action names, fields, icons, and colors, and a form to try one."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Full-screen notifications, from an automation"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Build and install screen firmware"}},intro:{t:0,b:{t:2,i:[{t:3,v:"The built-in ESPHome CLI uses your own profile (YAML with keys) and secrets. Choose the screen's profile, then a USB port (screen connected to the Home Assistant machine), "},{t:4,k:"ota"},{t:3,v:" with the hostname, or "},{t:4,k:"download"},{t:3,v:" to put the firmware on the screen from your own computer. "},{t:4,k:"check"},{t:3,v:" only validates, "},{t:4,k:"build"},{t:3,v:" compiles, "},{t:4,k:"install"},{t:3,v:" puts the firmware on the screen. Your tiles stay as they are in ESP Screens. The first build takes a few minutes."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Check"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Build only"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Build & install"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Build & download"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"The ESPHome CLI is missing. Update the app to 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Choose the intended profile, then a USB port, an IP address, or Download."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome profile"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Install to"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · no board found on the Home Assistant machine yet"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Download · flash from your own computer"}},host:{t:0,b:{t:2,i:[{t:3}],s:"IP address or hostname"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Download "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Put it on the screen with "},{t:4,k:"esphome_web"},{t:3,v:" in Chrome or Edge: Connect, choose the screen's USB port, Install, and select this file. It holds your Wi-Fi password and the screen's keys: keep it to yourself."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Connect and install."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profile saved."}},running:{t:0,b:{t:2,i:[{t:3}],s:"One moment…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Ready to download."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Done."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"That didn't work."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens creates the screen's own profile with unique keys and builds the firmware. Connect the screen with a USB data cable to the machine running Home Assistant, or download the firmware and put it on the screen from your own computer."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Which screen do you have?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2.8 inch"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 inch"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Name"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Living room screen"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Device name"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"customize"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Every screen gets its own profile with its own keys. Four screens? Go through this four times with a different name."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Lowercase letters, digits, and dashes. A different name for each screen."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi name (2.4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi password"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Fill in once: ESP Screens saves this in ESPHome secrets.yaml, later screens use it automatically."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Your ESPHome secrets.yaml is still missing Wi-Fi details. ESP Screens only fills in the missing lines."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi comes from your ESPHome secrets.yaml."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"secrets.yaml in the ESPHome folder isn't valid YAML. Fix the file first; it won't be overwritten."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Install via"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Later · save profile only"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Connect the screen with a USB data cable to the Home Assistant machine; the list refreshes on its own. Or choose Download to use your own computer."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download the firmware and put it on the screen from your own computer, in Chrome or Edge. After that, updates go over Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"The profile goes into the ESPHome folder. You can install later via Firmware & USB, or from ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"More than one board connected: choose this screen's port."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Once over USB; after that, everything is wireless."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Install"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Save profile"}},busy:{t:0,b:{t:2,i:[{t:3,v:"A build or installation is already running ("},{t:4,k:"file"},{t:3,v:"). Wait for it to finish."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"The ESPHome CLI is missing from this installation; only saving the profile is possible."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" is in the ESPHome folder"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Writing firmware to "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Building firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Firmware for "},{t:4,k:"name"},{t:3,v:" is ready"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Firmware is on "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Build failed"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Install failed"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Install it later from Firmware & USB: choose this profile, then the USB port of the Home Assistant machine, or Download to put the firmware on the screen from your own computer. Save the API key for pairing:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Don't disconnect the USB cable yet."}},building:{t:0,b:{t:2,i:[{t:3}],s:"A first build takes a few minutes on a Raspberry Pi. You can leave this page: the installation keeps running and you'll find it again under New screen."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"A first build takes a few minutes on a Raspberry Pi. You can leave this page: the build keeps running and you'll find it again under New screen."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Put it on the screen from your own computer, then pair the screen with Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"The screen boots up and connects to your Wi-Fi. Pair it with Home Assistant now:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"The screen boots up and connects to your Wi-Fi. The CYD first asks for a touch calibration: tap the crosshairs. Pair it with Home Assistant now:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"See the log below."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" with a USB data cable."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Plug the screen into your computer"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" in Chrome or Edge, click Connect and choose the screen's USB port."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Open "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" and select "},{t:4,k:"file"},{t:3,v:". The screen restarts and joins your Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" and select "},{t:4,k:"file"},{t:3,v:". The screen restarts and joins your Wi-Fi. The CYD first asks for a touch calibration: tap the crosshairs."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Click Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"The file holds your Wi-Fi password and the screen's keys: keep it to yourself."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"API key"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" This happens outside ESP Screens. Home Assistant discovers "},{t:4,k:"name"},{t:3,v:" as an ESPHome device; click Add. Not discovered? Add ESPHome manually with the screen's IP address."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Go to Home Assistant → Settings → Devices & services."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" above when Home Assistant asks for an encryption key."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Paste the API key"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ESPHome integration → Configure → “Allow the device to perform Home Assistant actions”. Without this, the screen sees everything but controls nothing."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Allow HA actions:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Back in ESP Screens, the screen appears in the list on the left within about thirty seconds; until then it's shown there as “not yet in Home Assistant”."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Choose your tiles."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome log"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Retry"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Install another screen"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Start over"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Done"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alerts · cheatsheet"}},title:{t:0,b:{t:2,i:[{t:3}],s:"A full-screen notification, from an automation."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Every screen has the "},{t:4,k:"action"},{t:3,v:" action. It places a card over everything, wakes the screen, and keeps the backlight at normal brightness until someone taps the button or the timeout runs out. Home Assistant itself shows no explanation or dropdowns for ESPHome actions; everything you can fill in is listed here."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"The cheatsheet is still loading; one moment."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Someone is at the door"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Door 3, back"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Coming"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Sections"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Try it"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Your screens"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"In an automation"}},all:{t:0,b:{t:2,i:[{t:3}],s:"All screens"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"The fields"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Icons"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Colors"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Behavior"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Events"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Tips"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Send one alert now, with the same fields an automation sends. The screen shows the card and, with blinking on, flashes its backlight."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Screen"}},all:{t:0,b:{t:2,i:[{t:3,v:"All screens ("},{t:4,k:"ready"},{t:3,v:" ready)"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · not ready"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Title"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Subtitle"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icon"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Color"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Button text"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Timeout (seconds, 0 waits for the button)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Blink the backlight"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Four times when the alert arrives."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Sending…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Send alert"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Sent to "},{t:4,k:"n"},{t:3,v:" screen."}]},{t:2,i:[{t:3,v:"Sent to "},{t:4,k:"n"},{t:3,v:" screens."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Sent to "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Sent to the screen."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 skipped (offline or old firmware)."},{t:2,i:[{t:4,k:"n"},{t:3,v:" skipped (offline or old firmware)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Left empty: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"No screen could show it: check that a screen is online with firmware "},{t:4,k:"version"},{t:3,v:" or newer."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"White (default)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Every screen has its own action, with the device name in it. From firmware "},{t:4,k:"version"},{t:3,v:"; update an older screen with its Update button under Screens."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"No screen paired yet. Install one via New screen; the action appears once Home Assistant sees the screen."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Update needed · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Device name unknown · update the screen"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Show alert"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Dismiss alert"}}},howto:{add:{t:0,b:{t:2,i:[{t:4,k:"add"},{t:3,v:" and search for "},{t:4,k:"esphome"},{t:3,v:`. Choose your screen's action: Home Assistant calls it "Performs the action show_alert of the node `},{t:4,k:"device"},{t:3,v:'".'}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Add action"}},device:{t:0,b:{t:2,i:[{t:3}],s:"device name"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant asks for all seven; leave what you don't use empty ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", off)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fill in the fields."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Prefer YAML? Choose "},{t:4,k:"edit"},{t:3,v:" on the action and paste the example below."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Example for"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"a screen (not paired yet)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Edit in YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copy YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"All screens at once"}},text:{t:0,b:{t:2,i:[{t:3,v:"Fire the event "},{t:4,k:"show"},{t:3,v:" with the same fields, and ESP Screens passes the alert on to every screen that is online, including screens you add later. "},{t:4,k:"dismiss"},{t:3,v:" clears it everywhere. In an automation, add the "},{t:4,k:"event"},{t:3,v:" action or paste the example under "},{t:4,k:"edit"},{t:3,v:". Leave out the fields you don't use. ESP Screens has to be running for this."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Fire manual event"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Text is free-form; the limit is in bytes, and an accented letter counts as two. What doesn't fit gets an ellipsis (title) or is dropped (subtitle)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Field"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Type"}},what:{t:0,b:{t:2,i:[{t:3}],s:"What it does"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Example"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limit"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"text"}},int:{t:0,b:{t:2,i:[{t:3}],s:"number"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"on / off"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entity"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"0 to 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Fill in the name in "},{t:4,k:"field"},{t:3,v:", for example "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" and the hex codepoint ("},{t:4,k:"hex"},{t:3,v:") also work. Only these icons are included in the firmware; any other name shows the warning triangle. Tap an icon to copy its name."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Handy for notifications"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Search for an icon"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Search by name or description…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Also available: control and weather icons"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copy "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:'No icon for "'},{t:4,k:"query"},{t:3,v:'". Unknown names show the warning triangle ('},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Fill in the name in "},{t:4,k:"field"},{t:3,v:". These are the pastel shades of the tiles, with dark text. Empty or unknown gives the white card. Tap to copy."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" An alert immediately wakes a dimmed or dark screen and appears above every page, every open light card, and the standby layer."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wakes the screen."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" As long as the card is showing, the backlight stays at normal brightness. Standby and night hours wait. After the button, the regular standby time starts again."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"On until the button."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" waits for the button, however long that takes. With "},{t:4,k:"minute"},{t:3,v:" the card disappears after a minute, but the button closes it sooner."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Timeout."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" blinks the backlight four times when the alert arrives (about a second) and leaves the screen on afterward."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Blinking."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" A new alert replaces the current one; there's no stack. The replaced alert reports itself as "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Replacing."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" clears the card, for example if the door is already open. Without an alert, that action does nothing."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Closing remotely."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" does nothing; only the button closes it. That way a wake-up tap never accidentally dismisses the alert."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tapping beside the card"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Every end fires the event "},{t:4,k:"event"},{t:3,v:" with "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (the device name) and the "},{t:4,k:"device_id"},{t:3,v:" that Home Assistant adds. Visible under Settings → Tools → Events."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"When"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Waiting until someone presses the button"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Use a "},{t:4,k:"bold"},{t:3,v:': orange for the door, red for smoke or water, green for "done". The text always stays dark and readable.'}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"color per kind of notification"}},short:{t:0,b:{t:2,i:[{t:3,v:"Keep the title "},{t:4,k:"bold"},{t:3,v:"; a screen shows about twenty characters on one line and ends a longer title with an ellipsis. Put details in the subtitle."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"short"}},button:{t:0,b:{t:2,i:[{t:3,v:"A "},{t:4,k:"bold"},{t:3,v:' turns the notification into a question: "Coming", "Seen", "Turn off". The event then tells you who responded.'}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"custom button text"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"For an alert that resolves itself (the door opens, the laundry gets taken out) close it in the same automation with "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Every screen? Fire "},{t:4,k:"event"},{t:3,v:" once (see All screens at once). The screens still work independently and each reports with its own "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Rather "},{t:4,k:"bold"},{t:3,v:" for the automation? Install the ESP Screens skill under Settings → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"ask Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Doorbell: show the alert and wait until someone presses the button."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Someone is coming to the door."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Advanced · local override"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Override YAML"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"Override YAML · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"This small file is yours. It is loaded after the shared screen package and stays in place when ESP Screens updates. Change hardware-specific details here, such as a display model."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"What is safe to change?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Display, touchscreen, substitutions, pins and other device details. Name, Wi-Fi, API, OTA and package links remain managed."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Active"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Ready to attach"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"Local override YAML"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Use example"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 character"},{t:2,i:[{t:4,k:"n"},{t:3,v:" characters"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 line"},{t:2,i:[{t:4,k:"n"},{t:3,v:" lines"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Save & check"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Save override"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"No ESPHome profile was found for this screen."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Changes here apply on the next build."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Save once to attach this file to the profile."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Checking and saving…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Saved. The override is kept during firmware updates."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"Override YAML saved."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Saved. ESPHome is checking the complete profile…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome is checking the profile…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome is checking the profile… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"The complete profile is valid. Safe to build and install."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome rejected the complete profile. See Firmware & USB for the full log."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Replace the current text with the example?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Example loaded. Save it when you are ready."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Clear the local override?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"The override will be empty after you save."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Home"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Unknown"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Unavailable"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Heat"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Cool"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Heat/Cool"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Dry"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Fan only"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Heating"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Cooling"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Idle"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Drying"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Fan"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Preheating"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Defrosting"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Opening"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Closing"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Playing"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Paused"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Idle"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"Standby"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Home"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Away"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Above horizon"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Below horizon"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Docked"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Cleaning"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Paused"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Returning to dock"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Idle"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Sunny"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Clear, night"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Cloudy"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Partly cloudy"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Rainy"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Pouring"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Snowy"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Snowy, rainy"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Fog"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Hail"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Lightning"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Lightning, rainy"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Windy"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Exceptional"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Low"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Charging"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Not charging"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Cold"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Connected"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Disconnected"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Hot"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Light detected"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"No light"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Unlocked"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Locked"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Wet"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Dry"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"Moving"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Not moving"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Plugged in"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Unplugged"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Home"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Away"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problem"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"Running"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Not running"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Unsafe"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Safe"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Tampering detected"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Update available"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Up-to-date"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Detected"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Clear"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Closed"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Activate"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Run"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Press"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Low"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Medium"}},high:{t:0,b:{t:2,i:[{t:3}],s:"High"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Middle"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Focus"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffuse"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Top"}},on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"On"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Off"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Both"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Vertical"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Just now"}},minutes_ago:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min ago"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 hour ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" hours ago"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Yesterday"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 day ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" days ago"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 week ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" weeks ago"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 month ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" months ago"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 year ago"},{t:2,i:[{t:4,k:"n"},{t:3,v:" years ago"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In 1 hour"},{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" hours"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Tomorrow"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"In 1 day"},{t:2,i:[{t:3,v:"In "},{t:4,k:"n"},{t:3,v:" days"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"Sunday"}},{t:0,b:{t:2,i:[{t:3}],s:"Monday"}},{t:0,b:{t:2,i:[{t:3}],s:"Tuesday"}},{t:0,b:{t:2,i:[{t:3}],s:"Wednesday"}},{t:0,b:{t:2,i:[{t:3}],s:"Thursday"}},{t:0,b:{t:2,i:[{t:3}],s:"Friday"}},{t:0,b:{t:2,i:[{t:3}],s:"Saturday"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"Sun"}},{t:0,b:{t:2,i:[{t:3}],s:"Mon"}},{t:0,b:{t:2,i:[{t:3}],s:"Tue"}},{t:0,b:{t:2,i:[{t:3}],s:"Wed"}},{t:0,b:{t:2,i:[{t:3}],s:"Thu"}},{t:0,b:{t:2,i:[{t:3}],s:"Fri"}},{t:0,b:{t:2,i:[{t:3}],s:"Sat"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"Su"}},{t:0,b:{t:2,i:[{t:3}],s:"Mo"}},{t:0,b:{t:2,i:[{t:3}],s:"Tu"}},{t:0,b:{t:2,i:[{t:3}],s:"We"}},{t:0,b:{t:2,i:[{t:3}],s:"Th"}},{t:0,b:{t:2,i:[{t:3}],s:"Fr"}},{t:0,b:{t:2,i:[{t:3}],s:"Sa"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"January"}},{t:0,b:{t:2,i:[{t:3}],s:"February"}},{t:0,b:{t:2,i:[{t:3}],s:"March"}},{t:0,b:{t:2,i:[{t:3}],s:"April"}},{t:0,b:{t:2,i:[{t:3}],s:"May"}},{t:0,b:{t:2,i:[{t:3}],s:"June"}},{t:0,b:{t:2,i:[{t:3}],s:"July"}},{t:0,b:{t:2,i:[{t:3}],s:"August"}},{t:0,b:{t:2,i:[{t:3}],s:"September"}},{t:0,b:{t:2,i:[{t:3}],s:"October"}},{t:0,b:{t:2,i:[{t:3}],s:"November"}},{t:0,b:{t:2,i:[{t:3}],s:"December"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"Jan"}},{t:0,b:{t:2,i:[{t:3}],s:"Feb"}},{t:0,b:{t:2,i:[{t:3}],s:"Mar"}},{t:0,b:{t:2,i:[{t:3}],s:"Apr"}},{t:0,b:{t:2,i:[{t:3}],s:"May"}},{t:0,b:{t:2,i:[{t:3}],s:"Jun"}},{t:0,b:{t:2,i:[{t:3}],s:"Jul"}},{t:0,b:{t:2,i:[{t:3}],s:"Aug"}},{t:0,b:{t:2,i:[{t:3}],s:"Sep"}},{t:0,b:{t:2,i:[{t:3}],s:"Oct"}},{t:0,b:{t:2,i:[{t:3}],s:"Nov"}},{t:0,b:{t:2,i:[{t:3}],s:"Dec"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday_min"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:"."}},group:{t:0,b:{t:2,i:[{t:3}],s:","}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"1"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Page "},{t:4,k:"n"}]}}}}},Wh=Vh,Ka=e=>e%10>=2&&e%10<=4&&(e%100<12||e%100>14),za={one_other:e=>e===1?0:1,one_upto_1:e=>Math.abs(e)<=1?0:1,slavic_pl:e=>e===1?0:Ka(e)?1:2,east_slavic:e=>e%10===1&&e%100!==11?0:Ka(e)?1:2,none:()=>0},Bh=Object.assign({"../../screen_manager/translations/de.json":()=>bn(()=>import("./de-B91bzzJv.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/en-GB.json":()=>bn(()=>import("./en-GB-v7qWKoyN.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/es.json":()=>bn(()=>import("./es-DVs9Eema.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/fr.json":()=>bn(()=>import("./fr-uzS0ol44.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/it.json":()=>bn(()=>import("./it-Dpzyqhcz.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/nl.json":()=>bn(()=>import("./nl-BhHjNiTy.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/pl.json":()=>bn(()=>import("./pl-DSfDGiw6.js"),[],import.meta.url).then(e=>e.default),"../../screen_manager/translations/pt.json":()=>bn(()=>import("./pt-C_sKl9l8.js"),[],import.meta.url).then(e=>e.default)}),Kh=Object.fromEntries(Object.entries(Bh).map(([e,t])=>[e.slice(e.lastIndexOf("/")+1,-5),t])),Rs={...cp},tu=new Set(["en"]),yl={},nu=e=>yl[e]=(t,n)=>Math.min((za[Rs[e]?.plural]||za.one_other)(t),n-1),wl=()=>["en",...Object.keys(Rs).filter(e=>e!=="en").sort()];wl().forEach(nu);const cs=Ih({locale:"en",fallbackLocale:"en",messages:{en:Wh},pluralRules:yl,missingWarn:!1,fallbackWarn:!1,missing:(e,t)=>{}}),c=cs.global.t,zh=(e,t="en")=>cs.global.te(e,t),kl=()=>cs.global.locale.value,qh=e=>Rs[e];function Yh(e=window){try{if(e.parent!==e){const t=e.parent.document.documentElement.lang;if(t)return t}}catch{}return e.navigator.language||"en"}function su(e,t=wl()){const n=i=>t.find(l=>l.toLowerCase()===i.toLowerCase()),s=(e||"").trim();return s?n(s)||n(s.split("-")[0]):void 0}const iu=(e,t=wl())=>su(e,t)||"en";function Gh(e,t,n=Rs[e]){n&&(Rs[e]=n),yl[e]||nu(e),cs.global.setLocaleMessage(e,t),tu.add(e)}const qa={};function ou(e){if(tu.has(e))return Promise.resolve(!0);const t=Kh[e];return t?qa[e]??=t().then(n=>(Gh(e,n),!0),()=>(delete qa[e],!1)):Promise.resolve(!1)}async function Jh(e=iu(Yh())){const t=await ou(e)?e:"en";return cs.global.locale.value=t,document.documentElement.lang=t,t}const os={point:{decimal:".",group:",",from:4},comma:{decimal:",",group:".",from:4},space:{decimal:",",group:" ",from:4}};function lu(e,t){const n=String(e),s=/^(-?)(\d+)(?:\.(\d+))?$/.exec(n);if(!s)return n;const i=s[2].length>=t.from?s[2].replace(/\B(?=(\d{3})+$)/g,t.group):s[2];return`${s[1]}${i}${s[3]!==void 0?t.decimal+s[3]:""}`}const Ya={comma_decimal:"point",decimal_comma:"comma",space_comma:"space"};function Xh(e=window){try{if(e.parent===e)return{};const t=e.parent.document.querySelector("home-assistant")?.hass?.locale,n=["12","24"].includes(t?.time_format)?t.time_format:void 0;return{...n?{clock:n}:{},...Ya[t?.number_format]?{numbers:Ya[t.number_format]}:{}}}catch{return{}}}const Zh=(e,t=kl())=>new Intl.ListFormat(t==="en"?"en-GB":t,{type:"conjunction"}).format(e.map(String)),ze=6,fn=8,Ns=fn*ze,au=["single","wide","full"],Sn=e=>e===!0?"wide":e===!1?"single":e,us=e=>/^screen\.page_[1-8]$/.test(e)?Number(e.slice(-1)):0,ut=e=>au.includes(e.options?.size)?e.options.size:"single",Uo=e=>ut(e)!=="single",ru=e=>ut(e)==="full",cu=e=>e-e%ze,uu=e=>e-e%2,At=e=>Math.floor(e/ze),$l=e=>Sn(e)==="full"?ze:Sn(e)==="wide"?2:1,Bn=(e,t)=>Sn(t)==="full"?Array.from({length:ze},(n,s)=>cu(e)+s):Sn(t)==="wide"?[e,e+1]:[e],Ga=(e,t)=>Sn(t)==="full"?cu(e):Sn(t)==="wide"?uu(e):e,Ze=e=>e.tiles.map(t=>({tile:t,slot:t.slot}));function du(e){let t=0;return e.map(n=>{const s=ut(n);s==="full"&&t%ze?t+=ze-t%ze:s==="wide"&&t%2===1&&t++;const i=t;return t+=$l(s),i})}function Qh(e){const t=du(e);return e.some((n,s)=>n.slot!==t[s])}function Vi(e){if(e.tiles.some(t=>!Number.isInteger(t.slot))){const t=du(e.tiles);e.tiles.forEach((n,s)=>n.slot=t[s])}e.tiles.sort((t,n)=>t.slot-n.slot)}function ts(e){const t=new Set;for(const{tile:n,slot:s}of e)for(const i of Bn(s,ut(n)))t.add(i);return t}const Fs=(e,t,n)=>Number.isInteger(t)&&t>=0&&t!e.has(s));function wi(e,t,n=0){for(let s=n;si.includes(h))?u.push(f):r.push({tile:f,slot:f.slot}));for(const f of u){const h=ut(f),p=ts(r);let b=l.map(v=>Ga(v,h)).find(v=>Fs(p,v,h));if(b===void 0&&(b=fu(p,h,f.slot)),b<0)return null;r.push({tile:f,slot:b})}return r.sort((f,h)=>f.slot-h.slot)}function It(e,t=1){const n=Math.max(0,...e.map(({tile:s,slot:i})=>i+$l(ut(s))));return Math.min(fn,Math.max(1,Math.ceil(n/ze),t||1))}function em(e,t){const n=Array.from({length:t},()=>new Set);let s=0;for(const{tile:h,slot:p}of e){const b=us(h.entity)-1,v=At(p);b<0||b>=t||v>=t||(s++,n[v].add(b))}const i=h=>{const p=new Set([0]),b=[0];for(;b.length;)for(const v of h(b.shift()))p.has(v)||(p.add(v),b.push(v));return p},l=i(h=>[...n[h]]),r=i(h=>n.flatMap((p,b)=>p.has(h)?[b]:[])),u=Array.from({length:t},(h,p)=>p),f=h=>h.map(p=>p+1);return{tiles:s,targets:f(u.filter(h=>n.some(p=>p.has(h)))),unreachable:f(u.filter(h=>!l.has(h))),noWayBack:f(u.filter(h=>l.has(h)&&!r.has(h)))}}function tm(e){const t=e.split(".")[0];return t==="sun"?{options:{display:"sunpath",size:"wide"}}:t==="weather"?{options:{display:"forecast",size:"wide"}}:us(e)?{}:t==="screen"?{options:{display:"digital",size:"wide"}}:{}}const hu=e=>({entity:e,name:"",slot:-1,...tm(e)});function mu(e,t){const n=e.entity.split(".")[0],s=t.controls?.[n],i=e.options||{};if(!s||!["wide","full"].includes(i.size)||!["standard","cover"].includes(i.display||"standard")||i.inline==="slider")return null;const l=i.controls??(i.size==="full"?"none":s.default);return l==="none"?null:l}function nm(e,t){const n=mu(e,t);return n?t.controls?.[e.entity.split(".")[0]]?.choices.find(s=>s.key===n)?.label||n:c("editor.inspect.control_none")}const jo=e=>(/^(\d+)\.(\d+)\.(\d+)$/.exec(e||"")||[]).slice(1).map(Number);function pn(e,t){const[n,s]=[jo(e),jo(t)];if(n.length!==3||s.length!==3)return!1;for(let i=0;i<3;i++)if(n[i]!==s[i])return n[i]>s[i];return!0}const sm=(e,t,n,s)=>pn(e,`${t}.${n}.${s}`),im=Ns;function om(e){return jo(e).length!==3?10:pn(e,"0.2.62")?im:pn(e,"0.2.7")?20:10}const lm=["standard","watch","forecast","graph","digital","analog","sunpath","live","cover"],bu=e=>lm.includes(e)?c(`editor.displays.${e}`):e,am=e=>c(`editor.sizes.${au.includes(e)?e:"single"}`),Ja=["light","switch","input_boolean","fan","media_player","climate"],rm=["light","fan","cover","number","input_number","media_player"],cm={light:["☀","#ad7600","#fff3d3"],climate:["❄","#c86620","#ffebdc"],vacuum:["◉","#008577","#def3ed"],fan:["✣","#008aab","#def5fa"],cover:["▤","#8053af","#eee5f8"],media_player:["▶","#007cad","#def2fc"],sensor:["⌁","#3476b1","#e5effa"],binary_sensor:["◈","#ad7600","#fff3d3"],switch:["⏻","#ad7600","#fff3d3"],input_boolean:["⏻","#ad7600","#fff3d3"],scene:["✦","#8053af","#eee5f8"],script:["▷","#8053af","#eee5f8"],weather:["☁","#007cad","#def2fc"],number:["±","#008577","#def3ed"],input_number:["±","#008577","#def3ed"],select:["≡","#5862af","#eaecfa"],input_select:["≡","#5862af","#eaecfa"],button:["↗","#5862af","#eaecfa"],input_button:["↗","#5862af","#eaecfa"],screen:["◷","#25282c","#e9ecf1"],sun:["☼","#c86620","#ffebdc"],timer:["⏱","#008577","#def3ed"],person:["☺","#2f7d32","#e1f2e2"],camera:["◧","#3d4a57","#e6ebf0"],image:["◧","#3d4a57","#e6ebf0"]};function Ht(e){const t=e.split(".")[0],n=cm[t];return n?[c(`editor.domains.${t}`),...n]:[c("editor.domains.entity"),"◇","#637184","#edf0f4"]}const vu={clock:"clock-outline",analog:"clock-outline",date:"calendar"},at=e=>JSON.stringify(e),Ae=e=>String.fromCodePoint(parseInt(e,16));function Wi(e,t=new Date,n){const s=String(t.getMinutes()).padStart(2,"0");if(e)return`${String(t.getHours()).padStart(2,"0")}:${s}`;const i=`${t.getHours()%12||12}:${s}`;return n?`${i} ${c(`screen.time.${t.getHours()<12?"am":"pm"}`,{},{locale:n})}`:i}const xl=(e=new Date,t="en")=>c("screen.date.top_bar",{weekday:c(`screen.date.weekdays_short.${e.getDay()}`,{},{locale:t}),weekday_min:c(`screen.date.weekdays_min.${e.getDay()}`,{},{locale:t}),day:e.getDate(),month:c(`screen.date.months_short.${e.getMonth()}`,{},{locale:t})},{locale:t});function um(e,t=Math.floor(Date.now()/1e3),n="en"){const s=t-e,i=Math.abs(s),l=u=>Math.floor(i/u),r=(u,f)=>f===void 0?c(`screen.time.${u}`,{},{locale:n}):c(`screen.time.${u}`,f,{locale:n});return s<0?i<3600?r("in_minutes",Math.max(1,l(60))):i<86400?r("in_hours",l(3600)):i<172800?r("tomorrow"):r("in_days",l(86400)):i<60?r("just_now"):i<3600?r("minutes_ago",l(60)):i<86400?r("hours_ago",l(3600)):i<172800?r("yesterday"):i<604800?r("days_ago",l(86400)):i<2592e3?r("weeks_ago",l(604800)):i<31536e3?r("months_ago",l(2592e3)):r("years_ago",l(31536e3))}const dm={guition:{width:448,top:36,name:27,text:21,icon:26},cyd:{width:298,top:24,name:18,text:14,icon:18}};let ps;const Ho=new Map,fm=()=>Ho.clear();function Dn(e,t){const n=`${t}|${e}`;let s=Ho.get(n);if(!s){if(ps===void 0&&(ps=document.createElement("canvas").getContext("2d")),ps){ps.font=t;const i=ps.measureText(e);s={left:-i.actualBoundingBoxLeft,right:i.actualBoundingBoxRight,top:-i.actualBoundingBoxAscent,bottom:i.actualBoundingBoxDescent,advance:i.width}}else{const i=Number(/(\d+(?:\.\d+)?)px/.exec(t)?.[1]||14),l=[...e].length*i*.55;s={left:0,right:l,top:-i*.72,bottom:i*.02,advance:l}}Ho.set(n,s)}return s}const pm=e=>({name:`500 ${e.name}px "Bar Roboto"`,text:`400 ${e.text}px "Bar Roboto"`,icon:`${e.icon}px "Tile Icons"`});function hm(e){return{icon:Math.max(2,Math.floor((e*4+5)/10)),item:Math.max(6,Math.floor((e*125+50)/100)),name:Math.max(8,Math.floor((e*16+5)/10))}}function gu(e,t,n,s){const i=pm(t),l=Dn("0",i.text),r=Math.round(l.bottom-l.top),u=hm(r),f=Dn(String.fromCodePoint(983376),i.icon),h=Math.round(f.bottom-f.top),p=e.map((C,K)=>{const O=s(C),E={index:K,item:C,view:O,shown:O.shown,width:0};return O.analog?(E.dial=h,E.width=h,E):(O.icon&&(E.icon={glyph:Ae(O.icon),ink:Dn(Ae(O.icon),i.icon)},E.width+=E.icon.ink.right-E.icon.ink.left),O.text&&(E.text={value:O.text,ink:Dn(O.text,i.text)},E.width+=(E.icon?u.icon:0)+E.text.ink.right-E.text.ink.left),E)}),b=p.filter(C=>C.shown),v=Dn(n,i.name).advance,y=Math.min(v,Math.floor(t.width*35/100)),I=C=>C.reduce((K,O)=>K+O.width,0)+Math.max(0,C.length-1)*u.item;let T=0;for(;Tt.width;)T++;const k=b.slice(T),A=new Set(b.slice(0,T).map(C=>C.index));let S=t.width-I(k);for(const C of k)C.x=S,S+=C.width+u.item;const U=k.length?k[0].x-u.name:t.width;return{metrics:t,fonts:i,cap:r,zero:l,gaps:u,parts:p,placed:k,dropped:A,nameText:n,natural:v,nameRoom:U}}function mm(e,t,n){if(Dn(e,t).advance<=n)return e;const s=[...e];for(;s.length&&Dn(s.join("")+"...",t).advance>n;)s.pop();return s.join("")+"..."}function bm(e){"fonts"in document&&Promise.all([document.fonts.load('500 27px "Bar Roboto"',"Studio 0"),document.fonts.load('400 21px "Bar Roboto"',"Away 0"),document.fonts.load('26px "Tile Icons"',String.fromCodePoint(983376))]).then(()=>{fm(),e()}).catch(()=>{})}let _u="";function vm(e){_u=e||""}async function Sl(e,t={}){const n=await fetch(`api/${e}`,{...t,headers:{"Content-Type":"application/json","X-Screen-CSRF":_u,"X-ESP-Screens-Language":kl(),...t.headers}});if(!n.ok){let s=c("editor.api.failed");try{const i=(await n.json())?.error;typeof i=="string"&&i.trim()&&(s=i)}catch{}throw new Error(s)}return n}const Ft=async e=>(await Sl(e)).json(),ft=async(e,t,n,s={})=>{const l=await(await Sl(e,{method:t,body:n===void 0?void 0:JSON.stringify(n),...s})).text();return l?JSON.parse(l):null},m=qn({inventory:{screens:[],entities:[]},connected:!1,reachable:!0,selected:null,layout:null,dirty:!1,busy:!1,saved:0,tab:"layout",selectedTile:null,inspector:null,iconPickerOpen:!1,actionPickerOpen:!1,actionSearch:"",insertAt:-1,filter:"",search:"",capabilities:{},entityActions:{},topbarPreviews:{},topbarAdded:null,topbarOverflow:[],settingEdits:{},settingPending:!1,updating:[],toast:null,now:Date.now(),fontsVersion:0,route:location.hash,overrideProfile:null,overrideFriendly:"",drag:{active:!1,moving:null,preview:null},menuOpen:!1,liveStates:{},room:"",hidePlaced:!1,palette:!1,firmwareJob:null}),yt=$(()=>m.inventory.screens.find(e=>e.id===m.selected)),ls=e=>(e&&"firmware_known"in e?e.firmware_known:e?.firmware)||"",yu=$(()=>ls(yt.value)),$t=(e,t,n)=>sm(yu.value,e,t,n),Kn=$(()=>{const e=yt.value?.tile_limit;return typeof e=="number"&&Number.isInteger(e)&&e>0?e:om(yu.value)}),Xa=$(()=>{const e=yt.value?.full_page;return typeof e=="boolean"?e:$t(0,2,62)}),gm=$(()=>{const e=yt.value?.page_tiles_repeat;return typeof e=="boolean"?e:$t(0,2,65)}),Bi=e=>gm.value&&us(e)>0,Ki=$(()=>yt.value?.board==="guition"),wu=$(()=>dm[Ki.value?"guition":"cyd"]),uo=$(()=>m.selectedTile&&m.layout?.tiles.includes(m.selectedTile)?m.selectedTile:void 0),Cl=e=>!!m.selectedTile&&xe(m.selectedTile)===xe(e);let Za=0;function Ce(e,t){m.toast={message:e,action:t},clearTimeout(Za),Za=window.setTimeout(()=>m.toast=null,t?8e3:5e3)}function _m(){m.toast=null}async function Lt(e,t,n="api_key"){try{if(!navigator.clipboard||!window.isSecureContext)throw new Error;await navigator.clipboard.writeText(e),Ce(c(`editor.copy.${n}.copied`))}catch{if(t){const s=document.createRange();s.selectNodeContents(t);const i=window.getSelection();i?.removeAllRanges(),i?.addRange(s)}Ce(c(document.execCommand("copy")?`editor.copy.${n}.copied`:`editor.copy.${n}.selected`))}}function ki(){const e="/config/integrations/dashboard";try{window.top.location.assign(e)}catch{window.open(e,"_blank")}}const ym=["","#settings","#new-screen","#firmware","#alerts","#override"],xt=$(()=>ym.includes(m.route)?m.route:"");function He(e){if(location.hash===e){m.route=e;return}location.hash=e}window.addEventListener("hashchange",()=>{m.route=location.hash,window.scrollTo(0,0)});function zs(e){return m.inventory.entities.find(t=>t.id===e)?.name||m.inventory.builtin?.find(t=>t.id===e)?.name||e}let fo={source:null,byName:{}};function qs(e){return fo.source!==m.inventory.icons&&(fo={source:m.inventory.icons,byName:Object.fromEntries((m.inventory.icons?.groups||[]).flatMap(t=>t.icons.map(n=>[n.name,n])))}),e?fo.byName[e]:void 0}function Cn(e){const t=m.inventory.icons;if(!t)return"F0335";const n=m.inventory.entities.find(i=>i.id===e),s=e.split(".")[0];return t.builtin?.[e]?t.builtin[e]:n?.icon?n.icon:s==="weather"?t.weather[n?.state||""]||t.weather.partlycloudy:s==="sun"?t.sun[n?.state||""]||t.sun.below_horizon:t.defaults[s]||t.fallback}const vs=e=>qs(e.options?.icon)?.cp||Cn(e.entity),po=new Set;async function zi(e){const t=[...new Set(e)].filter(n=>!po.has(n)&&!n.startsWith("screen."));if(t.length){t.forEach(n=>po.add(n));try{for(let n=0;n`entity=${encodeURIComponent(i)}`).join("&");Object.assign(m.capabilities,(await Ft(`capabilities?${s}`)).capabilities||{})}}catch{t.forEach(n=>po.delete(n))}}}const ho=new Set;async function wm(e){if(!ho.has(e)){ho.add(e);try{m.entityActions[e]=(await Ft(`entity-actions?entity=${encodeURIComponent(e)}`)).actions}catch{ho.delete(e)}}}let mo=!1;async function qi(){const e=[...new Set((m.layout?.tiles||[]).map(t=>t.entity).filter(t=>!t.startsWith("screen.")))];if(!(!e.length||mo)){mo=!0;try{for(let t=0;t`entity=${encodeURIComponent(s)}`).join("&");Object.assign(m.liveStates,(await Ft(`states?${n}`)).states||{})}}catch{}finally{mo=!1}}}function km(e){const t=m.liveStates[e];if(t)return t;const n=m.inventory.entities.find(s=>s.id===e);return n?.state?{state:n.state,word:null,a:{}}:null}let Vo=0;function pt(){m.dirty=!0,m.saved=0,Vo++}function ku(e){if(e===m.selected&&m.layout&&m.dirty){Qe(),m.tab="layout",m.menuOpen=!1,He("");return}if(e!==m.selected&&m.dirty&&!confirm(c("editor.screen_view.confirm.switch")))return;e!==m.selected&&(Us(),m.settingEdits={}),m.selected=e,m.selectedTile=null,m.inspector=null,m.tab="layout",m.menuOpen=!1;const t=m.inventory.screens.find(s=>s.id===e);if(!t){m.layout=null;return}const n=JSON.parse(JSON.stringify(t.layout));Vi(n),n.pages=It(Ze(n),n.pages),m.layout=n,m.insertAt=-1,m.dirty=!1,m.saved=0,Yi(0),zi(n.tiles.map(s=>s.entity)),qi(),He("")}const $m=()=>m.layout?Ze(m.layout):[];function xm(e){const t=m.layout,n=t.tiles.map(i=>`${i.entity}@${i.slot}`).join();for(const{tile:i,slot:l}of e)i.slot=l,t.tiles.includes(i)||t.tiles.push(i);Vi(t),t.pages=It(Ze(t),t.pages);const s=t.tiles.map(i=>`${i.entity}@${i.slot}`).join()!==n;return s&&pt(),s}function Ys(e,t){if(!m.layout)return!1;zi([e.entity]);const n=pu(m.layout.tiles,e,t),s=n?xm(n):!1;return s&&!m.liveStates[e.entity]&&qi(),s}function $u(e){const t=m.layout;if(!t||!Bi(e)&&t.tiles.some(i=>i.entity===e)||t.tiles.length>=Kn.value)return;const n=hu(e),s=m.insertAt>=0?m.insertAt:wi(ts(Ze(t)),ut(n));m.insertAt=-1,s>=0&&Ys(n,s)&&Wo(n)}function xu(e){const t=m.layout;if(!t)return;const n=t.tiles.indexOf(e);n<0||(t.tiles.splice(n,1),Cl(e)&&Qe(),pt(),t.pages=It(Ze(t),t.pages),Ce(c("editor.layout.removed",{name:e.name||zs(e.entity)}),{label:c("editor.common.undo"),run:()=>Ys(e,e.slot)}))}function Qa(){const e=m.layout;e&&(e.pages=Math.min(fn,It(Ze(e),e.pages)+1),pt())}function Sm(e){const t=m.layout;if(t){for(const n of t.tiles)At(n.slot)>e&&(n.slot-=ze);t.pages=Math.max(1,It(Ze(t),t.pages)-1),pt()}}function Cm(e,t){const n=m.layout;if(!n||!Number.isInteger(t)||t<0||t>=fn||t===At(e.slot))return!1;const s=wi(ts(Ze(n).filter(l=>l.tile!==e)),ut(e),t*ze),i=Ys(e,s>=0&&At(s)===t?s:t*ze);return i||Ce(c("editor.layout.no_room",{page:t+1})),i}function Tm(){const e=m.layout;if(!e)return 1;const t=m.drag.preview||Ze(e),n=It(t,e.pages);return m.drag.active&&nh.key!=="none"&&i.controls.includes(h.key))?.key||"none"),pt();const f=m.layout;if(f){if(ru(e)&&r!=="full"){const h=At(e.slot),p=f.tiles.filter(y=>y!==e&&At(y.slot)===h),b=ts(Ze(f).filter(y=>y.tile!==e&&!p.includes(y.tile))),v=[];for(const y of p){const I=wi(b,ut(y),(h+1)*ze);if(I<0){v.length=0;break}v.push([y,I]);for(const T of Bn(I,ut(y)))b.add(T)}if(v.length===p.length){for(const[y,I]of v)y.slot=I;e.slot=h*ze}else{const y=wi(ts(Ze(f).filter(I=>I.tile!==e)),"full");y>=0?e.slot=y:(e.options.size=r,Ce(c("editor.layout.no_free_page")))}}else if(Uo(e)&&!l){const h=ts(Ze(f).filter(v=>v.tile!==e)),p=uu(e.slot),b=Fs(h,p,"wide")?p:fu(h,"wide",p);b>=0&&(e.slot=b)}Vi(f),f.pages=It(Ze(f),f.pages)}}function Em(e,t){const n=`screen.page_${t}`,s=m.layout;return!s||n===e.entity||!us(n)?!1:!Bi(n)&&s.tiles.some(i=>i.entity===n)?(Ce(c("editor.layout.page_taken",{page:t})),!1):(e.entity=n,s.pages=Math.max(It(Ze(s),s.pages),t),pt(),!0)}function Wo(e){Cl(e)||(m.iconPickerOpen=!1,m.actionPickerOpen=!1,m.actionSearch=""),m.selectedTile=e,m.inspector={kind:"tile"},zi([e.entity])}function Qt(e){m.inspector?.kind==="bar"&&m.inspector.index===e||(m.iconPickerOpen=!1),m.selectedTile=null,m.inspector={kind:"bar",index:e}}function er(){m.selectedTile=null,m.inspector={kind:"bar-add"}}function Qe(){m.inspector=null,m.selectedTile=null}async function Bo(){if(m.busy||!m.layout||!m.selected)return;m.busy=!0;const e=Vo,t=m.selected;try{const{settings:n,...s}=m.layout;if(await ft(`screens/${encodeURIComponent(m.selected)}`,"PUT",s),m.selected!==t){const i=m.inventory.screens.find(l=>l.id===t)?.name;Ce(i?c("editor.screen_view.saved.other",{name:i}):c("editor.screen_view.saved.other_unnamed"))}else Vo===e?(m.dirty=!1,m.saved=Date.now(),Ce(c("editor.screen_view.saved.current"))):Ce(c("editor.screen_view.saved.newer_edit"));await Tn()}catch(n){Ce(n.message)}finally{m.busy=!1}}const zn=e=>!!(e&&e.alert_action&&pn(ls(e),m.inventory.alerts?.min_firmware||"0.2.31"));async function Su(e){try{await ft(`screens/${encodeURIComponent(e.id)}/identify`,"POST"),Ce(c("editor.screen_view.identified",{name:e.name}))}catch(t){Ce(t.message)}}async function Am(e,t){return await ft("alerts/test","POST",{screen:e,data:t})}const Pm=["title","tiles","header","pages"];function Cu(e,t){const n=m.layout;if(!n)return;const s=(Array.isArray(e.tiles)?e.tiles:[]).filter(u=>!!(u&&typeof u=="object"&&typeof u.entity=="string"&&u.entity.includes("."))).map(u=>({entity:u.entity,name:typeof u.name=="string"?u.name:"",slot:Number.isInteger(u.slot)?u.slot:-1,...u.options&&typeof u.options=="object"?{options:{...u.options}}:{}})),i=new Set,l=s.filter(u=>Bi(u.entity)||!i.has(u.entity)&&i.add(u.entity)),r=l.slice(0,Kn.value);n.tiles=r,e.header&&Array.isArray(e.header.items)?n.header={items:e.header.items.map(u=>({...u}))}:delete n.header,n.pages=Number.isInteger(e.pages)?e.pages:1,Vi(n),n.pages=It(Ze(n),n.pages),Qe(),pt(),zi(r.map(u=>u.entity)),qi(),Yi(0),Ce(t(r.lengthn.id===e);!t||!m.layout||Cu(JSON.parse(JSON.stringify(t.layout)),n=>n?c("editor.layout.copied_part",{name:t.name,...n}):c("editor.layout.copied",{name:t.name}))}function Im(){const e=m.layout;if(!e)return"";const t={esp_screens_layout:1};for(const n of Pm)e[n]!==void 0&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function Tu(){const e=Im();if(!e)return;const t=`${(yt.value?.name||"screen").toLowerCase().replace(/[^a-z0-9]+/g,"-")}.layout.json`,n=URL.createObjectURL(new Blob([e],{type:"application/json"})),s=document.createElement("a");s.href=n,s.download=t,s.click(),setTimeout(()=>URL.revokeObjectURL(n),5e3),Lt(e,void 0,"layout_json")}function Lm(e){let t;try{t=JSON.parse(e)}catch{Ce(c("editor.layout.not_json"));return}if(!t||typeof t!="object"||!Array.isArray(t.tiles)){Ce(c("editor.layout.no_tiles_in_file"));return}Cu(t,n=>n?c("editor.layout.imported_part",n):c("editor.layout.imported"))}function Mm(e){const t=m.inventory.updates?.target,n=m.inventory.changelog;if(!Array.isArray(n)||!t)return[];const s=ls(e),i=[];for(const l of n)if(!(pn(l.firmware,t)&&l.firmware!==t)&&!(s&&pn(s,l.firmware)))for(const r of l.lines)i.includes(r)||i.push(r);return i}let bo=!1;async function Rm(){if(!bo){bo=!0;try{const e=await Ft("firmware");m.firmwareJob={job:e.job,logs:e.logs||[]}}catch{}finally{bo=!1}}}const Ko=()=>m.inventory.screens.some(e=>e.update?.state==="running")||m.updating.length>0;function Xn(e){const t=e.update||{};if(!(t.state==="running"||m.updating.includes(e.id)))return null;const n=m.firmwareJob?.job?.stage;return t.phase==="verify"?{percent:78,text:_s("verify")}:t.phase==="settle"?{percent:92,text:_s("settle")}:t.phase==="install"||!t.phase?n==="upload"?{percent:66,text:c("editor.update.writing")}:n?{percent:40,text:c("editor.update.building")}:{percent:12,text:_s("install")}:{percent:12,text:_s(t.phase)}}const hn=()=>m.layout?.header?.items??(m.layout?.settings?.show_clock??!0?[{type:"clock"}]:[]),_n=()=>m.inventory.header?.max_items||6;function Ds(e){m.layout&&(m.layout.header={items:e},pt(),Yi())}let tr=0;function Yi(e=150){clearTimeout(tr),tr=window.setTimeout(async()=>{const t=hn();if(t.some(n=>n.type==="entity"))try{const n=await ft("header-preview","POST",{header:{items:t}});t.forEach((s,i)=>m.topbarPreviews[at(s)]=n.items[i])}catch{}},e)}function gs(e){return e.type==="entity"?zs(e.entity):m.inventory.header?.builtin.find(t=>t.type===e.type)?.label||e.type}function vn(e){const t=new Date(m.now);if(e.type==="clock")return{text:Wi(as.value,t,an.value),shown:!0};if(e.type==="date")return{text:xl(t,an.value),shown:!0};if(e.type==="analog")return{analog:!0,shown:!0};const n=m.topbarPreviews[at(e)];return n?{icon:n.i||null,text:n.k==="ago"?um(n.e,Math.floor(m.now/1e3),an.value):n.t,color:n.c?`#${n.c}`:null,shown:n.shown}:{icon:e.icon==="none"?null:qs(e.icon)?.cp||Cn(e.entity),text:"…",shown:!0,loading:!0}}function vo(e,t){const n=[...hn()];return t<0||t>=n.length||e===t?!1:(n.splice(t,0,...n.splice(e,1)),Ds(n),!0)}function nr(e){const t=[...hn()],[n]=t.splice(e,1);n&&(m.inspector?.kind==="bar"&&Qe(),Ds(t),Ce(c("editor.topbar.removed",{name:gs(n)}),{label:c("editor.common.undo"),run:()=>{const s=[...hn()];s.splice(Math.min(e,s.length),0,n),Ds(s)}}))}function go(e){const t=hn();if(t.length>=_n())return Ce(c("editor.topbar.full",_n()));if(t.some(n=>at(n)===at(e)))return Ce(c("editor.topbar.already"));m.topbarAdded={key:at(e),time:Date.now()},Ds([...t,e]),Qt(t.length)}const Nm=[{group:"brightness",icon:"F0599",rows:[{key:"brightness",kind:"number",min:5,max:100,step:5,unit:"%"},{key:"dark_mode",kind:"toggle"},{key:"standby_enabled",kind:"toggle"},{key:"standby_seconds",kind:"duration",min:60,max:86400,needs:"standby_enabled"},{key:"standby_brightness",kind:"number",min:0,max:100,step:5,unit:"%",needs:"standby_enabled",cap:"brightness"}]},{group:"night",icon:"F0594",rows:[{key:"night_enabled",kind:"toggle"},{key:"night_start",kind:"moment",needs:"night_enabled"},{key:"night_end",kind:"moment",needs:"night_enabled"},{key:"night_brightness",kind:"number",min:0,max:100,step:5,unit:"%",needs:"night_enabled",cap:"brightness"}]},{group:"screen",icon:"F0379",rows:[{key:"auto_home",kind:"toggle"},{key:"auto_home_seconds",kind:"duration",min:30,max:3600,needs:"auto_home"},{key:"home_on_standby",kind:"toggle"},{key:"swipe_pages",kind:"toggle"},{key:"page_buttons",kind:"toggle"},{key:"rotation",kind:"choice",options:[0,90,180,270]}]}],_o=e=>c(`editor.screen_settings.rows.${e.key}`),Fm=(e,t)=>`${t}°`;function Eu(e=$m(),t=m.layout?It(e,m.layout.pages):1){const n=xi();if(t<2||n.page_buttons!==!1||n.swipe_pages!==!1)return"";const{tiles:s,targets:i,unreachable:l,noWayBack:r}=em(e,t);if(!l.length&&!r.length)return"";const u=v=>c("editor.screen_settings.reach.pages",{list:Zh(v)},v.length),f=l.filter(v=>!i.includes(v)),h=l.filter(v=>i.includes(v)),p=f.length===1?"one":"more",b=[c("editor.screen_settings.reach.intro")];return s&&f.length?b.push(c(`editor.screen_settings.reach.tiles_missing_${p}`,{targets:u(i),missing:u(f)},s)):s?b.push(c("editor.screen_settings.reach.tiles",{targets:u(i)},s)):f.length?b.push(c(`editor.screen_settings.reach.none_missing_${p}`,{missing:u(f)})):b.push(c("editor.screen_settings.reach.none")),h.length&&b.push(c("editor.screen_settings.reach.cut_off",{pages:u(h)})),r.length&&b.push(c("editor.screen_settings.reach.no_way_back",{pages:u(r)})),b.join(" ")}const Au=4e3;let yn={},ns=null,$i=0,li=null;const Tl=()=>yt.value?.settings;function xi(){const e=Tl(),t={...e?.values||{}};for(const[n,s]of Object.entries(m.settingEdits))t[n]=s.value;return t}const Dm=e=>e<300?30:e<900?60:e<3600?300:e<7200?900:1800;function sr(e,t,n,s,i){if(e.kind==="moment"){let u=s&&t%60?Math.floor(t/60)*60+(n>0?60:0):t+n*(s?60:15);return u%=1440,u<0?u+1440:u}const l=e.kind==="duration"?Dm(n<0?t-1:t):e.step,r=e.cap?Math.min(e.max,i[e.cap]):e.max;return Math.min(r,Math.max(e.min,t+n*l))}function Um(e){if(e<60)return c("editor.screen_settings.duration.seconds",{n:e});if(e<3600)return c("editor.screen_settings.duration.minutes",{n:Math.floor(e/60)});const t=Math.floor(e/3600),n=Math.floor(e%3600/60);return n?c("editor.screen_settings.duration.hours_minutes",{h:t,m:String(n).padStart(2,"0")}):c("editor.screen_settings.duration.hours",{n:t})}function jm(e,t){const n=Math.floor(e/60),s=String(e%60).padStart(2,"0");return t?`${String(n).padStart(2,"0")}:${s}`:c(n<12?"editor.screen_settings.time.am":"editor.screen_settings.time.pm",{time:`${n%12||12}:${s}`})}function Hm(e,t){const n=t[e.key];return n==null?"—":e.kind==="number"?`${n}${e.unit||""}`:e.kind==="duration"?Um(n):e.kind==="moment"?jm(n,as.value):""}function ni(e,t,n){if(ns&&ns!==m.selected&&Object.keys(yn).length){Us(),Ce(c("editor.screen_settings.other_screen_busy"));return}ns=m.selected;const s=xi();if(m.settingEdits[e]={value:t,at:Date.now()},yn[e]=t,e==="brightness")for(const i of["standby_brightness","night_brightness"])s[i]>t&&(m.settingEdits[i]={value:t,at:Date.now()});m.settingPending=!0,clearTimeout($i),$i=window.setTimeout(()=>Us(),n)}async function Us(e=!1){if(clearTimeout($i),li||!Object.keys(yn).length||!ns)return;const t=ns,n=yn;yn={};const s=Sl(`screens/${encodeURIComponent(t)}/settings`,{method:"PUT",body:JSON.stringify({settings:n}),keepalive:e});li=s;try{const i=await(await s).json(),l=m.inventory.screens.find(r=>r.id===t);l&&(l.settings=i)}catch(i){if(Ce(i.message),t===m.selected)for(const l of Object.keys(n))delete m.settingEdits[l];if(t===m.selected&&n.brightness!==void 0)for(const l of["standby_brightness","night_brightness"])delete m.settingEdits[l]}finally{li=null,Object.keys(yn).length?$i=window.setTimeout(()=>Us(),150):ns=null,m.settingPending=!!Object.keys(yn).length,t===m.selected&&Si(),setTimeout(()=>{t===m.selected&&Si()},Au+100)}}function Si(){const e=Tl();for(const[t,n]of Object.entries(m.settingEdits))yn[t]!==void 0||li||(e&&e.values[t]===n.value||Date.now()-n.at>Au)&&delete m.settingEdits[t]}const _s=e=>["install","verify","settle"].includes(e||"")?c(`editor.update.phases.${e}`):c("editor.update.starting");async function zo(e,t){m.updating.push(e.id);try{await ft(`screens/${encodeURIComponent(e.id)}/update`,"POST",t?{host:t}:{}),await Tn()}catch(n){m.updating=m.updating.filter(s=>s!==e.id),Ce(n.message)}}async function ir(){try{await ft("updates/run","POST"),await Tn()}catch(e){Ce(e.message)}}async function Vm(e){try{await ft("updates","PUT",{auto:e}),m.inventory.updates&&(m.inventory.updates.auto=e),Ce(c(e?"editor.settings.updates.auto_on":"editor.settings.updates.auto_off"))}catch(t){Ce(t.message)}}async function Wm(){try{m.inventory.claude_skill=await ft("claude-skill","POST"),Ce(c(m.inventory.claude_skill?.restart?"editor.settings.claude.installed_restart":"editor.settings.claude.installed"))}catch(e){Ce(e.message)}}const an=$(()=>iu(m.inventory.language?.effective));Tt(an,e=>ou(e),{immediate:!0});const jn=(e,t={})=>c(e,t,{locale:an.value}),Bm=e=>m.inventory.language?.languages?.find(t=>t.code===e)?.name||qh(e||"")?.name||e||"",Pu=e=>!!(e.update?.available||e.update?.language),or=()=>c("editor.update.new_language",{name:Bm(m.inventory.language?.effective)}),as=$(()=>m.inventory.language?.clock_effective!=="12"),Km=$(()=>{const e=m.inventory.language;return{...os[e?.numbers_effective||"point"]||os.point,from:(e?.group_min||1)>=2?5:4}}),zm=$(()=>{const e=m.inventory.language;return{...os[e?.numbers_auto||"point"]||os.point,from:(e?.group_min_auto||1)>=2?5:4}});function lr(e){return!e||e==="°"?e||"":e==="%"?m.inventory.language?.percent_space?" %":"%":` ${e}`}const qm=e=>m.inventory.builtin?.find(t=>t.id===e)?.screen_name;async function ar(e){try{const t=await ft("language","PUT",e);return t?.language&&(m.inventory.language=t.language),Ce(c(e.setting===void 0?"editor.settings.language.saved":"editor.settings.language.saved_language")),await Tn(),!0}catch(t){return Ce(t.message),!1}}async function Tn(e=!0){try{const t=await Ft(e?"inventory":"inventory?light=1");m.inventory=e?t:{...m.inventory,...t},t.csrf&&vm(t.csrf),m.connected=!!m.inventory.connected,m.reachable=!0;for(const n of m.inventory.screens)n.update?.state==="running"&&(m.updating=m.updating.filter(s=>s!==n.id));m.selected&&Si()}catch{m.reachable=!1}}function Ym(e){m.inventory={...m.inventory,...e},m.connected=!!m.inventory.connected;for(const t of m.inventory.screens)t.update?.state==="running"&&(m.updating=m.updating.filter(n=>n!==t.id));m.selected&&Si()}let rr=0,qo=Date.now(),Ci=!1,hs=null;function Gm(){hs||typeof EventSource>"u"||(hs=new EventSource(`api/events?language=${encodeURIComponent(kl())}`),hs.onopen=()=>{Ci=!0,js()},hs.onmessage=e=>{document.hidden||Ym(JSON.parse(e.data))},hs.onerror=()=>{Ci=!1,js()})}function js(){clearTimeout(rr);const e=Ci?6e4:m.inventory.updates?.busy?3e3:1e4;rr=window.setTimeout(async()=>{if(!document.hidden){const t=Date.now()-qo>=3e5;t&&(qo=Date.now()),(t||!Ci)&&await Tn(t)}js()},e)}let cr=!1;function Jm(){cr||(cr=!0,Tn(),Gm(),js(),bm(()=>m.fontsVersion++),setInterval(()=>{!m.layout||document.hidden||m.drag.active||(m.now=Date.now(),Yi(0))},3e4),setInterval(()=>{!document.hidden&&m.layout&&m.tab==="layout"&&xt.value===""&&qi()},8e3),setInterval(()=>{!document.hidden&&Ko()?Rm():m.firmwareJob&&!Ko()&&(m.firmwareJob=null)},3e3),document.addEventListener("visibilitychange",async()=>{document.hidden||(qo=Date.now(),m.now=Date.now(),await Tn(),js())}),window.addEventListener("pagehide",()=>Us(!0)),window.addEventListener("beforeunload",e=>{m.dirty&&(e.preventDefault(),e.returnValue="")}))}const Xm={class:"side"},Zm={class:"label"},Qm={id:"screens"},eb=["aria-current","onClick"],tb={class:"txt"},nb=["aria-label","title"],sb={key:1,class:"pill"},ib={key:2,class:"spin small"},ob=["onSubmit"],lb=["placeholder","aria-label"],ab={type:"submit",class:"btn mini primary"},rb=["aria-label"],cb=["disabled","title","onClick"],ub={key:2,class:"whatsnew"},db=["aria-valuenow"],fb={class:"progress-text"},pb=["title"],hb=["title"],mb={id:"pending"},bb={class:"pending-actions"},vb=["onClick"],gb=["aria-current"],_b={class:"txt"},yb={class:"more"},wb={class:"label"},kb=["aria-current"],$b={class:"mdi"},xb={class:"txt"},Sb=["aria-current"],Cb={class:"mdi"},Tb={class:"txt"},Eb=["aria-current"],Ab={class:"mdi"},Pb={class:"txt"},Ob={class:"txt"},Ib=Le({__name:"Sidebar",setup(e){const t=$e(null),n=$e(""),s=p=>{const b=p.update||{};return!!b.language&&(!b.target||pn(ls(p),b.target))};function i(p){const b=p.update||{};return b.state==="running"||m.updating.includes(p.id)?{kind:"running",text:_s(b.phase)}:b.state==="queued"?{kind:"queued",text:c("editor.sidebar.update.queued")}:Pu(p)&&p.online?{kind:"available",text:s(p)?or():c("editor.sidebar.update.available",{version:b.target})}:b.result&&Date.now()/1e3-b.result.time<86400?{kind:b.result.state==="failed"?"failed":"done",text:b.result.message}:null}const l=p=>[...p.update?.language&&!s(p)?[or()]:[],...Mm(p)];function r(p){const b=p.update||{};b.host&&b.profile?zo(p):b.profile&&(t.value=p.id,n.value="")}function u(p){const b=n.value.trim();b&&(t.value=null,zo(p,b))}const f=()=>{const p=m.firmwareJob?.logs||[];return p.length?p[p.length-1]:""},h=p=>p.installed?c("editor.sidebar.pending.installed"):p.downloaded?c("editor.sidebar.pending.downloaded"):c("editor.sidebar.pending.not_flashed",{file:p.file});return(p,b)=>(g(),_("aside",Xm,[b[13]||(b[13]=o("div",{class:"brand"},[o("span",{class:"mark"},"▦"),o("span",null,"ESP Screens")],-1)),o("span",{id:"connection",class:he(["conn",{online:a(m).connected}]),role:"status"},d(a(m).reachable?a(m).connected?a(c)("editor.sidebar.connection.connected"):a(c)("editor.sidebar.connection.reconnecting"):a(c)("editor.sidebar.connection.unreachable")),3),o("button",{type:"button",class:"search-btn",id:"open-palette",onClick:b[0]||(b[0]=v=>a(m).palette=!0)},[Me("⌕ "+d(a(c)("editor.sidebar.search")),1),b[10]||(b[10]=o("kbd",null,"⌘K",-1))]),o("div",Zm,d(a(c)("editor.sidebar.screens")),1),o("div",Qm,[(g(!0),_(q,null,me(a(m).inventory.screens,v=>(g(),_("div",{key:v.id,class:he(["screen-item",{selected:v.id===a(m).selected&&a(xt)===""}])},[o("button",{type:"button",class:"nav-item","aria-current":v.id===a(m).selected&&a(xt)===""?"true":"false",onClick:y=>a(ku)(v.id)},[o("span",{class:he(["dot",{off:!v.online}])},null,2),o("span",tb,[o("span",null,d(v.name),1),o("small",null,d(v.online?a(c)("editor.common.online"):a(c)("editor.common.offline"))+d(v.area?" · "+v.area:"")+" · "+d(v.firmware||a(c)("editor.common.unknown")),1)]),v.id===a(m).selected&&a(m).dirty?(g(),_("span",{key:0,class:"unsaved",role:"img","aria-label":a(c)("editor.common.unsaved"),title:a(c)("editor.common.unsaved")},null,8,nb)):W("",!0),i(v)?.kind==="available"?(g(),_("span",sb,d(a(c)("editor.sidebar.update.pill")),1)):i(v)?.kind==="running"?(g(),_("span",ib)):W("",!0)],8,eb),i(v)?(g(),_("div",{key:0,class:he(["screen-update",i(v).kind])},[i(v).kind==="available"?(g(),_(q,{key:0},[t.value===v.id?(g(),_(q,{key:0},[o("small",null,d(a(c)("editor.sidebar.host.hint")),1),o("form",{class:"screen-host",onSubmit:Ot(y=>u(v),["prevent"])},[Ee(o("input",{"onUpdate:modelValue":b[1]||(b[1]=y=>n.value=y),placeholder:a(c)("editor.sidebar.host.placeholder"),required:"",pattern:"[A-Za-z0-9][A-Za-z0-9.\\-]*","aria-label":a(c)("editor.sidebar.host.label"),autofocus:""},null,8,lb),[[Xe,n.value]]),o("button",ab,d(a(c)("editor.sidebar.host.start")),1),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.cancel"),onClick:b[2]||(b[2]=y=>t.value=null)},"✕",8,rb)],40,ob)],64)):(g(),_(q,{key:1},[o("small",null,d(i(v).text),1),o("button",{type:"button",class:"btn mini primary",disabled:!v.update?.profile,title:v.update?.profile?"":a(c)("editor.sidebar.update.no_profile"),onClick:y=>r(v)},d(a(c)("editor.sidebar.update.button")),9,cb)],64)),l(v).length?(g(),_("details",ub,[o("summary",null,d(a(c)("editor.sidebar.update.whats_new")),1),o("ul",null,[(g(!0),_(q,null,me(l(v).slice(0,8),y=>(g(),_("li",{key:y},d(y),1))),128))])])):W("",!0)],64)):i(v).kind==="running"&&a(Xn)(v)?(g(),_(q,{key:1},[o("div",{class:"progress",role:"progressbar","aria-valuenow":a(Xn)(v).percent,"aria-valuemin":"0","aria-valuemax":"100"},[o("i",{style:Ue({width:a(Xn)(v).percent+"%"})},null,4)],8,db),o("div",fb,[o("span",null,d(a(Xn)(v).percent)+" %",1),o("span",{title:f()},d(a(Xn)(v).text),9,pb)]),f()?(g(),_("small",{key:0,title:f(),style:{"white-space":"nowrap",overflow:"hidden","text-overflow":"ellipsis"}},d(f()),9,hb)):W("",!0),o("button",{type:"button",class:"btn link mini",style:{"justify-self":"start"},onClick:b[3]||(b[3]=y=>a(He)("#firmware"))},d(a(c)("editor.sidebar.update.full_log")),1)],64)):(g(),_("small",{key:2,class:he({failed:i(v).kind==="failed"})},d(i(v).text),3))],2)):W("",!0)],2))),128))]),o("div",mb,[(g(!0),_(q,null,me(a(m).inventory.pending||[],v=>(g(),_("div",{key:v.file,class:"pending"},[o("strong",null,d(v.friendly),1),o("small",null,d(h(v)),1),o("div",bb,[o("button",{type:"button",class:"btn mini quiet",onClick:b[4]||(b[4]=(...y)=>a(ki)&&a(ki)(...y))},d(a(c)("editor.common.open_integrations")),1),v.api_key?(g(),_("button",{key:0,type:"button",class:"btn mini quiet",onClick:y=>a(Lt)(v.api_key)},d(a(c)("editor.sidebar.copy_api_key")),9,vb)):W("",!0)])]))),128))]),o("button",{id:"new-screen",type:"button",class:"nav-item ghost","aria-current":a(xt)==="#new-screen"?"true":"false",onClick:b[5]||(b[5]=v=>a(He)("#new-screen"))},[b[11]||(b[11]=o("span",{class:"plus"},"+",-1)),o("span",_b,d(a(c)("editor.nav.new_screen")),1)],8,gb),b[14]||(b[14]=o("div",{class:"spacer"},null,-1)),o("div",yb,[o("div",wb,d(a(c)("editor.sidebar.more")),1),o("button",{id:"open-firmware",type:"button",class:"nav-item","aria-current":a(xt)==="#firmware"?"true":"false",onClick:b[6]||(b[6]=v=>a(He)("#firmware"))},[o("span",$b,d(a(Ae)("F0241")),1),o("span",xb,d(a(c)("editor.nav.firmware")),1)],8,kb),o("button",{id:"open-alerts",type:"button",class:"nav-item","aria-current":a(xt)==="#alerts"?"true":"false",onClick:b[7]||(b[7]=v=>a(He)("#alerts"))},[o("span",Cb,d(a(Ae)("F0594")),1),o("span",Tb,d(a(c)("editor.nav.alerts")),1)],8,Sb),o("button",{id:"open-settings",type:"button",class:"nav-item","aria-current":a(xt)==="#settings"?"true":"false",onClick:b[8]||(b[8]=v=>a(He)("#settings"))},[o("span",Ab,d(a(Ae)("F0493")),1),o("span",Pb,d(a(c)("editor.nav.settings")),1)],8,Eb),o("button",{id:"refresh",type:"button",class:"nav-item ghost",onClick:b[9]||(b[9]=v=>a(Tn)())},[b[12]||(b[12]=o("span",{class:"plus"},"↻",-1)),o("span",Ob,d(a(c)("editor.sidebar.refresh")),1)])])]))}}),Lb={key:0,id:"toast",class:"toast",role:"status"},Mb=Le({__name:"Toast",setup(e){return(t,n)=>a(m).toast?(g(),_("div",Lb,[o("span",null,d(a(m).toast.message),1),a(m).toast.action?(g(),_("button",{key:0,type:"button",onClick:n[0]||(n[0]=s=>{a(m).toast.action.run(),a(_m)()})},d(a(m).toast.action.label),1)):W("",!0)])):W("",!0)}}),Rb=["aria-label"],Nb=["placeholder","aria-label"],Fb={class:"palette-list"},Db={class:"palette-group"},Ub=["onMouseenter","onClick"],jb={key:0,class:"mdi"},Hb={key:1,class:"glyph"},Vb={class:"tx"},Wb={key:0},Bb={key:2,class:"hint-key"},Kb={key:0,class:"palette-empty"},zb=Le({__name:"CommandPalette",setup(e){const t=$e(""),n=$e(0),s=$e(null),i=$(()=>{const h=t.value.trim().toLocaleLowerCase(),p=[],b=c("editor.palette.groups.screens"),v=c("editor.palette.groups.actions");for(const T of m.inventory.screens)p.push({group:b,label:T.name,detail:`${T.online?c("editor.common.online"):c("editor.common.offline")} · ${T.firmware||c("editor.common.unknown")}`,glyphText:"▦",run:()=>ku(T.id)});const y=yt.value,I=[{group:v,label:c("editor.nav.new_screen"),detail:c("editor.nav.new_screen_detail"),glyphText:"+",run:()=>He("#new-screen")},{group:v,label:c("editor.nav.firmware"),icon:"F0241",run:()=>He("#firmware")},{group:v,label:c("editor.nav.alerts"),detail:c("editor.palette.alerts_detail"),icon:"F0594",run:()=>He("#alerts")},{group:v,label:c("editor.nav.settings"),detail:c("editor.palette.settings_detail"),icon:"F0493",run:()=>He("#settings")}];if(y&&m.layout&&I.unshift({group:v,label:c("editor.common.save_send"),detail:m.dirty?c("editor.common.unsaved"):c("editor.palette.nothing_to_save"),key:"⌘S",run:()=>Bo()},{group:v,label:c("editor.screen_view.tabs.layout"),detail:y.name,run:()=>{He(""),m.tab="layout"}},{group:v,label:c("editor.screen_view.tabs.settings"),detail:y.name,run:()=>{He(""),m.tab="settings"}},{group:v,label:c("editor.palette.identify"),detail:zn(y)?c("editor.palette.identify_detail"):c("editor.palette.identify_needs"),run:()=>{zn(y)&&Su(y)}},{group:v,label:c("editor.palette.export"),detail:c("editor.palette.export_detail"),run:Tu}),p.push(...I),y&&m.layout&&h){const T=new Set(m.layout.tiles.map(A=>A.entity)),k=m.layout.tiles.length>=Kn.value;for(const A of m.inventory.entities)if(!(A.tile===!1||T.has(A.id))&&`${A.name} ${A.id} ${A.area||""} ${A.device||""}`.toLocaleLowerCase().includes(h)&&(p.push({group:c("editor.palette.groups.add"),label:A.name,detail:[Ht(A.id)[0],A.area].filter(Boolean).join(" · "),icon:m.inventory.icons?Cn(A.id):void 0,run:()=>{k||$u(A.id)}}),p.length>60))break}return h?p.filter(T=>`${T.label} ${T.detail||""}`.toLocaleLowerCase().includes(h)):p}),l=$(()=>{const h=[];return i.value.forEach((p,b)=>{(h.find(y=>y.group===p.group)||(h.push({group:p.group,items:[]}),h[h.length-1])).items.push({item:p,index:b})}),h});function r(){m.palette=!1}function u(h){r(),h.run()}function f(h){if(h.key==="Escape")h.preventDefault(),r();else if(h.key==="ArrowDown")h.preventDefault(),n.value=Math.min(i.value.length-1,n.value+1);else if(h.key==="ArrowUp")h.preventDefault(),n.value=Math.max(0,n.value-1);else if(h.key==="Enter"){h.preventDefault();const p=i.value[n.value];p&&u(p)}}return Tt(t,()=>n.value=0),Tt(()=>m.palette,async h=>{h&&(t.value="",n.value=0,await Ni(),s.value?.focus())}),(h,p)=>a(m).palette?(g(),_("div",{key:0,class:"palette-backdrop",onClick:r},[o("div",{class:"palette",role:"dialog","aria-label":a(c)("editor.sidebar.search"),onClick:p[1]||(p[1]=Ot(()=>{},["stop"])),onKeydown:f},[Ee(o("input",{ref_key:"input",ref:s,"onUpdate:modelValue":p[0]||(p[0]=b=>t.value=b),id:"palette-input",placeholder:a(c)("editor.palette.placeholder"),"aria-label":a(c)("editor.sidebar.search"),autocomplete:"off"},null,8,Nb),[[Xe,t.value]]),o("div",Fb,[(g(!0),_(q,null,me(l.value,b=>(g(),_(q,{key:b.group},[o("div",Db,d(b.group),1),(g(!0),_(q,null,me(b.items,({item:v,index:y})=>(g(),_("button",{key:y,type:"button",class:he(["palette-item",{active:y===n.value}]),onMouseenter:I=>n.value=y,onClick:I=>u(v)},[v.icon?(g(),_("span",jb,d(a(Ae)(v.icon)),1)):(g(),_("span",Hb,d(v.glyphText||"›"),1)),o("span",Vb,[o("span",null,d(v.label),1),v.detail?(g(),_("small",Wb,d(v.detail),1)):W("",!0)]),v.key?(g(),_("kbd",Bb,d(v.key),1)):W("",!0)],42,Ub))),128))],64))),128)),i.value.length?W("",!0):(g(),_("p",Kb,d(a(c)("editor.palette.empty")),1))])],40,Rb)])):W("",!0)}}),ve={source:null,element:null,ghost:null,timer:0,start:null,offset:{x:0,y:0},pointerId:null,suppressUntil:0,last:null,scroller:0,target:null},Ou={mounted(e,t){e.__dragSource=t.value,e.addEventListener("pointerdown",s=>{const i=e.__dragSource;if(!(s.button!==0||e.disabled||s.target.closest(".remove"))){s.pointerType!=="touch"&&s.preventDefault(),Object.assign(ve,{source:i,element:e,start:{x:s.clientX,y:s.clientY},pointerId:s.pointerId});try{e.setPointerCapture(s.pointerId)}catch{}clearTimeout(ve.timer),s.pointerType==="touch"&&(ve.timer=window.setTimeout(()=>ur(s),260))}}),e.addEventListener("pointermove",s=>{if(m.drag.active||!ve.start||ve.element!==e)return;const i=Math.hypot(s.clientX-ve.start.x,s.clientY-ve.start.y);if(s.pointerType==="touch"){i>10&&(clearTimeout(ve.timer),ve.start=null);return}i>=6&&ur(s)});const n=()=>{ve.element===e&&!m.drag.active&&(clearTimeout(ve.timer),ve.start=null)};e.addEventListener("pointerup",n),e.addEventListener("pointercancel",n)},updated(e,t){e.__dragSource=t.value}};function ur(e){if(m.drag.active||!ve.start||!ve.source||!ve.element)return;m.drag.active=!0,m.drag.moving=ve.source.kind==="tile"?ve.source.tile:hu(ve.source.id),m.drag.preview=null,ve.target=null,getSelection()?.removeAllRanges();const t=ve.element.getBoundingClientRect(),n=ve.element.cloneNode(!0);n.classList.add("drag-ghost"),n.style.width=`${t.width}px`,n.style.height=`${t.height}px`,ve.offset={x:e.clientX-t.left,y:e.clientY-t.top},document.body.append(n),ve.ghost=n,document.addEventListener("pointermove",Yo),document.addEventListener("pointerup",Ti),document.addEventListener("pointercancel",Ti);try{ve.element.releasePointerCapture(ve.pointerId)}catch{}try{document.documentElement.setPointerCapture(ve.pointerId)}catch{}document.addEventListener("touchmove",Iu,{passive:!1}),ve.scroller=window.setInterval(()=>{if(!ve.last)return;const{x:s,y:i}=qb(document),l=s?pr(ve.last.x,fr(s,"x")):0,r=i?pr(ve.last.y,fr(i,"y")):0;l&&s.scrollBy(l,0),r&&i.scrollBy(0,r),(l||r)&&Go(Lu(ve.last.x,ve.last.y))},16),Go(-1),Yo(e)}function dr(e,t){if(!e)return!1;const n=t==="x"?e.scrollWidth>e.clientWidth:e.scrollHeight>e.clientHeight,s=getComputedStyle(e)[t==="x"?"overflowX":"overflowY"];return n&&(s==="auto"||s==="scroll")}function qb(e){const t=e.querySelector(".pages"),n=e.querySelector(".canvas");return{x:dr(t,"x")?t:n,y:dr(n,"y")?n:e.scrollingElement}}function fr(e,t){const n=t==="x"?window.innerWidth:window.innerHeight;if(e===e.ownerDocument.scrollingElement)return[0,n];const s=e.getBoundingClientRect();return t==="x"?[Math.max(s.left,0),Math.min(s.right,n)]:[Math.max(s.top,0),Math.min(s.bottom,n)]}function pr(e,[t,n]){return en-60?12:0}function Iu(e){m.drag.active&&e.preventDefault()}function Ti(e){e.pointerId===ve.pointerId&&Yb(e.type==="pointerup")}function Yo(e){!ve.ghost||e.pointerId!==ve.pointerId||(ve.last={x:e.clientX,y:e.clientY},ve.ghost.style.transform=`translate(${e.clientX-ve.offset.x}px, ${e.clientY-ve.offset.y}px)`,Go(Lu(e.clientX,e.clientY)))}function Lu(e,t){let n=null,s=1/0;for(const l of document.querySelectorAll(".pages [data-slot]")){const r=l.getBoundingClientRect(),u=Math.hypot(Math.max(r.left-e,0,e-r.right),Math.max(r.top-t,0,t-r.bottom));u16)return-1;let i=Number(n.cell.dataset.slot);return n.cell.classList.contains("wide")&&e>(n.r.left+n.r.right)/2&&(i+=1),i}function Go(e){ve.target===e||!m.layout||!m.drag.moving||(ve.target=e,m.drag.preview=e>=0?pu(m.layout.tiles,m.drag.moving,e):null)}function Yb(e){const t=m.drag.preview,n=m.drag.moving;document.removeEventListener("pointermove",Yo),document.removeEventListener("pointerup",Ti),document.removeEventListener("pointercancel",Ti),document.removeEventListener("touchmove",Iu);try{document.documentElement.releasePointerCapture(ve.pointerId)}catch{}if(ve.ghost?.remove(),Object.assign(ve,{ghost:null,suppressUntil:Date.now()+400,last:null,start:null,target:null,element:null,source:null}),clearInterval(ve.scroller),m.drag.active=!1,m.drag.preview=null,m.drag.moving=null,e&&t&&n&&m.layout){const s=m.layout.tiles.map(l=>`${l.entity}@${l.slot}`).join(),i=!m.layout.tiles.includes(n);for(const{tile:l,slot:r}of t)l.slot=r,m.layout.tiles.includes(l)||m.layout.tiles.push(l);m.layout.tiles.sort((l,r)=>l.slot-r.slot),m.layout.tiles.map(l=>`${l.entity}@${l.slot}`).join()!==s&&pt(),i&&Ys(n,n.slot)}}window.addEventListener("click",e=>{Date.now()t.tile.name||b.value==="screen"&&qm(t.tile.entity)||zs(t.tile.entity)),s=$(()=>ru(t.tile)),i=$(()=>Uo(t.tile)&&!s.value),l=$(()=>us(t.tile.entity)),r=$(()=>m.inventory.backgrounds?.[t.tile.options?.background||""]?.color),u=$(()=>t.tile.options?.background==="none"),f=$(()=>t.tile.options?.display||"standard"),h=$(()=>f.value!=="standard"?bu(f.value):""),p=$(()=>mu(t.tile,m.inventory)),b=$(()=>t.tile.entity.split(".")[0]),v=$(()=>m.inventory.icons?.controls||{}),y=B=>v.value[B]?Ae(v.value[B]):"",I=$(()=>Cl(t.tile)&&m.inspector?.kind==="tile"),T=$(()=>!t.placeholder&&m.layout?.tiles.includes(t.tile)),k=$(()=>c("editor.tile_card.label",{name:n.value,slot:t.slot%ze+1,page:At(t.slot)+1})),A=$(()=>new Date(m.now)),S=$(()=>(A.value.getHours()%12+A.value.getMinutes()/60)*30),U=$(()=>A.value.getMinutes()*6),C=$(()=>b.value==="screen"?null:km(t.tile.entity)),K=$(()=>!C.value||["unavailable","unknown",""].includes(C.value.state)),O=$(()=>!!C.value&&!K.value&&C.value.state!=="off"&&C.value.state!=="closed"&&C.value.state!=="standby"&&C.value.state!=="idle"&&C.value.state!=="docked"),E=$(()=>["light","switch","input_boolean","fan"].includes(b.value)&&C.value?.state==="on"),R=$(()=>C.value?.a?.unit_of_measurement),L=B=>B.charAt(0).toUpperCase()+B.slice(1).replace(/_/g," "),D=B=>lu(B,Km.value),M=["number","input_number","counter"],Y=B=>R.value||M.includes(b.value)?`${D(B)}${lr(R.value)}`:B,te={climate:"climate",cover:"cover",media_player:"media",person:"person",sun:"sun",vacuum:"vacuum",weather:"weather"};function ye(B){const ne=wt=>zh(`screen.ha.${wt}`)?jn(`screen.ha.${wt}`):"",ie=B.state==="windy-variant"?"windy":B.state.replace(/-/g,"_");return b.value==="binary_sensor"&&["on","off"].includes(ie)?ne(`binary.${B.a?.device_class}_${ie}`)||ne(ie):te[b.value]?ne(`${te[b.value]}.${ie}`)||(["on","off"].includes(ie)?ne(ie):""):["on","off"].includes(ie)?ne(ie):""}const re=["scene","script","button","input_button"],be=$(()=>{const B=C.value;if(!B||re.includes(b.value))return h.value;if(K.value)return jn(B.state==="unknown"?"editor.mockup.unknown":"screen.ha.unavailable");const ne=B.a||{},ie=B.word||ye(B)||L(B.state);return b.value==="climate"?`${ne.current_temperature!==void 0?`${D(ne.current_temperature)}° · `:""}${ie}`:b.value==="weather"?`${ie}${ne.temperature!==void 0?` · ${D(ne.temperature)}°`:""}`:b.value==="cover"&&ne.current_position!==void 0&&ne.current_position>0&&ne.current_position<100?`${ie} · ${ne.current_position}${lr("%")}`:b.value==="media_player"&&ne.media_title?`${ie} · ${ne.media_title}`:b.value==="sensor"||M.includes(b.value)?Y(B.state):ie}),ge=$(()=>C.value&&!K.value?R.value||M.includes(b.value)?D(C.value.state):C.value.state:"—"),we=$(()=>{const B=C.value;if(!B||K.value)return 0;const ne=B.a||{};if(b.value==="light")return B.state==="on"?ne.brightness!==void 0?Math.round(ne.brightness/255*100):100:0;if(b.value==="fan")return B.state==="on"?ne.percentage??100:0;if(b.value==="cover")return 100-(ne.current_position??(B.state==="open"?100:0));if(b.value==="media_player")return Math.round((ne.volume_level??0)*100);if(b.value==="number"||b.value==="input_number"){const ie=Number(B.state),wt=Number(ne.min??0),Ln=Number(ne.max??100);return Number.isFinite(ie)&&Ln>wt?Math.round((ie-wt)/(Ln-wt)*100):0}return 0}),Ge=$(()=>jn(`screen.ha.button.${{scene:"activate",script:"run"}[b.value]||"press"}`)),qe=$(()=>`${jn("screen.tile.page",{n:l.value})} ›`),le=$(()=>({background:`linear-gradient(to right, ${we.value?"#ffbf38":"#c9ccd1"} ${we.value}%, ${we.value?"#fff1d3":"#e6e8ec"} ${we.value}%)`})),Z=$(()=>({background:`linear-gradient(to right, #2196f3 ${we.value}%, #d3e8fb ${we.value}%)`})),ue=$(()=>{const B=C.value?.a?.temperature;return B!=null?`${D(B)}°`:"—"});async function ke(B){if(B.key==="Enter"||B.key===" "){B.preventDefault(),Wo(t.tile);return}const ne={ArrowLeft:-1,ArrowRight:1,ArrowUp:-2,ArrowDown:2}[B.key];ne&&(B.preventDefault(),Ys(t.tile,t.tile.slot+(s.value?Math.sign(ne)*ze:i.value?Math.sign(ne)*2:ne))&&(await Ni(),document.querySelector(`.pages [data-slot="${t.tile.slot}"]`)?.focus()))}return(B,ne)=>Ee((g(),_("div",{class:he(["tile",{wide:i.value,full:s.value,bare:u.value,placeholder:e.placeholder||!T.value,chosen:I.value}]),"data-slot":e.slot,style:Ue(r.value&&!u.value?{backgroundColor:r.value}:void 0),tabindex:T.value?0:-1,role:T.value?"button":void 0,"aria-label":T.value?k.value:void 0,onClick:ne[1]||(ne[1]=ie=>T.value&&a(Wo)(e.tile)),onKeydown:ne[2]||(ne[2]=ie=>T.value&&ke(ie))},[f.value==="analog"?(g(),_(q,{key:0},[(g(),_("svg",Jb,[ne[3]||(ne[3]=o("circle",{cx:"30",cy:"30",r:"27",fill:"#fff",stroke:"#c9ccd1"},null,-1)),(g(),_(q,null,me([0,90,180,270],ie=>o("line",{key:ie,x1:"30",y1:"5",x2:"30",y2:"9",stroke:"#1b1b1b","stroke-width":"1.5",transform:`rotate(${ie} 30 30)`},null,8,Xb)),64)),o("line",{x1:"30",y1:"30",x2:"30",y2:"16",stroke:"#1b1b1b","stroke-width":"2.4","stroke-linecap":"round",transform:`rotate(${S.value} 30 30)`},null,8,Zb),o("line",{x1:"30",y1:"30",x2:"30",y2:"11",stroke:"#1b1b1b","stroke-width":"1.6","stroke-linecap":"round",transform:`rotate(${U.value} 30 30)`},null,8,Qb),ne[4]||(ne[4]=o("circle",{cx:"30",cy:"30",r:"1.8",fill:"#1b1b1b"},null,-1))])),i.value?(g(),_("span",ev,[o("span",tv,[o("span",nv,d(n.value),1),o("span",sv,d(h.value),1)])])):W("",!0)],64)):f.value==="digital"&&b.value==="screen"?(g(),_(q,{key:1},[o("span",iv,d(a(Ae)(a(vs)(e.tile))),1),o("span",ov,[o("span",lv,d(a(Wi)(a(as),A.value)),1),o("span",av,d(n.value),1)])],64)):s.value?(g(),_(q,{key:2},[o("span",{class:he(["ic mdi",{lit:E.value,thumb:f.value==="live"||f.value==="cover"}])},d(a(Ae)(a(vs)(e.tile))),3),o("span",rv,[o("span",cv,d(n.value),1),l.value?(g(),_("span",uv,d(qe.value),1)):f.value==="watch"?(g(),_("span",dv,[Me(d(ge.value),1),R.value&&!K.value?(g(),_("small",fv,d(R.value),1)):W("",!0)])):be.value?(g(),_("span",{key:2,class:he(["st",{off:K.value}])},d(be.value),3)):W("",!0)]),e.tile.options?.inline==="slider"?(g(),_("span",{key:0,class:"mini-slider",style:Ue(le.value)},null,4)):W("",!0),p.value?(g(),_("span",pv,[p.value==="toggle"?(g(),_("span",{key:0,class:he(["tog",{off:!O.value}])},null,2)):p.value==="setpoint"?(g(),_("span",hv,[o("span",mv,d(y("minus")||"−"),1),o("b",null,d(ue.value),1),o("span",bv,d(y("plus")||"+"),1)])):p.value==="volume"?(g(),_(q,{key:2},[o("span",{class:"range",style:Ue(Z.value)},null,4),o("span",vv,d(y("volume-high")),1)],64)):p.value==="playback"?(g(),_(q,{key:3},[o("span",gv,d(y("skip-previous")),1),o("span",_v,d(y(O.value?"pause":"play")||y("play")),1),o("span",yv,d(y("skip-next")),1)],64)):p.value==="buttons"&&b.value==="cover"?(g(),_(q,{key:4},[o("span",wv,d(y("arrow-expand-horizontal")),1),o("span",kv,d(y("stop")),1),o("span",$v,d(y("arrow-collapse-horizontal")),1)],64)):p.value==="run"?(g(),_("span",xv,d(Ge.value),1)):(g(),_("span",{key:6,class:"range",style:Ue({background:`linear-gradient(to right, #2196f3 ${we.value}%, #d3e8fb ${we.value}%)`})},null,4))])):W("",!0)],64)):i.value?(g(),_(q,{key:3},[o("span",Sv,[o("span",{class:he(["ic mdi",{lit:E.value,thumb:f.value==="live"||f.value==="cover"}])},d(a(Ae)(a(vs)(e.tile))),3),o("span",Cv,[o("span",Tv,d(n.value),1),l.value?(g(),_("span",Ev,d(qe.value),1)):f.value==="watch"?(g(),_("span",Av,[Me(d(ge.value),1),R.value&&!K.value?(g(),_("small",Pv,d(R.value),1)):W("",!0)])):be.value?(g(),_("span",{key:2,class:he(["st",{off:K.value}])},d(be.value),3)):W("",!0)])]),e.tile.options?.inline==="slider"?(g(),_("span",{key:0,class:"mini-slider",style:Ue(le.value)},null,4)):W("",!0),p.value?(g(),_("span",Ov,[p.value==="toggle"?(g(),_("span",{key:0,class:he(["tog",{off:!O.value}])},null,2)):p.value==="setpoint"?(g(),_("span",Iv,[o("span",Lv,d(y("minus")||"−"),1),o("b",null,d(ue.value),1),o("span",Mv,d(y("plus")||"+"),1)])):p.value==="stepper"&&b.value.endsWith("select")?(g(),_(q,{key:2},[o("span",Rv,d(y("chevron-left")),1),o("span",Nv,d(y("chevron-right")),1)],64)):p.value==="stepper"?(g(),_("span",Fv,[o("span",Dv,d(y("minus")||"−"),1),o("b",null,d(ge.value),1),o("span",Uv,d(y("plus")||"+"),1)])):p.value==="mode"?(g(),_(q,{key:4},[o("span",jv,d(y("power")),1),o("span",Hv,d(y("fire")),1),o("span",Vv,d(y("snowflake")),1)],64)):p.value==="volume"?(g(),_(q,{key:5},[o("span",{class:"range",style:Ue(Z.value)},null,4),o("span",Wv,d(y("volume-high")),1)],64)):p.value==="playback"?(g(),_(q,{key:6},[o("span",Bv,d(y("skip-previous")),1),o("span",Kv,d(y(O.value?"pause":"play")||y("play")),1),o("span",zv,d(y("skip-next")),1)],64)):p.value==="buttons"&&b.value==="cover"?(g(),_(q,{key:7},[o("span",qv,d(y("arrow-expand-horizontal")),1),o("span",Yv,d(y("stop")),1),o("span",Gv,d(y("arrow-collapse-horizontal")),1)],64)):p.value==="buttons"&&b.value==="vacuum"?(g(),_(q,{key:8},[o("span",Jv,d(y("play")),1),o("span",Xv,d(y("stop")),1),o("span",Zv,d(y("home-map-marker")),1)],64)):p.value==="buttons"&&b.value==="timer"?(g(),_(q,{key:9},[o("span",Qv,d(y("play")),1),o("span",eg,d(y("close")),1)],64)):p.value==="run"?(g(),_("span",tg,d(Ge.value),1)):(g(),_("span",{key:11,class:"range",style:Ue({background:`linear-gradient(to right, #2196f3 ${we.value}%, #d3e8fb ${we.value}%)`})},null,4))])):W("",!0)],64)):(g(),_(q,{key:4},[o("span",{class:he(["head",{top:f.value==="watch"}])},[o("span",{class:he(["ic mdi",{lit:E.value,thumb:f.value==="live"||f.value==="cover"}])},d(a(Ae)(a(vs)(e.tile))),3),o("span",ng,[o("span",sg,d(n.value),1),l.value?(g(),_("span",ig,d(qe.value),1)):f.value!=="watch"&&be.value?(g(),_("span",{key:1,class:he(["st",{off:K.value}])},d(be.value),3)):W("",!0)])],2),f.value==="watch"?(g(),_("span",og,[Me(d(ge.value),1),R.value&&!K.value?(g(),_("small",lg,d(R.value),1)):W("",!0)])):W("",!0),e.tile.options?.inline==="slider"?(g(),_("span",{key:1,class:"mini-slider",style:Ue(le.value)},null,4)):W("",!0)],64)),T.value?(g(),_("button",{key:5,type:"button",class:"remove",title:a(c)("editor.tile_card.remove"),"aria-label":a(c)("editor.tile_card.remove_named",{name:n.value}),onClick:ne[0]||(ne[0]=Ot(ie=>a(xu)(e.tile),["stop"]))},"✕",8,ag)):W("",!0)],46,Gb)),[[a(Ou),{kind:"tile",tile:e.tile}]])}}),cg=["viewBox","aria-label"],ug=["y"],dg=["cx","cy","r","stroke","stroke-width"],fg=["x1","y1","x2","y2","stroke","stroke-width"],pg=["x","y","fill"],hg=["x","y"],Mu=Le({__name:"TopbarSvg",props:{items:{},nameText:{},single:{type:Boolean}},setup(e,{expose:t}){const n=e,s=$(()=>{m.fontsVersion,m.now,m.topbarPreviews;const k=n.items||hn();return gu(k,wu.value,n.nameText??(m.layout?.title||jn("editor.mockup.home")),vn)}),i=$(()=>s.value.metrics),l=$(()=>n.single?Math.round(i.value.text*1.4):i.value.top+Math.round(i.value.name*.45)),r=$(()=>n.single?Math.round(i.value.text*1.05):i.value.top),u=$(()=>{if(!n.single)return s.value.placed;const k=s.value.parts[0];return k&&(k.x=0),k?[k]:[]}),f=$(()=>n.single?`-2 0 ${Math.max(1,u.value[0]?.width||1)+4} ${l.value}`:`0 0 ${i.value.width} ${l.value}`),h=$(()=>r.value+(s.value.zero.top+s.value.zero.bottom)/2),p=$(()=>mm(s.value.nameText,s.value.fonts.name,Math.min(s.value.natural,s.value.nameRoom))),b=$(()=>new Date(m.now));function v(k){const A=b.value;return[[(A.getHours()%12+A.getMinutes()/60)*30,k*.24],[A.getMinutes()*6,k*.34]].map(([S,U])=>{const C=S*Math.PI/180;return{x2:U*Math.sin(C),y2:-U*Math.cos(C)}})}const y=k=>k.x-k.icon.ink.left,I=k=>(k.icon?k.x+(k.icon.ink.right-k.icon.ink.left)+s.value.gaps.icon:k.x)-k.text.ink.left,T=$(()=>`${(Math.max(1,u.value[0]?.width||1)+4)*(26/i.value.icon)}px`);return t({lay:s}),(k,A)=>(g(),_("svg",{viewBox:f.value,role:"img","aria-label":e.single?a(c)("editor.topbar.live.looks"):a(c)("editor.topbar.aria",{name:s.value.nameText}),style:Ue(e.single?{width:T.value}:void 0)},[e.single?W("",!0):(g(),_("text",{key:0,x:"0",y:i.value.top,fill:"#1b1b1b",style:Ue({font:s.value.fonts.name})},d(p.value),13,ug)),o("g",null,[(g(!0),_(q,null,me(u.value,S=>(g(),_(q,{key:S.index},[S.dial?(g(),_(q,{key:0},[o("circle",{cx:S.x+S.dial/2,cy:h.value,r:S.dial/2-Math.max(1,Math.round(S.dial/10))/2,fill:"none",stroke:S.view.color||"#46525e","stroke-width":Math.max(1,Math.round(S.dial/10))},null,8,dg),(g(!0),_(q,null,me(v(S.dial),(U,C)=>(g(),_("line",{key:C,x1:S.x+S.dial/2,y1:h.value,x2:S.x+S.dial/2+U.x2,y2:h.value+U.y2,stroke:S.view.color||"#46525e","stroke-width":Math.max(1,Math.round(S.dial*.075)),"stroke-linecap":"round"},null,8,fg))),128))],64)):(g(),_(q,{key:1},[S.icon?(g(),_("text",{key:0,x:y(S),y:h.value-(S.icon.ink.top+S.icon.ink.bottom)/2,fill:S.view.color||"#46525e",style:Ue({font:s.value.fonts.icon})},d(S.icon.glyph),13,pg)):W("",!0),S.text?(g(),_("text",{key:1,x:I(S),y:r.value,fill:"#46525e",style:Ue({font:s.value.fonts.text})},d(S.text.value),13,hg)):W("",!0)],64))],64))),128))])],12,cg))}}),mg={class:"page"},bg={class:"page-label"},vg=["title"],gg={key:1},_g=["title"],yg={class:"tiles"},wg=["data-slot","title","aria-label","onClick"],kg=Le({__name:"DevicePage",props:{page:{},entries:{},pages:{},moving:{}},setup(e){const t=e,n=$(()=>new Map(t.entries.map(h=>[h.slot,h]))),s=$(()=>new Set(t.entries.flatMap(h=>Bn(h.slot,ut(h.tile)).slice(1)))),i=$(()=>Array.from({length:ze},(h,p)=>t.page*ze+p).filter(h=>!s.value.has(h))),l=$(()=>t.pages>1&&!t.entries.some(h=>At(h.slot)===t.page)),r=$(()=>m.inspector?.kind==="bar"||m.inspector?.kind==="bar-add"),u=$(()=>t.entries.filter(h=>At(h.slot)===t.page).reduce((h,p)=>h+$l(ut(p.tile)),0));function f(h){const p=m.insertAt===h;m.insertAt=p?-1:h,m.insertAt>=0&&document.querySelector("#search")?.focus()}return(h,p)=>(g(),_("div",mg,[o("div",bg,[o("span",null,d(a(c)("editor.page.label",{page:e.page+1})),1),l.value?(g(),_("button",{key:0,type:"button",class:"btn mini",title:a(c)("editor.page.remove_title"),onClick:p[0]||(p[0]=b=>a(Sm)(e.page))},d(a(c)("editor.page.remove")),9,vg)):(g(),_("span",gg,d(u.value)+" / "+d(a(ze)),1))]),o("div",{class:he(["device",{cyd:!a(Ki)}])},[o("div",{class:he(["bar-wrap",{selected:r.value}]),title:a(c)("editor.page.edit_bar"),role:"button",tabindex:"0",onClick:p[1]||(p[1]=b=>a(Qt)(0)),onKeydown:p[2]||(p[2]=xc(Ot(b=>a(Qt)(0),["prevent"]),["enter"]))},[se(Mu)],42,_g),o("div",yg,[(g(!0),_(q,null,me(i.value,b=>(g(),_(q,{key:b},[n.value.get(b)?(g(),it(rg,{key:0,tile:n.value.get(b).tile,slot:b,placeholder:n.value.get(b).tile===e.moving},null,8,["tile","slot","placeholder"])):(g(),_("button",{key:1,type:"button",class:he(["cell",{"insert-here":a(m).insertAt===b}]),"data-slot":b,title:a(c)("editor.page.cell.title"),"aria-label":a(c)("editor.page.cell.aria",{slot:b%a(ze)+1,page:e.page+1}),onClick:v=>f(b)},[p[3]||(p[3]=o("span",null,"+",-1)),o("small",null,d(a(m).insertAt===b?a(c)("editor.page.cell.next"):a(c)("editor.page.cell.empty")),1)],10,wg))],64))),128))])],2)]))}}),$g={class:"library",id:"library"},xg={class:"lib-head"},Sg={class:"lib-title"},Cg=["placeholder","aria-label"],Tg={class:"filters",id:"filters"},Eg=["aria-pressed","onClick"],Ag={class:"lib-row"},Pg=["aria-label"],Og={value:""},Ig=["value"],Lg=["aria-pressed","title"],Mg={class:"lib-list",id:"results","aria-live":"polite"},Rg=["title","disabled","onClick"],Ng={class:"tx"},Fg={key:0,class:"hint"},Dg={key:1,class:"hint"},Ug={class:"lib-foot"},jg=Le({__name:"Library",setup(e){const t=["","light","climate","switch","binary_sensor","button","script","fan","cover","scene","vacuum","sensor","media_player","weather","number","select","person","timer","screen"],n={switch:"input_boolean",number:"input_number",select:"input_select",weather:"sun",button:"input_button"},s=$(()=>new Set(m.layout?.tiles.map(p=>p.entity)||[])),i=p=>s.value.has(p)&&!Bi(p),l=$(()=>[...new Set(m.inventory.entities.map(p=>p.area).filter(p=>!!p))].sort((p,b)=>p.localeCompare(b))),r=$(()=>{const p=m.search.toLocaleLowerCase(),b=m.filter,v=m.room;return[...m.inventory.builtin||[],...m.inventory.entities].filter(y=>y.tile!==!1&&(Ki.value||!["camera","image"].includes(y.id.split(".")[0]))&&(!b||y.id.startsWith(b+".")||n[b]===y.id.split(".")[0])&&(!v||y.area===v)&&(!m.hidePlaced||!i(y.id))&&`${y.name} ${y.id} ${y.device||""} ${y.area||""}`.toLocaleLowerCase().includes(p))}),u=$(()=>(m.layout?.tiles.length||0)>=Kn.value),f=$(()=>m.inventory.entities.length),h=p=>{const b=p.id.split(".")[0];return p.state==="unavailable"||p.state==="unknown"?"gone":["light","switch","input_boolean","fan"].includes(b)&&p.state==="on"?"on":""};return(p,b)=>(g(),_("aside",$g,[o("div",xg,[o("div",Sg,[Me(d(a(c)("editor.library.title"))+" ",1),o("small",null,d(a(c)("editor.library.entities",f.value)),1)]),Ee(o("input",{id:"search","onUpdate:modelValue":b[0]||(b[0]=v=>a(m).search=v),type:"search",placeholder:a(c)("editor.library.search"),autocomplete:"off","aria-label":a(c)("editor.library.search_label")},null,8,Cg),[[Xe,a(m).search]]),o("div",Tg,[(g(),_(q,null,me(t,v=>o("button",{key:v,type:"button","aria-pressed":a(m).filter===v?"true":"false",onClick:y=>a(m).filter=v},[v?(g(),_("span",{key:0,class:"domain-icon",style:Ue({color:a(Ht)(v+".")[2],background:a(Ht)(v+".")[3]}),"aria-hidden":"true"},d(a(Ht)(v+".")[1]),5)):W("",!0),Me(d(a(c)(`editor.library.filters.${v||"all"}`)),1)],8,Eg)),64))]),o("div",Ag,[Ee(o("select",{id:"room","onUpdate:modelValue":b[1]||(b[1]=v=>a(m).room=v),"aria-label":a(c)("editor.library.room")},[o("option",Og,d(a(c)("editor.library.all_rooms")),1),(g(!0),_(q,null,me(l.value,v=>(g(),_("option",{key:v,value:v},d(v),9,Ig))),128))],8,Pg),[[Wn,a(m).room]]),o("button",{type:"button",class:"chip-toggle",id:"hide-placed","aria-pressed":a(m).hidePlaced?"true":"false",title:a(c)("editor.library.hide_placed_title"),onClick:b[2]||(b[2]=v=>a(m).hidePlaced=!a(m).hidePlaced)},d(a(c)("editor.library.hide_placed")),9,Lg)])]),o("div",Mg,[(g(!0),_(q,null,me(r.value.slice(0,80),v=>Ee((g(),_("button",{key:v.id,type:"button",class:"ent",title:v.id,disabled:i(v.id)||u.value,onClick:y=>a($u)(v.id)},[o("span",{class:he(["av mdi",h(v)]),style:Ue({color:a(Ht)(v.id)[2],background:a(Ht)(v.id)[3]})},d(a(m).inventory.icons?a(Ae)(a(Cn)(v.id)):a(Ht)(v.id)[1]),7),o("span",Ng,[o("b",null,d(v.name),1),o("small",null,d([a(Ht)(v.id)[0],v.area,v.device].filter(Boolean).join(" · ")),1)]),o("span",{class:he(["add",{done:i(v.id)}])},d(i(v.id)?"✓":"+"),3)],8,Rg)),[[a(Ou),{kind:"entity",id:v.id}]])),128)),r.value.length?r.value.length>80?(g(),_("p",Dg,d(a(c)("editor.common.results",r.value.length)),1)):W("",!0):(g(),_("p",Fg,d(a(m).hidePlaced&&!a(m).search&&!a(m).filter&&!a(m).room?a(c)("editor.library.all_placed"):a(c)("editor.library.none_found")),1))]),o("div",Ug,d(u.value?a(c)(a(Kn)<48?"editor.library.full_update":"editor.library.full",a(Kn)):a(c)("editor.library.hint")),1)]))}}),Hg={class:"canvas-head"},Vg={id:"count"},Wg={key:0,id:"no-tiles"},Bg={key:1},Kg={key:2,id:"positions-hint",class:"warn"},zg={key:3,id:"page-reach-hint",class:"warn"},qg=["aria-label"],Yg={class:"page-label"},Gg=["tabindex"],Jg=Le({__name:"LayoutView",setup(e){const t=$(()=>m.layout),n=$(()=>m.drag.preview||Ze(t.value)),s=$(()=>It(n.value,t.value.pages)),i=$(()=>Tm()),l=$(()=>s.valueQh(t.value.tiles)&&!$t(0,2,26)?c("editor.layout.positions_hint",{firmware:yt.value?.firmware||c("editor.common.unknown")}):""),u=$(()=>Eu(n.value,s.value));function f(h){h.target.closest(".device, .page-label, .canvas-head")||m.inspector&&Qe()}return(h,p)=>(g(),_(q,null,[o("div",{class:"canvas",id:"canvas",onClick:f},[o("div",Hg,[o("b",Vg,d(a(c)("editor.layout.count",{tiles:t.value.tiles.length,limit:a(Kn)},s.value)),1),t.value.tiles.length?(g(),_("span",Bg,d(a(c)("editor.layout.how_to")),1)):(g(),_("span",Wg,d(a(c)("editor.layout.no_tiles")),1)),r.value?(g(),_("span",Kg,d(r.value),1)):W("",!0),u.value?(g(),_("span",zg,d(u.value),1)):W("",!0)]),o("div",{class:"pages",id:"layout-preview","aria-label":a(c)("editor.layout.aria")},[(g(!0),_(q,null,me(i.value,b=>(g(),it(kg,{key:b,page:b-1,entries:n.value,pages:s.value,moving:a(m).drag.moving},null,8,["page","entries","pages","moving"]))),128)),o("div",{class:he(["page ghost",{disabled:!l.value}])},[o("div",Yg,[o("span",null,d(a(c)("editor.page.label",{page:i.value+1})),1)]),o("div",{class:he(["device",{cyd:a(yt)?.board!=="guition"}]),id:"add-page",role:"button",tabindex:l.value?0:-1,onClick:p[0]||(p[0]=b=>l.value&&a(Qa)()),onKeydown:p[1]||(p[1]=xc(Ot(b=>l.value&&a(Qa)(),["prevent"]),["enter"]))},d(l.value?a(c)("editor.layout.add_page"):a(c)("editor.layout.max_pages",a(fn))),43,Gg)],2)],8,qg)]),se(jg)],64))}}),Xg={class:"status",id:"settings-status",role:"status"},Zg={key:0,class:"set-grid",id:"settings-groups"},Qg={class:"mdi"},e_=["data-setting","title","onClick"],t_=["id"],n_={class:"s-control"},s_=["id","aria-checked","aria-labelledby","disabled","onClick"],i_=["aria-labelledby"],o_=["aria-pressed","disabled","onClick"],l_={key:2,class:"step"},a_=["aria-label","disabled","onPointerdown","onClick"],r_={class:"mdi"},c_=["id","aria-labelledby"],u_=["aria-label","disabled","onPointerdown","onClick"],d_={class:"mdi"},f_={key:0,class:"hint warn",id:"settings-page-reach"},p_=Le({__name:"SettingsTab",setup(e){const t=$(()=>Tl()),n=$(()=>xi()),s=$(()=>t.value?.owner==="screen"&&!yt.value?.online),i=$(()=>Nm.map(T=>({...T,rows:T.rows.filter(k=>t.value?.keys.includes(k.key))})).filter(T=>T.rows.length)),l=$(()=>Eu()),r=T=>s.value||!!t.value?.unavailable.includes(T.key),u=T=>T.needs?!!n.value[T.needs]:!0,f=$(()=>s.value?c("editor.screen_settings.status.offline"):m.settingPending?c("editor.common.saving"):t.value?.owner==="screen"?c("editor.screen_settings.status.screen"):c("editor.screen_settings.status.app")),h=(T,k)=>{const A=n.value[T.key];return r(T)||!u(T)||A===null||A===void 0?!0:T.kind!=="moment"&&sr(T,A,k,!1,n.value)===A},p=new WeakMap;function b(T,k,A){const S=xi(),U=sr(T,S[T.key],k,A,S);U!==S[T.key]&&ni(T.key,U,600)}function v(T,k,A){const S=T.currentTarget;if(S.disabled||T.button!==0)return;const U={timer:0,held:!1};p.set(S,U);let C=0;U.timer=window.setTimeout(function K(){U.held=!0,C+=1,b(k,A,C>5),U.timer=window.setTimeout(K,180)},450)}function y(T){const k=p.get(T.currentTarget);k&&clearTimeout(k.timer)}function I(T,k,A){const S=p.get(T.currentTarget);if(S?.held){S.held=!1;return}b(k,A,!1)}return(T,k)=>(g(),_("div",{class:he(["settings",{offline:s.value}]),id:"general-settings"},[o("span",Xg,d(f.value),1),t.value?(g(),_("div",Zg,[(g(!0),_(q,null,me(i.value,A=>(g(),_("section",{key:A.group,class:"set-card"},[o("h4",null,[o("span",Qg,d(a(Ae)(A.icon)),1),Me(d(a(c)(`editor.screen_settings.groups.${A.group}`)),1)]),(g(!0),_(q,null,me(A.rows,S=>(g(),_("div",{key:S.key,class:he(["srow",[`setting-${S.kind}`,{inactive:!u(S)||r(S)}]]),"data-setting":S.key,title:r(S)&&!s.value?a(c)("editor.screen_settings.unavailable"):"",onClick:U=>S.kind==="toggle"&&U.target.closest(".srow")===U.currentTarget&&!U.target.closest("button")&&!r(S)&&a(ni)(S.key,!n.value[S.key],150)},[o("span",{class:"s-label",id:`setting-label-${S.key}`},d(a(_o)(S)),9,t_),o("div",n_,[S.kind==="toggle"?(g(),_("button",{key:0,type:"button",class:he(["switch",{unknown:n.value[S.key]===null||n.value[S.key]===void 0}]),role:"switch",id:`setting-${S.key}`,"aria-checked":n.value[S.key]?"true":"false","aria-labelledby":`setting-label-${S.key}`,disabled:r(S),onClick:Ot(U=>a(ni)(S.key,!n.value[S.key],150),["stop"])},null,10,s_)):S.kind==="choice"?(g(),_("div",{key:1,class:"seg",role:"group","aria-labelledby":`setting-label-${S.key}`},[(g(!0),_(q,null,me(S.options,U=>(g(),_("button",{key:String(U),type:"button","aria-pressed":n.value[S.key]===U?"true":"false",disabled:r(S),onClick:C=>a(ni)(S.key,U,150)},d(a(Fm)(S,U)),9,o_))),128))],8,i_)):(g(),_("div",l_,[o("button",{type:"button","aria-label":a(c)("editor.screen_settings.lower",{name:a(_o)(S)}),disabled:h(S,-1),onPointerdown:U=>v(U,S,-1),onPointerup:y,onPointercancel:y,onPointerleave:y,onClick:U=>I(U,S,-1)},[o("span",r_,d(a(Ae)("F0374")),1)],40,a_),o("output",{id:`setting-${S.key}`,"aria-labelledby":`setting-label-${S.key}`},d(a(Hm)(S,n.value)),9,c_),o("button",{type:"button","aria-label":a(c)("editor.screen_settings.higher",{name:a(_o)(S)}),disabled:h(S,1),onPointerdown:U=>v(U,S,1),onPointerup:y,onPointercancel:y,onPointerleave:y,onClick:U=>I(U,S,1)},[o("span",d_,d(a(Ae)("F0415")),1)],40,u_)]))])],10,e_))),128)),l.value&&A.rows.some(S=>S.key==="page_buttons")?(g(),_("p",f_,d(l.value),1)):W("",!0)]))),128))])):W("",!0)],2))}}),h_={class:"seg wrap",role:"group"},m_=["disabled","aria-pressed","onClick"],mt=Le({__name:"Segmented",props:{choices:{},value:{},disabled:{type:Boolean}},emits:["pick"],setup(e,{emit:t}){const n=t;return(s,i)=>(g(),_("div",h_,[(g(!0),_(q,null,me(e.choices,([l,r])=>(g(),_("button",{key:String(l),type:"button",disabled:e.disabled,"aria-pressed":String(l)===String(e.value)?"true":"false",onClick:u=>n("pick",l)},d(r),9,m_))),128))]))}}),b_={class:"f"},v_={class:"f-label"},g_={key:0},__={key:1,class:"warn"},y_=["aria-expanded"],w_={class:"tx"},k_={key:0,class:"mono"},$_={class:"link"},x_={key:0,class:"picker"},S_=["placeholder","aria-label"],C_={class:"action-list"},T_=["aria-pressed","onClick"],E_={key:0,class:"hint"},A_={key:1,class:"warn"},P_={class:"f-label"},O_=["aria-label","value","onChange"],I_={value:""},L_=["value"],M_={key:3,class:"action-number"},R_=["aria-label","value","onInput"],N_=["onClick"],F_={key:4,class:"action-number"},D_=["aria-label","min","max","step","value","placeholder","onInput"],U_={key:0},j_=["aria-label","value","placeholder","onInput"],H_={key:6},V_={key:0,class:"warn"},W_={key:3},B_=Le({__name:"ActionPicker",props:{tile:{}},setup(e){const t=e,n=$(()=>m.entityActions[t.tile.entity]),s=$(()=>t.tile.options?.action),i=$(()=>n.value?.find(C=>C.action===s.value?.action)),l=$(()=>m.actionPickerOpen||!s.value),r=$(()=>{const C=m.actionSearch.trim().toLocaleLowerCase();return(n.value||[]).filter(K=>`${K.name} ${K.action} ${K.description}`.toLocaleLowerCase().includes(C))});n.value===void 0&&wm(t.tile.entity);function u(C){const K=C.action===s.value?.action;t.tile.options={...t.tile.options,action:K?s.value:{action:C.action}},m.actionPickerOpen=!1,pt()}function f(C,K){const O={...t.tile.options?.action?.data||{}};K===void 0?delete O[C]:O[C]=K,t.tile.options={...t.tile.options,action:{action:s.value.action,...Object.keys(O).length?{data:O}:{}}},pt()}const h=$(()=>{if(!i.value)return[];const C=t.tile.options?.action?.data||{};return i.value.fields.filter(K=>K.required&&C[K.key]===void 0).map(K=>K.name)}),p=C=>Object.keys(C.selector||{})[0]||"text",b=C=>(C.selector||{})[p(C)]||{},v=C=>C.example===void 0?"":typeof C.example=="string"?C.example:JSON.stringify(C.example);function y(C){const K=b(C),O=p(C);return Array.isArray(C.options)?C.options.map(E=>[E,E]):O==="select"&&Array.isArray(K.options)&&!K.multiple?K.options.map(E=>E&&typeof E=="object"?[String(E.value),String(E.label??E.value)]:[String(E),String(E)]):null}const I=C=>"#"+C.map(K=>Math.max(0,Math.min(255,Number(K)||0)).toString(16).padStart(2,"0")).join(""),T=C=>Array.isArray(C)&&C.length===3?I(C):"#ffffff",k=C=>C===void 0?"":typeof C=="string"?C:JSON.stringify(C);function A(C,K){const O=K.trim();if(!O)return f(C.key,void 0);if(p(C)==="text")return f(C.key,K);try{f(C.key,JSON.parse(O))}catch{f(C.key,K)}}function S(C,K){f(C.key,K===""||!Number.isFinite(Number(K))?void 0:Number(K))}const U=C=>b(C).unit_of_measurement||p(C)==="color_temp"&&b(C).unit||"";return(C,K)=>(g(),_("div",b_,[o("span",v_,d(a(c)("editor.action.label")),1),n.value===void 0?(g(),_("small",g_,d(a(c)("editor.action.asking")),1)):n.value===null?(g(),_("small",__,d(a(c)("editor.action.not_answering")),1)):(g(),_(q,{key:2},[o("button",{type:"button",class:"row","aria-expanded":l.value?"true":"false",onClick:K[0]||(K[0]=O=>a(m).actionPickerOpen=!l.value)},[o("span",w_,[o("b",null,d(i.value?i.value.name:s.value?s.value.action:a(c)("editor.action.choose")),1),s.value?(g(),_("small",k_,d(s.value.action),1)):W("",!0)]),o("span",$_,d(l.value?a(c)("editor.common.close"):a(c)("editor.common.change")),1)],8,y_),l.value?(g(),_("div",x_,[Ee(o("input",{"onUpdate:modelValue":K[1]||(K[1]=O=>a(m).actionSearch=O),type:"search",placeholder:a(c)("editor.action.search"),"aria-label":a(c)("editor.action.search_label")},null,8,S_),[[Xe,a(m).actionSearch]]),o("div",C_,[(g(!0),_(q,null,me(r.value,O=>(g(),_("button",{key:O.action,type:"button",class:"action-choice","aria-pressed":O.action===s.value?.action?"true":"false",onClick:E=>u(O)},[o("strong",null,d(O.name),1),o("small",null,d(O.description?`${O.action} · ${O.description}`:O.action),1)],8,T_))),128)),r.value.length?W("",!0):(g(),_("p",E_,d(a(c)("editor.action.none_found")),1))])])):W("",!0),s.value&&!i.value?(g(),_("small",A_,d(a(c)("editor.action.gone")),1)):W("",!0),i.value&&!l.value?(g(),_(q,{key:2},[(g(!0),_(q,null,me(i.value.fields,O=>(g(),_("div",{key:O.key,class:"f"},[o("span",P_,d(O.required?O.name:a(c)("editor.action.optional",{name:O.name})),1),p(O)==="boolean"?(g(),it(mt,{key:0,choices:[["",a(c)("editor.action.not_set")],["true",a(c)("editor.action.on")],["false",a(c)("editor.action.off")]],value:s.value?.data?.[O.key]===void 0?"":String(s.value?.data?.[O.key]),onPick:E=>f(O.key,E===""?void 0:E==="true")},null,8,["choices","value","onPick"])):y(O)&&y(O).length<=4?(g(),it(mt,{key:1,choices:[["",a(c)("editor.action.not_set")],...y(O)],value:s.value?.data?.[O.key]===void 0?"":String(s.value?.data?.[O.key]),onPick:E=>f(O.key,E===""?void 0:E)},null,8,["choices","value","onPick"])):y(O)?(g(),_("select",{key:2,"aria-label":O.name,value:String(s.value?.data?.[O.key]??""),onChange:E=>f(O.key,E.target.value===""?void 0:E.target.value)},[o("option",I_,d(a(c)("editor.action.not_set")),1),(g(!0),_(q,null,me(y(O),([E,R])=>(g(),_("option",{key:E,value:E},d(R),9,L_))),128))],40,O_)):p(O)==="color_rgb"?(g(),_("div",M_,[o("input",{type:"color","aria-label":O.name,value:T(s.value?.data?.[O.key]),onInput:E=>f(O.key,[1,3,5].map(R=>parseInt(E.target.value.slice(R,R+2),16)))},null,40,R_),o("button",{type:"button",class:"btn quiet mini",onClick:E=>f(O.key,void 0)},d(a(c)("editor.action.not_set")),9,N_)])):p(O)==="number"||p(O)==="color_temp"?(g(),_("div",F_,[o("input",{type:"number","aria-label":O.name,min:b(O).min,max:b(O).max,step:b(O).step==="any"?"any":b(O).step,value:s.value?.data?.[O.key]??"",placeholder:v(O),onInput:E=>S(O,E.target.value)},null,40,D_),U(O)?(g(),_("span",U_,d(U(O)),1)):W("",!0)])):(g(),_("input",{key:5,type:"text","aria-label":O.name,value:k(s.value?.data?.[O.key]),placeholder:v(O),onInput:E=>A(O,E.target.value)},null,40,j_)),O.description?(g(),_("small",H_,d(O.description),1)):W("",!0)]))),128)),h.value.length?(g(),_("small",V_,d(a(c)("editor.action.needs",{fields:h.value.join(", ")})),1)):W("",!0)],64)):W("",!0),a($t)(0,2,58)?W("",!0):(g(),_("small",W_,d(a(c)("editor.action.needs_firmware")),1))],64))]))}}),K_={class:"f"},z_={class:"f-label"},q_=["aria-expanded"],Y_={class:"av mdi"},G_={class:"tx"},J_={class:"link"},X_={key:0,class:"picker"},Z_=["placeholder","aria-label"],Q_=["aria-pressed","title"],ey={class:"mdi"},ty=["aria-pressed","title"],ny={class:"icon-list"},sy={class:"icon-grid"},iy=["title","aria-label","aria-pressed","onClick"],oy={class:"mdi"},ly={key:0,class:"hint"},ay={key:1},Ru=Le({__name:"IconPicker",props:{selected:{},automatic:{},autoLabel:{},allowNone:{type:Boolean},note:{}},emits:["pick"],setup(e,{emit:t}){const n=e,s=t,i=$e(""),l=$(()=>qs(n.selected)),r=$(()=>n.selected==="none"?"":Ae(l.value?.cp||n.automatic)),u=$(()=>n.selected==="none"?c("editor.icon.none"):l.value?.label||n.autoLabel),f=$(()=>{const h=i.value.trim().toLocaleLowerCase();return(m.inventory.icons?.groups||[]).map(p=>({label:p.label,icons:p.icons.filter(b=>!h||`${b.label} ${b.name.replaceAll("-"," ")} ${p.label}`.toLocaleLowerCase().includes(h))})).filter(p=>p.icons.length)});return(h,p)=>(g(),_("div",K_,[o("span",z_,d(a(c)("editor.icon.label")),1),o("button",{type:"button",class:"row","aria-expanded":a(m).iconPickerOpen?"true":"false",onClick:p[0]||(p[0]=b=>a(m).iconPickerOpen=!a(m).iconPickerOpen)},[o("span",Y_,d(r.value),1),o("span",G_,[o("b",null,d(u.value),1)]),o("span",J_,d(a(m).iconPickerOpen?a(c)("editor.common.close"):a(c)("editor.common.change")),1)],8,q_),a(m).iconPickerOpen?(g(),_("div",X_,[Ee(o("input",{"onUpdate:modelValue":p[1]||(p[1]=b=>i.value=b),type:"search",placeholder:a(c)("editor.icon.search"),"aria-label":a(c)("editor.icon.search_label")},null,8,Z_),[[Xe,i.value]]),o("button",{type:"button",class:"icon-choice icon-auto","aria-pressed":e.selected==="auto"?"true":"false",title:e.autoLabel,onClick:p[2]||(p[2]=b=>s("pick","auto"))},[o("span",ey,d(a(Ae)(e.automatic)),1),o("span",null,d(e.autoLabel),1)],8,Q_),e.allowNone?(g(),_("button",{key:0,type:"button",class:"icon-choice icon-auto","aria-pressed":e.selected==="none"?"true":"false",title:a(c)("editor.icon.none"),onClick:p[3]||(p[3]=b=>s("pick","none"))},[p[4]||(p[4]=o("span",{class:"mdi"},null,-1)),o("span",null,d(a(c)("editor.icon.none_text_only")),1)],8,ty)):W("",!0),o("div",ny,[(g(!0),_(q,null,me(f.value,b=>(g(),_("section",{key:b.label},[o("small",null,d(b.label),1),o("div",sy,[(g(!0),_(q,null,me(b.icons,v=>(g(),_("button",{key:v.name,type:"button",class:"icon-choice",title:v.label,"aria-label":a(c)("editor.icon.aria",{name:v.label}),"aria-pressed":e.selected===v.name?"true":"false",onClick:y=>s("pick",v.name)},[o("span",oy,d(a(Ae)(v.cp)),1)],8,iy))),128))])]))),128)),f.value.length?W("",!0):(g(),_("p",ly,d(a(c)("editor.icon.none_found")),1))])])):W("",!0),e.note?(g(),_("small",ay,d(e.note),1)):W("",!0)]))}}),ry={class:"dr-head"},cy={class:"tx"},uy={class:"mono"},dy=["aria-label"],fy={class:"dr-body"},py={class:"f"},hy={class:"f-label",for:"tile-name"},my=["value","placeholder"],by={key:1,class:"f"},vy={class:"f-label"},gy={key:2,class:"f"},_y={class:"f-label"},yy={key:3,class:"f"},wy={class:"f-label"},ky={class:"f"},$y={class:"f-label"},xy={key:0},Sy={key:4,class:"f"},Cy={class:"f-label"},Ty={key:5,class:"f"},Ey={class:"f-label"},Ay={key:6,class:"f"},Py={class:"f-label"},Oy={key:8,class:"f"},Iy={class:"f-label"},Ly={key:0,class:"warn"},My={key:9,class:"f"},Ry={class:"f-label"},Ny={class:"f"},Fy={class:"f-label"},Dy={class:"sw"},Uy=["aria-label","aria-pressed","onClick"],jy={class:"dr-foot"},Hy=Le({__name:"TileInspector",props:{tile:{}},setup(e){const t=e,n=$(()=>t.tile.entity.split(".")[0]),s=$(()=>zs(t.tile.entity)),i=$(()=>us(t.tile.entity)),l=$(()=>m.layout?It(Ze(m.layout),m.layout.pages):1),r=$(()=>At(t.tile.slot)+1),u=le=>!m.layout?.tiles.some(Z=>At(Z.slot)===le-1),f=$(()=>{const le=Array.from({length:Math.min(fn,l.value+1)},(Z,ue)=>ue+1);return i.value>le.length&&le.push(i.value),le.map(Z=>[Z,u(Z)?c("editor.tile.goes_to.empty",{page:Z}):String(Z)])}),h=$(()=>Xa.value?i.value>l.value?{text:c("editor.tile.goes_to.no_page",{page:i.value}),warn:!0}:{text:c("editor.tile.goes_to.hint"),warn:!1}:{text:c("editor.tile.goes_to.needs_firmware"),warn:!1}),p=$(()=>!m.layout?.tiles.some(le=>xe(le)!==xe(t.tile)&&At(le.slot)===r.value-1)),b=$(()=>{const le=Array.from({length:l.value},(Z,ue)=>[ue+1,String(ue+1)]);return l.value(i.value?["single","wide"]:["single","wide","full"]).map(le=>[le,c(`editor.tile.size.${le}`)])),y=$(()=>i.value?"":Xa.value?c("editor.tile.size.full_hint"):c("editor.tile.size.needs_firmware")),I=$(()=>m.capabilities[t.tile.entity]),T=(le,Z)=>t.tile.options?.[le]??Z,k=$(()=>T("display",n.value==="screen"?"digital":"standard")),A=$(()=>{const le=n.value==="screen"?["digital","analog"]:["standard","watch"],Z=I.value;return n.value==="weather"&&(!Z||Z.displays.includes("forecast")||k.value==="forecast")&&le.push("forecast"),n.value==="sensor"&&(!Z||Z.displays.includes("graph")||k.value==="graph")&&le.push("graph"),n.value==="sun"&&le.push("sunpath"),["camera","image"].includes(n.value)&&le.push("live"),n.value==="media_player"&&(Ki.value||k.value==="cover")&&C.value!=="full"&&le.push("cover"),le.map(ue=>[ue,c(`editor.tile.display.${ue}`)])}),S=$(()=>{const le=I.value;return le&&k.value==="graph"&&!le.displays.includes("graph")?c("editor.tile.display.no_graph"):le&&k.value==="forecast"&&!le.displays.includes("forecast")?c("editor.tile.display.no_forecast"):k.value==="live"?c($t(0,2,77)?"editor.tile.display.live_hint":"editor.tile.display.live_needs_firmware"):k.value==="cover"?c($t(0,2,78)?"editor.tile.display.cover_hint":"editor.tile.display.cover_needs_firmware"):""}),U=$(()=>T("refresh",15)),C=$(()=>T("size","single")),K=$(()=>m.inventory.controls?.[n.value]),O=$(()=>T("controls",C.value==="full"?"none":K.value?.default)),E=$(()=>{const le=I.value;return(K.value?.choices||[]).filter(Z=>!le||Z.key==="none"||Z.key===O.value||le.controls.includes(Z.key)).map(Z=>[Z.key,Z.label])}),R=$(()=>{const le=I.value;return le&&O.value!=="none"&&!le.controls.includes(O.value)?{text:c("editor.tile.controls.not_offered"),warn:!0}:{text:$t(0,2,19)?c(C.value==="full"?"editor.tile.controls.full_hint":"editor.tile.controls.wide_hint"):c("editor.tile.controls.needs_firmware"),warn:!1}}),L=$(()=>T("tap","auto")),D=$(()=>{const le=["auto","detail","none"];return((I.value?I.value.toggle:Ja.includes(n.value))||L.value==="toggle")&&le.push("toggle"),le.push("action"),le.map(Z=>[Z,c(`editor.tile.tap.${Z}`)])}),M=$(()=>L.value==="toggle"&&I.value&&!I.value.toggle?{text:c("editor.tile.tap.no_toggle"),warn:!0}:L.value==="toggle"&&!Ja.includes(n.value)&&!$t(0,2,58)?{text:c("editor.tile.tap.toggle_needs_firmware"),warn:!1}:L.value==="toggle"?{text:c("editor.tile.tap.hold"),warn:!1}:null),Y=$(()=>T("inline","none")),te=$(()=>rm.includes(n.value)&&(!I.value||I.value.inline||Y.value==="slider")),ye=$(()=>Y.value==="slider"&&I.value&&!I.value.inline),re=$(()=>T("history_hours",24)),be=$(()=>Object.entries(m.inventory.backgrounds||{})),ge=$(()=>!!m.inventory.entities.find(le=>le.id===t.tile.entity)?.icon),we=$(()=>!!m.inventory.icons&&(n.value!=="screen"||i.value>0)&&!["forecast","sunpath"].includes(k.value));function Ge(le){t.tile.name=le,pt()}function qe(){m.inspector={kind:"inspect",entity:t.tile.entity}}return(le,Z)=>(g(),_(q,null,[o("div",ry,[o("span",{class:"av mdi",style:Ue({color:a(Ht)(e.tile.entity)[2],background:a(Ht)(e.tile.entity)[3]})},d(a(Ae)(a(vs)(e.tile))),5),o("span",cy,[o("b",null,d(e.tile.name||s.value),1),o("small",uy,d(e.tile.entity),1)]),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.close"),onClick:Z[0]||(Z[0]=(...ue)=>a(Qe)&&a(Qe)(...ue))},"✕",8,dy)]),o("div",fy,[o("div",py,[o("label",hy,d(a(c)("editor.tile.name")),1),o("input",{id:"tile-name",value:e.tile.name,placeholder:s.value,maxlength:"60",onInput:Z[1]||(Z[1]=ue=>Ge(ue.target.value))},null,40,my)]),we.value?(g(),it(Ru,{key:0,selected:e.tile.options?.icon||"auto",automatic:a(Cn)(e.tile.entity),"auto-label":a(c)(ge.value?"editor.tile.icon.auto_ha":"editor.tile.icon.auto_default"),note:a($t)(0,2,18)?"":a(c)("editor.tile.icon.needs_firmware"),onPick:Z[2]||(Z[2]=ue=>a(Jt)(e.tile,"icon",ue))},null,8,["selected","automatic","auto-label","note"])):W("",!0),i.value?(g(),_("div",by,[o("span",vy,d(a(c)("editor.tile.goes_to.label")),1),se(mt,{choices:f.value,value:i.value,onPick:Z[3]||(Z[3]=ue=>a(Em)(e.tile,Number(ue)))},null,8,["choices","value"]),o("small",{class:he({warn:h.value.warn})},d(h.value.text),3)])):(g(),_("div",gy,[o("span",_y,d(a(c)("editor.tile.display.label")),1),se(mt,{choices:A.value,value:k.value,onPick:Z[4]||(Z[4]=ue=>a(Jt)(e.tile,"display",ue))},null,8,["choices","value"]),S.value?(g(),_("small",{key:0,class:he({warn:!(k.value==="live"&&a($t)(0,2,77))&&!(k.value==="cover"&&a($t)(0,2,78))})},d(S.value),3)):W("",!0)])),k.value==="live"?(g(),_("div",yy,[o("span",wy,d(a(c)("editor.tile.refresh.label")),1),se(mt,{choices:[15,30].map(ue=>[ue,a(c)("editor.tile.refresh.seconds",{n:ue})]),value:U.value,onPick:Z[5]||(Z[5]=ue=>a(Jt)(e.tile,"refresh",Number(ue)))},null,8,["choices","value"])])):W("",!0),o("div",ky,[o("span",$y,d(a(c)("editor.tile.size.label")),1),se(mt,{choices:v.value,value:C.value,onPick:Z[6]||(Z[6]=ue=>a(Jt)(e.tile,"size",ue))},null,8,["choices","value"]),y.value?(g(),_("small",xy,d(y.value),1)):W("",!0)]),b.value.length>1?(g(),_("div",Sy,[o("span",Cy,d(a(c)("editor.tile.page.label")),1),se(mt,{choices:b.value,value:r.value,onPick:Z[7]||(Z[7]=ue=>a(Cm)(e.tile,Number(ue)-1))},null,8,["choices","value"])])):W("",!0),K.value&&C.value!=="single"&&!i.value?(g(),_("div",Ty,[o("span",Ey,d(a(c)("editor.tile.controls.label")),1),se(mt,{choices:E.value,value:O.value,onPick:Z[8]||(Z[8]=ue=>a(Jt)(e.tile,"controls",ue))},null,8,["choices","value"]),o("small",{class:he({warn:R.value.warn})},d(R.value.text),3)])):W("",!0),n.value!=="screen"&&!i.value?(g(),_("div",Ay,[o("span",Py,d(a(c)("editor.tile.tap.label")),1),se(mt,{choices:D.value,value:L.value,onPick:Z[9]||(Z[9]=ue=>a(Jt)(e.tile,"tap",ue))},null,8,["choices","value"]),M.value?(g(),_("small",{key:0,class:he({warn:M.value.warn})},d(M.value.text),3)):W("",!0)])):W("",!0),n.value!=="screen"&&!i.value&&L.value==="action"?(g(),it(B_,{key:7,tile:e.tile},null,8,["tile"])):W("",!0),te.value&&!i.value?(g(),_("div",Oy,[o("span",Iy,d(a(c)("editor.tile.slider.label")),1),se(mt,{choices:[["none",a(c)("editor.tile.slider.no")],["slider",a(c)("editor.tile.slider.yes")]],value:Y.value,onPick:Z[10]||(Z[10]=ue=>a(Jt)(e.tile,"inline",ue))},null,8,["choices","value"]),ye.value?(g(),_("small",Ly,d(a(c)("editor.tile.slider.nothing")),1)):W("",!0)])):W("",!0),n.value==="sensor"&&!i.value?(g(),_("div",My,[o("span",Ry,d(a(c)("editor.tile.history.label")),1),se(mt,{choices:[1,6,24].map(ue=>[ue,a(c)("editor.tile.history.hours",ue)]),value:re.value,onPick:Z[11]||(Z[11]=ue=>a(Jt)(e.tile,"history_hours",Number(ue)))},null,8,["choices","value"])])):W("",!0),o("div",Ny,[o("span",Fy,d(a(c)("editor.tile.background.label")),1),o("div",Dy,[(g(!0),_(q,null,me(be.value,([ue,ke])=>(g(),_("button",{key:ue,type:"button","aria-label":a(c)("editor.tile.background.aria",{name:ke.label}),"aria-pressed":(e.tile.options?.background||"auto")===ue?"true":"false",onClick:B=>a(Jt)(e.tile,"background",ue)},[o("i",{class:he(ke.color?"":ue==="none"?"none":"auto"),style:Ue(ke.color?{background:ke.color}:void 0)},null,6),Me(d(ke.label),1)],8,Uy))),128))])])]),o("div",jy,[o("button",{type:"button",class:"btn danger",onClick:Z[12]||(Z[12]=ue=>a(xu)(e.tile))},d(a(c)("editor.common.remove")),1),Z[13]||(Z[13]=o("span",{class:"spacer"},null,-1)),n.value!=="screen"?(g(),_("button",{key:0,type:"button",class:"btn quiet",onClick:qe},d(a(c)("editor.common.read_current_data")),1)):W("",!0)])],64))}}),Vy={class:"dr-head"},Wy={class:"av mdi",style:{background:"var(--seg)",color:"var(--ink-2)"}},By={class:"tx"},Ky=["aria-label"],zy={class:"dr-body"},qy={class:"f"},Yy={class:"f-label",for:"title"},Gy=["value","placeholder"],Jy={class:"f"},Xy={class:"f-label",id:"topbar-caption"},Zy={style:{"text-transform":"none","letter-spacing":"0","font-weight":"500"}},Qy={class:"items",id:"topbar-chips",role:"list","aria-labelledby":"topbar-caption"},e0=["data-index","aria-label","onPointerdown","onClick","onKeydown"],t0={class:"tx"},n0=["aria-label","onClick"],s0=["disabled","title"],i0={class:"live",id:"topbar-live"},o0={class:"f"},l0={class:"f-label"},a0={class:"f"},r0={class:"f-label"},c0={href:"#settings"},u0={key:2},d0={key:0,class:"dr-foot"},f0=["disabled"],p0=["disabled"],h0=Le({__name:"TopbarInspector",props:{index:{}},setup(e){const t=e,n=$(()=>hn()),s=$(()=>n.value[t.index]),i=$(()=>(m.fontsVersion,m.now,m.topbarPreviews,gu(n.value,wu.value,m.layout?.title||jn("editor.mockup.home"),vn))),l=$(()=>i.value.dropped),r=$(()=>m.inventory.header?.min_firmware||"0.2.32"),u=$(()=>{const[Y,te,ye]=r.value.split(".").map(Number);return $t(Y,te,ye)}),f=$(()=>u.value?c(l.value.size?"editor.topbar.hint.overflow":"editor.topbar.hint.reorder"):c("editor.topbar.hint.needs_firmware",{version:r.value})),h=(Y,te)=>{const ye=vn(Y);return ye.shown?l.value.has(te)?c("editor.topbar.detail.overflow"):ye.analog?c("editor.topbar.detail.dial"):ye.text:c("editor.topbar.detail.hidden")},p=Y=>{const te=vn(Y);return te.analog||Y.type!=="entity"?qs(vu[Y.type])?.cp:te.icon},b=Y=>m.topbarAdded?.key===at(Y)&&Date.now()-m.topbarAdded.time<1200;function v(Y){m.layout&&(m.layout.title=Y,pt())}function y(Y){const te=[...n.value];te[t.index]={...te[t.index],...Y},Ds(te)}const I=$(()=>s.value?vn(s.value).shown?l.value.has(t.index)?c("editor.topbar.live.overflow"):c("editor.topbar.live.looks"):c("editor.topbar.live.hidden"):""),T=$(()=>({clock:Wi(as.value,new Date(m.now),an.value),analog:c("editor.topbar.analog_sample"),date:xl(new Date(m.now),an.value)})),k=$e({index:-1,active:!1,moved:!1});let A=null,S=0,U=null,C=0;function K(Y,te){Y.button!==0||Y.target.closest(".x")||(Y.pointerType!=="touch"&&Y.preventDefault(),k.value={index:te,active:!1,moved:!1},A={x:Y.clientX,y:Y.clientY},U=Y.pointerId,clearTimeout(S),Y.pointerType==="touch"&&(S=window.setTimeout(O,260)),document.addEventListener("pointermove",R),document.addEventListener("pointerup",L),document.addEventListener("pointercancel",L))}function O(){k.value.active=!0,document.addEventListener("touchmove",E,{passive:!1})}function E(Y){k.value.active&&Y.preventDefault()}function R(Y){if(Y.pointerId!==U||!A)return;if(!k.value.active){const re=Math.hypot(Y.clientX-A.x,Y.clientY-A.y);if(Y.pointerType==="touch"){re>10&&(clearTimeout(S),A=null);return}if(re<6)return;O()}const te=[...document.querySelectorAll(".items .item[data-index]")];let ye=k.value.index;if(te.forEach((re,be)=>{const ge=re.getBoundingClientRect();bek.value.index&&Y.clientY>ge.top+ge.height/2&&(ye=Math.max(ye,be))}),ye!==k.value.index&&m.layout){const re=[...n.value];re.splice(ye,0,...re.splice(k.value.index,1)),m.layout.header={items:re};const be=t.index===k.value.index;k.value.index=ye,k.value.moved=!0,be&&Qt(ye)}}function L(Y){Y.pointerId===U&&(clearTimeout(S),document.removeEventListener("pointermove",R),document.removeEventListener("pointerup",L),document.removeEventListener("pointercancel",L),document.removeEventListener("touchmove",E),k.value.active&&(C=Date.now()+400,k.value.moved&&pt()),k.value={index:-1,active:!1,moved:!1},A=null,U=null)}function D(Y){Date.now(){const ye=Ws("i18n-t");return g(),_(q,null,[o("div",Vy,[o("span",Wy,d(s.value?a(Ae)(p(s.value)||"F0150"):a(Ae)("F0150")),1),o("span",By,[o("b",null,d(s.value?s.value.type==="entity"?a(zs)(s.value.entity):a(gs)(s.value):a(c)("editor.topbar.title")),1),o("small",{class:he({mono:s.value?.type==="entity"})},d(s.value?s.value.type==="entity"?s.value.entity:a(c)("editor.topbar.builtin"):a(c)("editor.topbar.items",{used:n.value.length},a(_n)())),3)]),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.close"),onClick:te[0]||(te[0]=(...re)=>a(Qe)&&a(Qe)(...re))},"✕",8,Ky)]),o("div",zy,[o("div",qy,[o("label",Yy,d(a(c)("editor.topbar.name")),1),o("input",{id:"title",value:a(m).layout?.title,maxlength:"60",placeholder:a(c)("editor.topbar.name_placeholder"),onInput:te[1]||(te[1]=re=>v(re.target.value))},null,40,Gy)]),o("div",Jy,[o("span",Xy,[Me(d(a(c)("editor.topbar.right"))+" ",1),o("span",Zy," · "+d(n.value.length)+" / "+d(a(_n)()),1)]),o("div",Qy,[(g(!0),_(q,null,me(n.value,(re,be)=>(g(),_("div",{key:a(at)(re)+be,class:he(["item",{selected:be===e.index,"is-hidden":!a(vn)(re).shown,"is-overflow":l.value.has(be),"just-added":b(re),"dragging-chip":k.value.active&&k.value.index===be}]),role:"listitem",tabindex:"0","data-index":be,"aria-label":a(c)("editor.topbar.item_label",{name:a(gs)(re),slot:be+1}),onPointerdown:ge=>K(ge,be),onClick:ge=>D(be),onKeydown:ge=>M(ge,be)},[te[9]||(te[9]=o("span",{class:"grip","aria-hidden":"true"},"⋮⋮",-1)),o("span",{class:"av mdi",style:Ue(a(vn)(re).color?{color:a(vn)(re).color}:void 0)},d(p(re)?a(Ae)(p(re)):""),5),o("span",t0,[o("b",null,d(a(gs)(re)),1),o("small",null,d(h(re,be)),1)]),o("button",{type:"button",class:"x","aria-label":a(c)("editor.topbar.remove_named",{name:a(gs)(re)}),onClick:Ot(ge=>a(nr)(be),["stop"])},"✕",8,n0)],42,e0))),128)),o("button",{type:"button",class:"ghost-btn",id:"topbar-add",disabled:n.value.length>=a(_n)(),title:n.value.length>=a(_n)()?a(c)("editor.topbar.max",a(_n)()):a(c)("editor.topbar.add_title"),onClick:te[2]||(te[2]=(...re)=>a(er)&&a(er)(...re))},d(a(c)("editor.topbar.add_button")),9,s0)]),o("small",{id:"topbar-hint",class:he({warn:l.value.size>0&&u.value})},d(f.value),3)]),s.value?(g(),_(q,{key:0},[o("div",i0,[o("small",null,d(I.value),1),se(Mu,{items:[s.value],single:""},null,8,["items"])]),s.value.type==="entity"?(g(),_(q,{key:0},[o("div",o0,[o("span",l0,d(a(c)("editor.topbar.content.label")),1),se(mt,{choices:(a(m).inventory.header?.contents||[]).map(re=>[re.key,re.label]),value:s.value.content,onPick:te[3]||(te[3]=re=>y({content:re}))},null,8,["choices","value"]),o("small",null,d(a(c)("editor.topbar.content.hint")),1)]),se(Ru,{selected:s.value.icon||"auto",automatic:a(m).topbarPreviews[a(at)(s.value)]?.auto_icon||a(Cn)(s.value.entity),"auto-label":a(c)("editor.topbar.auto_icon"),"allow-none":"",onPick:te[4]||(te[4]=re=>y({icon:re}))},null,8,["selected","automatic","auto-label"]),o("div",a0,[o("span",r0,d(a(c)("editor.topbar.show.label")),1),se(mt,{choices:(a(m).inventory.header?.shows||[]).map(re=>[re.key,re.label]),value:s.value.show,onPick:te[5]||(te[5]=re=>y({show:re}))},null,8,["choices","value"]),o("small",null,d(a(c)("editor.topbar.show.hint")),1)])],64)):s.value.type!=="date"?(g(),it(ye,{key:1,keypath:a(as)?"editor.topbar.clock_24":"editor.topbar.clock_12",tag:"small",id:"topbar-clock",scope:"global"},{settings:oe(()=>[o("a",c0,d(a(c)("editor.topbar.clock_settings")),1)]),_:1},8,["keypath"])):(g(),_("small",u0,d(a(c)("editor.topbar.date_hint",{date:T.value.date})),1))],64)):W("",!0)]),s.value?(g(),_("div",d0,[o("button",{type:"button",class:"btn danger",onClick:te[6]||(te[6]=re=>a(nr)(e.index))},d(a(c)("editor.common.remove")),1),te[10]||(te[10]=o("span",{class:"spacer"},null,-1)),o("button",{type:"button",class:"btn quiet",disabled:e.index===0,onClick:te[7]||(te[7]=re=>a(vo)(e.index,e.index-1)&&a(Qt)(e.index-1))},d(a(c)("editor.topbar.up")),9,f0),o("button",{type:"button",class:"btn quiet",disabled:e.index>=n.value.length-1,onClick:te[8]||(te[8]=re=>a(vo)(e.index,e.index+1)&&a(Qt)(e.index+1))},d(a(c)("editor.topbar.down")),9,p0)])):W("",!0)],64)}}}),m0={class:"dr-head"},b0={class:"tx"},v0=["aria-label"],g0={class:"dr-body"},_0={class:"f"},y0={class:"f-label"},w0={class:"options"},k0=["disabled","onClick"],$0={class:"mdi"},x0={class:"tx"},S0={key:0,class:"f"},C0={class:"f-label"},T0={class:"options"},E0=["disabled","onClick"],A0={class:"mdi"},P0={class:"tx"},O0={class:"f"},I0={class:"f-label",for:"topbar-search"},L0=["placeholder","aria-label"],M0={class:"options"},R0=["disabled","onClick"],N0={class:"mdi"},F0={class:"tx"},D0={key:0,class:"hint"},U0={key:1,class:"hint"},j0={class:"dr-foot"},H0=Le({__name:"TopbarAdd",setup(e){const t=$e(""),n=$(()=>new Set(hn().map(at))),s=$(()=>({clock:Wi(as.value,new Date(m.now),an.value),analog:c("editor.topbar.analog_sample"),date:xl(new Date(m.now),an.value)})),i=$(()=>m.inventory.header?.suggestions?.[m.selected||""]||[]),l=$(()=>{const u=t.value.trim().toLocaleLowerCase();return m.inventory.entities.filter(f=>`${f.name} ${f.id} ${f.area||""} ${f.device||""}`.toLocaleLowerCase().includes(u))}),r=u=>({type:"entity",entity:u,content:"state",icon:"auto",show:"always"});return(u,f)=>(g(),_(q,null,[o("div",m0,[f[3]||(f[3]=o("span",{class:"av",style:{background:"var(--seg)",color:"var(--ink-2)","font-size":"18px"}},"+",-1)),o("span",b0,[o("b",null,d(a(c)("editor.topbar.add.title")),1),o("small",null,d(a(c)("editor.topbar.add.slots",{used:a(hn)().length},a(_n)())),1)]),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.close"),onClick:f[0]||(f[0]=(...h)=>a(Qe)&&a(Qe)(...h))},"✕",8,v0)]),o("div",g0,[o("div",_0,[o("span",y0,d(a(c)("editor.topbar.add.builtin")),1),o("div",w0,[(g(!0),_(q,null,me(a(m).inventory.header?.builtin||[],h=>(g(),_("button",{key:h.type,type:"button",class:"option",disabled:n.value.has(a(at)({type:h.type})),onClick:p=>a(go)({type:h.type})},[o("span",$0,d(a(Ae)(a(qs)(a(vu)[h.type])?.cp||"F0150")),1),o("span",x0,[o("strong",null,d(h.label),1),o("small",null,d(n.value.has(a(at)({type:h.type}))?a(c)("editor.topbar.add.added"):s.value[h.type]),1)])],8,k0))),128))])]),i.value.length?(g(),_("div",S0,[o("span",C0,d(a(c)("editor.topbar.add.suggestions")),1),o("div",T0,[(g(!0),_(q,null,me(i.value,h=>(g(),_("button",{key:a(at)(h.item),type:"button",class:"option",disabled:n.value.has(a(at)(h.item)),onClick:p=>a(go)(h.item)},[o("span",A0,d(a(Ae)(h.icon||a(Cn)(h.item.entity))),1),o("span",P0,[o("strong",null,d(h.label),1),o("small",null,d(n.value.has(a(at)(h.item))?a(c)("editor.topbar.add.added"):[h.name,h.area].filter(Boolean).join(" · ")),1)])],8,E0))),128))])])):W("",!0),o("div",O0,[o("label",I0,d(a(c)("editor.topbar.add.entity")),1),Ee(o("input",{id:"topbar-search","onUpdate:modelValue":f[1]||(f[1]=h=>t.value=h),type:"search",placeholder:a(c)("editor.topbar.add.search"),"aria-label":a(c)("editor.topbar.add.search_label")},null,8,L0),[[Xe,t.value]]),o("div",M0,[(g(!0),_(q,null,me(l.value.slice(0,40),h=>(g(),_("button",{key:h.id,type:"button",class:"option",disabled:n.value.has(a(at)(r(h.id))),onClick:p=>a(go)(r(h.id))},[o("span",N0,d(a(Ae)(a(Cn)(h.id))),1),o("span",F0,[o("strong",null,d(h.name),1),o("small",null,d([h.area,h.id].filter(Boolean).join(" · ")),1)])],8,R0))),128)),l.value.length?l.value.length>40?(g(),_("p",U0,d(a(c)("editor.common.results",l.value.length)),1)):W("",!0):(g(),_("p",D0,d(a(c)("editor.topbar.add.none_found")),1))])])]),o("div",j0,[f[4]||(f[4]=o("span",{class:"spacer"},null,-1)),o("button",{type:"button",class:"btn quiet",onClick:f[2]||(f[2]=(...h)=>a(Qe)&&a(Qe)(...h))},d(a(c)("editor.common.cancel")),1)])],64))}}),V0={class:"dr-head"},W0={class:"tx"},B0=["aria-label"],K0={class:"dr-body",id:"inspector-section"},z0={id:"inspection-summary"},q0={key:0,class:"hint warn"},Y0={key:1,class:"hint"},G0={id:"inspection"},J0={class:"dr-foot"},X0=Le({__name:"InspectPanel",props:{entity:{}},setup(e){const t=e,n=$e(null),s=$e(c("editor.inspect.reading")),i=$e("");async function l(){if(m.selected){n.value=null,i.value="",s.value=c("editor.inspect.fetching");try{const u=await Ft(`screens/${encodeURIComponent(m.selected)}/inspect`),f=t.entity?u.tiles.filter(h=>h.entity===t.entity):u.tiles;n.value=f,s.value=JSON.stringify(t.entity?f[0]:u,null,2)}catch(u){i.value=u.message,s.value="",Ce(u.message)}}}const r=u=>{const f=m.layout?.tiles.find(h=>h.entity===u)?.options||{};return c("editor.inspect.options",{slider:c(f.inline==="slider"?"editor.inspect.yes":"editor.inspect.no"),display:bu(f.display||"standard"),size:am(f.size),control:nm({entity:u,options:f},m.inventory),background:m.inventory.backgrounds?.[f.background||"auto"]?.label||c("editor.inspect.background_default")})};return An(l),Tt(()=>t.entity,l),(u,f)=>(g(),_(q,null,[o("div",V0,[f[1]||(f[1]=o("span",{class:"av",style:{background:"var(--seg)",color:"var(--ink-2)","font-size":"16px"}},"⌕",-1)),o("span",W0,[o("b",null,d(a(c)("editor.inspect.title")),1),o("small",{class:he({mono:e.entity})},d(e.entity||a(c)("editor.inspect.subtitle")),3)]),o("button",{type:"button",class:"icon-btn","aria-label":a(c)("editor.common.close"),onClick:f[0]||(f[0]=(...h)=>a(Qe)&&a(Qe)(...h))},"✕",8,B0)]),o("div",K0,[o("div",z0,[i.value?(g(),_("p",q0,d(i.value),1)):n.value?W("",!0):(g(),_("p",Y0,d(a(c)("editor.inspect.fetching")),1)),(g(!0),_(q,null,me(n.value||[],(h,p)=>(g(),_("article",{key:p,class:"inspection-tile"},[o("strong",null,d(h.entity),1),o("span",null,d(a(c)("editor.inspect.status",{status:h.word||h.state})),1),o("small",null,d(r(h.entity)),1)]))),128))]),o("pre",G0,d(s.value),1)]),o("div",J0,[o("button",{type:"button",class:"btn quiet",onClick:l},d(a(c)("editor.inspect.read_again")),1),f[2]||(f[2]=o("span",{class:"spacer"},null,-1))])],64))}}),Z0=["aria-hidden"],Q0=Le({__name:"Drawer",setup(e){const t=$(()=>!!(m.inspector&&(m.inspector.kind!=="tile"||uo.value)));return(n,s)=>(g(),_("aside",{class:he(["drawer",{open:t.value}]),id:"tile-sheet","aria-hidden":t.value?"false":"true",onClick:s[0]||(s[0]=Ot(()=>{},["stop"]))},[a(m).inspector?(g(),_(q,{key:0},[a(m).inspector.kind==="tile"&&a(uo)?(g(),it(Hy,{key:0,tile:a(uo)},null,8,["tile"])):a(m).inspector.kind==="bar"?(g(),it(h0,{key:1,index:a(m).inspector.index},null,8,["index"])):a(m).inspector.kind==="bar-add"?(g(),it(H0,{key:2})):a(m).inspector.kind==="inspect"?(g(),it(X0,{key:3,entity:a(m).inspector.entity},null,8,["entity"])):W("",!0)],64)):W("",!0)],10,Z0))}}),e1={class:"main-head"},t1={class:"eyebrow",id:"screen-name"},n1=["title"],s1={class:"head-right"},i1={class:"seg",role:"tablist"},o1=["aria-pressed"],l1=["aria-pressed"],a1={key:1,id:"dirty",class:"chip dirty"},r1=["disabled"],c1={key:0,class:"spin small"},u1=["aria-label","aria-expanded"],d1={key:3,class:"menu",role:"menu"},f1=["disabled","title"],p1=["disabled","aria-expanded"],h1={key:0,class:"sub"},m1=["onClick"],b1=["disabled","title"],v1={class:"body",id:"body"},g1=Le({__name:"ScreenView",setup(e){const t=$(()=>yt.value),n=$(()=>t.value.online?`${t.value.delivery} · ${t.value.status}`:c("editor.screen_view.offline")),s=$(()=>Pu(t.value)&&t.value.online&&t.value.update?.profile&&t.value.update?.host),i=$(()=>m.inventory.screens.filter(T=>T.id!==t.value.id&&T.layout?.tiles?.length)),l=$e(!1),r=$e(null);function u(){m.menuOpen=!1,l.value=!1}function f(){u(),m.overrideProfile=t.value.update?.profile||null,m.overrideFriendly=t.value.name,He("#override")}function h(){u(),m.selectedTile=null,m.inspector={kind:"inspect"}}function p(T){u(),!(m.dirty&&!confirm(c("editor.screen_view.confirm.copy")))&&Om(T)}function b(){u(),r.value?.click()}async function v(T){const k=T.target,A=k.files?.[0];k.value="",A&&(m.dirty&&!confirm(c("editor.screen_view.confirm.import"))||Lm(await A.text()))}function y(T){if(T.key==="Escape")if(m.menuOpen)u();else{if(m.palette)return;m.inspector&&!T.target?.closest?.(".picker")&&Qe()}else(T.metaKey||T.ctrlKey)&&T.key.toLowerCase()==="s"&&(T.preventDefault(),m.dirty&&Bo())}function I(T){m.menuOpen&&!T.target.closest(".head-right .menu, #more")&&u()}return An(()=>{document.addEventListener("keydown",y),document.addEventListener("click",I)}),rs(()=>{document.removeEventListener("keydown",y),document.removeEventListener("click",I)}),(T,k)=>(g(),_(q,null,[o("header",e1,[o("div",null,[o("span",t1,d(t.value.name),1),o("h1",null,d(a(m).layout?.title||a(jn)("editor.mockup.home")),1)]),o("span",{id:"delivery",class:he(["chip",{off:!t.value.online}]),title:n.value},[k[9]||(k[9]=o("span",{class:"dot"},null,-1)),Me(d(n.value),1)],10,n1),o("div",s1,[o("div",i1,[o("button",{type:"button",id:"tab-layout",role:"tab","aria-pressed":a(m).tab==="layout"?"true":"false",onClick:k[0]||(k[0]=A=>a(m).tab="layout")},d(a(c)("editor.screen_view.tabs.layout")),9,o1),o("button",{type:"button",id:"tab-settings",role:"tab","aria-pressed":a(m).tab==="settings"?"true":"false",onClick:k[1]||(k[1]=A=>{a(m).tab="settings",a(Qe)()})},d(a(c)("editor.screen_view.tabs.settings")),9,l1)]),a(m).dirty?(g(),_("span",a1,d(a(c)("editor.common.unsaved")),1)):(g(),_("span",{key:0,id:"dirty",class:he(["chip",{sent:a(m).saved}])},d(a(m).saved?a(c)("editor.screen_view.sent"):a(c)("editor.screen_view.all_saved")),3)),a(m).dirty?(g(),_("button",{key:2,id:"save",type:"button",class:"btn primary",disabled:a(m).busy,title:"⌘S",onClick:k[2]||(k[2]=A=>a(Bo)())},[a(m).busy?(g(),_("span",c1)):W("",!0),Me(d(a(m).busy?a(c)("editor.common.saving"):a(c)("editor.common.save_send")),1)],8,r1)):W("",!0),o("button",{id:"more",type:"button",class:"icon-btn","aria-label":a(c)("editor.screen_view.more"),"aria-haspopup":"menu","aria-expanded":a(m).menuOpen?"true":"false",onClick:k[3]||(k[3]=Ot(A=>{a(m).menuOpen=!a(m).menuOpen,l.value=!1},["stop"]))},"···",8,u1),a(m).menuOpen?(g(),_("div",d1,[o("button",{type:"button",role:"menuitem",id:"identify",disabled:!a(zn)(t.value)||!t.value.online,title:a(zn)(t.value)?"":a(c)("editor.screen_view.menu.identify_needs"),onClick:k[4]||(k[4]=A=>{u(),a(Su)(t.value)})},[Me(d(a(c)("editor.screen_view.menu.identify"))+" ",1),o("small",null,d(a(c)("editor.screen_view.menu.identify_hint")),1)],8,f1),o("button",{type:"button",role:"menuitem",id:"inspect",onClick:h},[Me(d(a(c)("editor.common.read_current_data"))+" ",1),o("small",null,d(a(c)("editor.screen_view.menu.inspect_hint")),1)]),k[12]||(k[12]=o("div",{class:"sep"},null,-1)),o("button",{type:"button",role:"menuitem",id:"copy-layout",disabled:!i.value.length,"aria-expanded":l.value?"true":"false",onClick:k[5]||(k[5]=Ot(A=>l.value=!l.value,["stop"]))},[Me(d(a(c)("editor.screen_view.menu.copy"))+" ",1),o("small",null,d(i.value.length?a(c)("editor.screen_view.menu.copy_screens",i.value.length):a(c)("editor.screen_view.menu.copy_none")),1)],8,p1),l.value?(g(),_("div",h1,[(g(!0),_(q,null,me(i.value,A=>(g(),_("button",{key:A.id,type:"button",role:"menuitem",onClick:S=>p(A.id)},[Me(d(A.name)+" ",1),o("small",null,d(a(c)("editor.screen_view.menu.copy_tiles",A.layout.tiles.length)),1)],8,m1))),128))])):W("",!0),o("button",{type:"button",role:"menuitem",id:"export-layout",onClick:k[6]||(k[6]=A=>{u(),a(Tu)()})},[Me(d(a(c)("editor.screen_view.menu.export"))+" ",1),k[10]||(k[10]=o("small",null,"JSON",-1))]),o("button",{type:"button",role:"menuitem",id:"import-layout",onClick:b},[Me(d(a(c)("editor.screen_view.menu.import"))+" ",1),k[11]||(k[11]=o("small",null,"JSON",-1))]),k[13]||(k[13]=o("div",{class:"sep"},null,-1)),o("button",{type:"button",role:"menuitem",id:"open-override",disabled:!t.value.update?.profile,title:t.value.update?.profile?"":a(c)("editor.screen_view.menu.override_none"),onClick:f},[Me(d(a(c)("editor.screen_view.menu.override"))+" ",1),o("small",null,d(a(c)("editor.screen_view.menu.override_hint")),1)],8,b1),o("button",{type:"button",role:"menuitem",onClick:k[7]||(k[7]=A=>{u(),a(He)("#firmware")})},d(a(c)("editor.nav.firmware")),1),s.value?(g(),_("button",{key:1,type:"button",role:"menuitem",onClick:k[8]||(k[8]=A=>{u(),a(zo)(t.value)})},[Me(d(a(c)("editor.screen_view.menu.update"))+" ",1),o("small",null,d(t.value.update?.target),1)])):W("",!0)])):W("",!0),o("input",{ref_key:"fileInput",ref:r,type:"file",accept:"application/json,.json",hidden:"",onChange:v},null,544)])]),o("div",v1,[a(m).tab==="layout"?(g(),it(Jg,{key:0})):(g(),it(p_,{key:1})),se(Q0)])],64))}}),_1={key:0,id:"choose",class:"empty"},y1={key:1,id:"empty",class:"empty"},w1=Le({__name:"EmptyState",setup(e){return(t,n)=>a(m).inventory.screens.length?(g(),_("section",_1,[n[1]||(n[1]=o("span",{class:"empty-icon"},"▦",-1)),o("h2",null,d(a(c)("editor.empty.choose.title")),1),o("p",null,d(a(c)("editor.empty.choose.text")),1)])):(g(),_("section",y1,[n[2]||(n[2]=o("span",{class:"empty-icon"},"▦",-1)),o("h2",null,d(a(c)("editor.empty.start.title")),1),o("p",null,d(a(c)("editor.empty.start.text")),1),o("button",{id:"start",type:"button",class:"btn primary",onClick:n[0]||(n[0]=s=>a(He)("#new-screen"))},d(a(c)("editor.empty.start.button")),1)]))}}),k1={class:"panel",id:"settings-view"},$1={class:"panel-head"},x1={class:"tx"},S1={class:"eyebrow"},C1={id:"settings-title"},T1={class:"card-grid"},E1={class:"card"},A1={class:"tools"},P1={class:"tx"},O1={class:"tx"},I1={key:0,class:"card updates",id:"updates"},L1={id:"updates-hint"},M1=["aria-valuenow"],R1={class:"progress-text"},N1={key:0,class:"log-lines"},F1={key:2,class:"whatsnew"},D1={class:"check"},U1=["checked"],j1={key:1,class:"card",id:"language"},H1={class:"field"},V1={class:"f-label",for:"screen-language"},W1=["value","disabled"],B1={value:"auto"},K1=["value"],z1={key:0,id:"language-ha-missing"},q1={class:"field"},Y1={class:"f-label",for:"time-format"},G1=["value","disabled"],J1={value:"auto"},X1={value:"24"},Z1={value:"12"},Q1={class:"field"},e2={class:"f-label",for:"number-format"},t2=["value","disabled"],n2={value:"auto"},s2=["value"],i2={key:0,class:"actions",id:"language-profile"},o2=["disabled"],l2={class:"card"},a2={class:"tools"},r2={class:"tx"},c2={class:"card",id:"claude"},u2={class:"actions"},d2=["disabled"],f2={id:"claude-path"},p2={class:"actions"},h2={class:"btn quiet",id:"claude-download",href:"api/claude-skill.zip",download:"esp-screens.zip"},m2="https://github.com/MaxGramser/homeassistant_espscreen/blob/main/docs/TRANSLATING.md",b2=Le({__name:"AppSettingsView",setup(e){const t=$(()=>m.inventory.updates),n=$(()=>m.inventory.screens.filter(E=>E.update?.available).length),s=$(()=>t.value?t.value.busy?c("editor.settings.updates.busy",{version:t.value.target}):m.inventory.screens.length?n.value?c("editor.settings.updates.available",{version:t.value.target},n.value):c("editor.settings.updates.current",{version:t.value.target}):c("editor.settings.updates.no_screens",{version:t.value.target}):""),i=$(()=>m.inventory.screens.find(E=>E.update?.state==="running"||m.updating.includes(E.id))),l=$(()=>i.value?Xn(i.value):null),r=$(()=>(m.firmwareJob?.logs||[]).slice(-12).join(` -`)),u=$(()=>{const E=m.inventory.changelog,R=t.value?.target;return!Array.isArray(E)||!R?[]:E.filter(L=>L.firmware===R).flatMap(L=>L.lines).slice(0,10)}),f=$(()=>m.inventory.claude_skill),h=$e(!1);async function p(){h.value=!0;try{await Wm()}finally{h.value=!1}}const b=["point","comma","space"],v=$(()=>m.inventory.language),y=$(()=>{const E=v.value,R=E?.ha?su(E.ha,E.languages.map(L=>L.code)):void 0;return E?.languages.find(L=>L.code===R)?.name}),I=$(()=>v.value?.languages.find(E=>E.code===v.value.effective&&!E.checked)),T=E=>c(E==="12"?"editor.settings.language.clock_12":"editor.settings.language.clock_24"),k=E=>lu("1234.5",E),A=Xh(),S=$(()=>{const E=v.value;return E?{...A.clock&&A.clock!==(E.clock_effective||"24")?{clock:A.clock}:{},...A.numbers&&A.numbers!==(E.numbers_effective||"point")?{numbers:A.numbers}:{}}:{}}),U=$(()=>[S.value.clock&&T(S.value.clock),S.value.numbers&&k(os[S.value.numbers])].filter(Boolean).join(" · ")),C=$e(!1);async function K(E,R){const L=R.target;C.value=!0;const D=await ar({[E]:L.value});C.value=!1,D||(L.value=String(v.value?.[E]??"auto"))}async function O(){C.value=!0,await ar(S.value),C.value=!1}return(E,R)=>{const L=Ws("i18n-t");return g(),_("div",k1,[o("div",$1,[o("div",x1,[o("span",S1,d(a(c)("editor.nav.settings")),1),o("h1",C1,d(a(c)("editor.settings.title")),1)]),o("button",{type:"button",class:"btn quiet",id:"close-settings",onClick:R[0]||(R[0]=D=>a(He)(""))},d(a(c)("editor.settings.back")),1)]),o("div",T1,[o("section",E1,[o("h2",null,d(a(c)("editor.settings.screens.title")),1),o("p",null,d(a(c)("editor.settings.screens.text")),1),o("div",A1,[o("button",{type:"button",class:"tool",onClick:R[1]||(R[1]=D=>a(He)("#new-screen"))},[R[9]||(R[9]=o("span",{class:"tool-icon"},"+",-1)),o("span",P1,[o("b",null,d(a(c)("editor.nav.new_screen")),1),o("small",null,d(a(c)("editor.nav.new_screen_detail")),1)])]),o("button",{type:"button",class:"tool",onClick:R[2]||(R[2]=D=>a(He)("#firmware"))},[R[10]||(R[10]=o("span",{class:"tool-icon"},"⇪",-1)),o("span",O1,[o("b",null,d(a(c)("editor.nav.firmware")),1),o("small",null,d(a(c)("editor.settings.screens.firmware_detail")),1)])])])]),t.value?(g(),_("section",I1,[o("h2",null,d(a(c)("editor.settings.updates.title")),1),o("p",L1,d(s.value),1),i.value&&l.value?(g(),_(q,{key:0},[o("div",{class:"progress",role:"progressbar","aria-valuenow":l.value.percent,"aria-valuemin":"0","aria-valuemax":"100"},[o("i",{style:Ue({width:l.value.percent+"%"})},null,4)],8,M1),o("div",R1,[o("span",null,d(i.value.name)+" · "+d(l.value.percent)+" %",1),o("span",null,d(l.value.text),1)]),r.value?(g(),_("pre",N1,d(r.value),1)):W("",!0)],64)):W("",!0),t.value.pending&&!t.value.busy&&t.value.pending>=2?(g(),_("button",{key:1,id:"update-all",type:"button",class:"btn primary",onClick:R[3]||(R[3]=(...D)=>a(ir)&&a(ir)(...D))},d(a(c)("editor.settings.updates.all",t.value.pending)),1)):W("",!0),u.value.length&&!a(Ko)()?(g(),_("details",F1,[o("summary",null,d(a(c)("editor.settings.updates.whats_new",{version:t.value.target})),1),o("ul",null,[(g(!0),_(q,null,me(u.value,D=>(g(),_("li",{key:D},d(D),1))),128))])])):W("",!0),o("label",D1,[o("input",{type:"checkbox",id:"auto-update",checked:!!t.value.auto,onChange:R[4]||(R[4]=D=>a(Vm)(D.target.checked))},null,40,U1),o("span",null,[Me(d(a(c)("editor.settings.updates.auto_label")),1),o("small",null,d(a(c)("editor.settings.updates.auto_hint")),1)])])])):W("",!0),v.value?(g(),_("section",j1,[o("h2",null,d(a(c)("editor.settings.language.title")),1),o("div",H1,[o("label",V1,d(a(c)("editor.settings.language.screen_language")),1),o("select",{id:"screen-language",value:v.value.setting,disabled:C.value,onChange:R[5]||(R[5]=D=>K("setting",D))},[o("option",B1,d(y.value?a(c)("editor.settings.language.auto",{name:y.value}):a(c)("editor.settings.language.auto_plain")),1),(g(!0),_(q,null,me(v.value.languages,D=>(g(),_("option",{key:D.code,value:D.code},d(D.checked?D.name:a(c)("editor.settings.language.unchecked",{name:D.name})),9,K1))),128))],40,W1),v.value.setting==="auto"&&!y.value?(g(),_("small",z1,d(a(c)("editor.settings.language.ha_missing")),1)):W("",!0),I.value?(g(),it(L,{key:1,keypath:"editor.settings.language.help",tag:"small",id:"language-help",scope:"global"},{name:oe(()=>[Me(d(I.value.name),1)]),guide:oe(()=>[o("a",{href:m2,target:"_blank",rel:"noopener"},d(a(c)("editor.settings.language.guide")),1)]),_:1})):W("",!0),o("small",null,d(a(c)("editor.settings.language.update_hint")),1)]),o("div",q1,[o("label",Y1,d(a(c)("editor.settings.language.time")),1),o("select",{id:"time-format",value:v.value.clock||"auto",disabled:C.value,onChange:R[6]||(R[6]=D=>K("clock",D))},[o("option",J1,d(a(c)("editor.settings.language.time_auto",{clock:T(v.value.clock_auto||v.value.clock_effective)})),1),o("option",X1,d(T("24")),1),o("option",Z1,d(T("12")),1)],40,G1)]),o("div",Q1,[o("label",e2,d(a(c)("editor.settings.language.numbers")),1),o("select",{id:"number-format",value:v.value.numbers||"auto",disabled:C.value,onChange:R[7]||(R[7]=D=>K("numbers",D))},[o("option",n2,d(a(c)("editor.settings.language.numbers_auto",{example:k(a(zm))})),1),(g(),_(q,null,me(b,D=>o("option",{key:D,value:D},d(k(a(os)[D])),9,s2)),64))],40,t2)]),U.value?(g(),_("div",i2,[o("small",null,d(a(c)("editor.settings.language.profile",{formats:U.value})),1),o("button",{type:"button",class:"btn quiet mini",disabled:C.value,onClick:O},d(a(c)("editor.settings.language.use_profile")),9,o2)])):W("",!0),o("small",null,d(a(c)("editor.settings.language.editor_hint")),1)])):W("",!0),o("section",l2,[o("h2",null,d(a(c)("editor.nav.alerts")),1),o("p",null,d(a(c)("editor.settings.alerts.text")),1),o("div",a2,[o("button",{type:"button",class:"tool",onClick:R[8]||(R[8]=D=>a(He)("#alerts"))},[R[11]||(R[11]=o("span",{class:"tool-icon"},"!",-1)),o("span",r2,[o("b",null,d(a(c)("editor.nav.alerts")),1),o("small",null,d(a(c)("editor.settings.alerts.detail")),1)])])])]),o("section",c2,[R[12]||(R[12]=o("h2",null,"Claude",-1)),o("p",null,d(a(c)("editor.settings.claude.text")),1),o("div",u2,[o("button",{type:"button",id:"claude-install",class:he(["btn",f.value?.installed&&f.value.current?"quiet":"primary"]),disabled:!f.value||h.value,onClick:p},d(!f.value||!f.value.installed?a(c)("editor.settings.claude.install"):f.value.current?a(c)("editor.settings.claude.install_again"):a(c)("editor.settings.claude.update")),11,d2),o("span",{id:"claude-status",class:he(["chip",f.value&&f.value.installed?f.value.current?"good":"update":""]),role:"status"},d(f.value?f.value.installed?f.value.current?a(c)("editor.settings.claude.installed_chip"):a(c)("editor.settings.claude.newer"):a(c)("editor.settings.claude.not_installed"):a(c)("editor.common.loading")),3)]),se(L,{keypath:"editor.settings.claude.writes",tag:"small",scope:"global"},{path:oe(()=>[o("code",f2,d(f.value?.path||"/homeassistant/.claude/skills/esp-screens"),1)]),_:1}),o("div",p2,[o("a",h2,d(a(c)("editor.settings.claude.download")),1),o("small",null,d(a(c)("editor.settings.claude.upload")),1)])])])])}}}),v2={class:"panel",id:"installer"},g2={class:"panel-head"},_2={class:"tx"},y2={class:"eyebrow"},w2={id:"install-title"},k2={key:0},$2=["aria-label"],x2={class:"boards"},S2={class:"board"},C2={class:"board"},T2={class:"field"},E2={class:"f-label",for:"friendly_name"},A2=["placeholder"],P2={class:"node-line"},O2={id:"node-preview"},I2={key:0,class:"field",id:"node-label"},L2={class:"f-label",for:"node-name"},M2={key:1,id:"wifi-fields",class:"wifi"},R2={class:"hint",id:"wifi-status"},N2={key:0,class:"field",id:"wifi-ssid-label"},F2={class:"f-label",for:"wifi_ssid"},D2={key:1,class:"field",id:"wifi-password-label"},U2={class:"f-label",for:"wifi_password"},j2={class:"field"},H2={class:"f-label",for:"install-target"},V2={key:0,value:"usb"},W2=["value"],B2={value:"download"},K2={value:""},z2={id:"target-hint"},q2={key:2,class:"hint",id:"install-note"},Y2={class:"actions"},G2=["disabled"],J2={id:"install-status",class:"status-line error",role:"status"},X2={key:1,id:"install-progress",class:"card"},Z2={class:"progress-head"},Q2={key:0,class:"spin",id:"progress-spin"},ew={id:"progress-title"},tw={id:"progress-detail"},nw={key:0,id:"install-download",class:"card",style:{background:"var(--surface-2)"}},sw=["href","download"],iw={class:"steps",id:"download-steps"},ow={key:1,id:"install-result",class:"field"},lw={class:"key-box"},aw={class:"steps",id:"install-steps"},rw=["open"],cw={id:"install-log",class:"log"},uw={class:"actions"},dw="https://web.esphome.io/?dashboard_install",fw=Le({__name:"InstallerView",setup(e){const t=qn({board:"cyd",friendly_name:"",name:"",wifi_ssid:"",wifi_password:"",target:""}),n=qn({view:"setup",file:null,friendly:"",board:"cyd",target:"",apiKey:null,nodeEdited:!1,jobState:null,picked:!1,action:null}),s=$e(!1),i=$e(null),l=$e(null),r=$e([]),u=$e(""),f=$e(""),h=$e(!1),p=$e(!1),b=$e(null);let v=0;function y(ke){return ke.toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g,"").replace(/[^a-z0-9]+/g,"-").replace(/^[^a-z]+/,"").slice(0,30).replace(/-+$/,"")||"screen"}function I(ke){const B=ke.replace(/^\/dev\/serial\/by-id\/usb-/,"").replace(/-if\d+(-port\d+)?$/,"").replace(/_/g," ");return`USB · ${B===ke?ke.replace(/^\/dev\//,""):B}`}Tt(()=>t.friendly_name,()=>{n.nodeEdited||(t.name=y(t.friendly_name))});const T=$(()=>t.name||"…"),k=$(()=>i.value?.ports||[]),A=$(()=>i.value?.wifi),S=$(()=>A.value?.state==="new"||A.value?.state==="missing"),U=$(()=>A.value?.missing||[]),C=$(()=>c(A.value?.state==="new"?"editor.installer.wifi.new":"editor.installer.wifi.missing")),K=$(()=>A.value?.state==="ready"?c("editor.installer.wifi.ready"):A.value?.state==="invalid"?c("editor.installer.wifi.invalid"):""),O=$(()=>c(t.target==="usb"?"editor.installer.target.usb":t.target==="download"?"editor.installer.target.download":t.target?k.value.length>1?"editor.installer.target.several":"editor.installer.target.once":"editor.installer.target.later")),E=$(()=>t.target==="download"?c("editor.firmware.build_download"):t.target?c("editor.installer.install"):c("editor.installer.save_profile")),R=$(()=>i.value?.job?.state==="running"&&!(n.file&&i.value.job.file===n.file)),L=$(()=>h.value||A.value?.state==="invalid"||t.target==="usb"||!!t.target&&(R.value||!i.value?.available));function D(){const ke=t.target;(ke==="download"||ke===""?n.picked:k.value.includes(ke))||(t.target=k.value[0]||"usb")}async function M(){let ke;try{ke=await Ft("firmware")}catch(ie){u.value=ie.message;return}i.value=ke;const B=ke.job,ne=B&&n.file&&B.file===n.file;if(ne&&(n.jobState=B.state),n.view==="setup"){if(ne&&B.state==="running"){Y(B,ke.logs||[]);return}D(),u.value=R.value?c("editor.installer.busy",{file:B.file}):!ke.available&&t.target?c("editor.installer.no_cli"):K.value}else n.view==="progress"&&ne&&(l.value=B,r.value=ke.logs||[],B.state!=="running"&&B.state!=="success"&&(p.value=!0))}function Y(ke,B){n.view="progress",n.jobState=ke.state,n.action=ke.action,l.value=ke,r.value=B}const te=$(()=>l.value?.state==="running"),ye=$(()=>n.view==="done"||l.value?.state==="success"),re=$(()=>n.action==="download"),be=$(()=>c(n.view==="done"?"editor.installer.title.saved":te.value?"editor.installer.title.running":ye.value?re.value?"editor.installer.title.ready":"editor.installer.title.done":"editor.installer.title.failed")),ge=$(()=>n.view==="done"?c("editor.installer.progress.saved",{file:n.file}):te.value?l.value?.stage==="upload"?c("editor.installer.progress.writing",{name:n.friendly}):c("editor.installer.progress.building"):ye.value?re.value?c("editor.installer.progress.ready",{name:n.friendly}):c("editor.installer.progress.installed",{name:n.friendly}):c(re.value?"editor.installer.progress.build_failed":"editor.installer.progress.install_failed")),we=$(()=>n.view==="done"?c("editor.installer.detail.saved"):te.value?l.value?.stage==="upload"?c("editor.installer.detail.uploading"):c(re.value?"editor.installer.detail.building_download":"editor.installer.detail.building"):ye.value?re.value?c("editor.installer.detail.downloaded"):c(n.board==="cyd"?"editor.installer.detail.booted_cyd":"editor.installer.detail.booted"):r.value.filter(ke=>/error/i.test(ke)).pop()||r.value.filter(ke=>/failed/i.test(ke)).pop()||c("editor.installer.detail.see_log")),Ge=$(()=>({href:`api/firmware/profiles/${encodeURIComponent(n.file||"")}/download`,name:(n.file||"").replace(/\.yaml$/,"")+".factory.bin"}));async function qe(ke){const B=ke.target;if(n.nodeEdited||(t.name=y(t.friendly_name)),!!B.reportValidity()){h.value=!0,f.value="";try{const ne={board:t.board,friendly_name:t.friendly_name,name:t.name,target:t.target};S.value&&(U.value.includes("wifi_ssid")&&(ne.wifi_ssid=t.wifi_ssid),U.value.includes("wifi_password")&&(ne.wifi_password=t.wifi_password));const ie=await ft("firmware/profiles","POST",ne);Object.assign(n,{file:ie.file,apiKey:ie.api_key,friendly:t.friendly_name.trim(),board:t.board,target:t.target}),t.wifi_password="",ie.job?Y(ie.job,[]):n.view="done"}catch(ne){f.value=ne.message}finally{h.value=!1}}}async function le(){try{if(!re.value){const{ports:B}=await Ft("firmware");!B.includes(n.target)&&B.length===1&&(n.target=B[0])}const ke=await ft("firmware/jobs","POST",re.value?{file:n.file,action:"download"}:{file:n.file,action:"install",target:n.target});Y(ke,[])}catch(ke){Ce(ke.message)}}function Z(){Object.assign(n,{view:"setup",file:null,apiKey:null,nodeEdited:!1,jobState:null,target:"",picked:!1,action:null}),Object.assign(t,{board:"cyd",friendly_name:"",name:"",wifi_ssid:"",wifi_password:"",target:""}),s.value=!1,l.value=null,r.value=[],f.value="",u.value="",p.value=!1,M()}function ue(){n.view==="progress"&&n.jobState!=="running"&&(n.view="done"),He("")}return An(()=>{M(),v=window.setInterval(M,3e3)}),rs(()=>clearInterval(v)),(ke,B)=>{const ne=Ws("i18n-t");return g(),_("div",v2,[o("div",g2,[o("div",_2,[o("span",y2,d(a(c)("editor.nav.new_screen")),1),o("h1",w2,d(n.view==="setup"?a(c)("editor.installer.title.setup"):be.value),1),n.view==="setup"?(g(),_("p",k2,d(a(c)("editor.installer.intro")),1)):W("",!0)]),o("button",{type:"button",class:"btn quiet",id:"close-install","aria-label":a(c)("editor.common.close"),onClick:ue},d(a(c)("editor.common.back")),9,$2)]),n.view==="setup"?(g(),_("form",{key:0,id:"install-form",class:"card",onSubmit:Ot(qe,["prevent"])},[o("fieldset",null,[o("legend",null,d(a(c)("editor.installer.board")),1),o("div",x2,[o("label",S2,[Ee(o("input",{type:"radio",name:"board",value:"cyd","onUpdate:modelValue":B[0]||(B[0]=ie=>t.board=ie)},null,512),[[ca,t.board]]),o("span",null,[o("b",null,d(a(c)("editor.installer.board_cyd")),1),B[13]||(B[13]=o("small",null,"ESP32-2432S028 · 320 × 240",-1))])]),o("label",C2,[Ee(o("input",{type:"radio",name:"board",value:"guition","onUpdate:modelValue":B[1]||(B[1]=ie=>t.board=ie)},null,512),[[ca,t.board]]),o("span",null,[o("b",null,d(a(c)("editor.installer.board_guition")),1),B[14]||(B[14]=o("small",null,"ESP32-S3-4848S040 · 480 × 480 · GT911",-1))])])])]),o("div",T2,[o("label",E2,d(a(c)("editor.installer.name")),1),Ee(o("input",{id:"friendly_name",name:"friendly_name","onUpdate:modelValue":B[2]||(B[2]=ie=>t.friendly_name=ie),required:"",maxlength:"60",placeholder:a(c)("editor.installer.name_placeholder"),autocomplete:"off"},null,8,A2),[[Xe,t.friendly_name]]),o("small",P2,[Me(d(a(c)("editor.installer.device_name"))+" ",1),o("code",O2,d(T.value),1),o("button",{type:"button",class:"btn link mini",id:"edit-node",onClick:B[3]||(B[3]=ie=>{n.nodeEdited=!0,s.value=!0})},d(a(c)("editor.installer.customize")),1)]),o("small",null,d(a(c)("editor.installer.name_hint")),1)]),s.value?(g(),_("div",I2,[o("label",L2,d(a(c)("editor.installer.device_name")),1),Ee(o("input",{id:"node-name",name:"name","onUpdate:modelValue":B[4]||(B[4]=ie=>t.name=ie),pattern:"[a-z][a-z0-9\\-]{0,29}",maxlength:"30",autocomplete:"off",onInput:B[5]||(B[5]=ie=>n.nodeEdited=!0)},null,544),[[Xe,t.name]]),o("small",null,d(a(c)("editor.installer.device_name_hint")),1)])):W("",!0),S.value?(g(),_("fieldset",M2,[o("legend",null,d(a(c)("editor.installer.wifi.title")),1),o("p",R2,d(C.value),1),U.value.includes("wifi_ssid")?(g(),_("div",N2,[o("label",F2,d(a(c)("editor.installer.wifi.ssid")),1),Ee(o("input",{id:"wifi_ssid",name:"wifi_ssid","onUpdate:modelValue":B[6]||(B[6]=ie=>t.wifi_ssid=ie),autocomplete:"off"},null,512),[[Xe,t.wifi_ssid]])])):W("",!0),U.value.includes("wifi_password")?(g(),_("div",D2,[o("label",U2,d(a(c)("editor.installer.wifi.password")),1),Ee(o("input",{id:"wifi_password",name:"wifi_password",type:"password","onUpdate:modelValue":B[7]||(B[7]=ie=>t.wifi_password=ie),autocomplete:"new-password"},null,512),[[Xe,t.wifi_password]])])):W("",!0)])):W("",!0),o("div",j2,[o("label",H2,d(a(c)("editor.installer.install_via")),1),Ee(o("select",{id:"install-target",name:"target","onUpdate:modelValue":B[8]||(B[8]=ie=>t.target=ie),onChange:B[9]||(B[9]=ie=>{n.picked=!0,M()})},[k.value.length?W("",!0):(g(),_("option",V2,d(a(c)("editor.firmware.no_board")),1)),(g(!0),_(q,null,me(k.value,ie=>(g(),_("option",{key:ie,value:ie},d(I(ie)),9,W2))),128)),o("option",B2,d(a(c)("editor.firmware.download_target")),1),o("option",K2,d(a(c)("editor.installer.later")),1)],544),[[Wn,t.target]]),o("small",z2,d(O.value),1)]),u.value?(g(),_("p",q2,d(u.value),1)):W("",!0),o("div",Y2,[o("button",{type:"submit",class:"btn primary",id:"install-go",disabled:L.value},d(E.value),9,G2),o("span",J2,d(f.value),1)])],32)):(g(),_("div",X2,[o("div",Z2,[te.value?(g(),_("span",Q2)):(g(),_("span",{key:1,class:he(["outcome",ye.value?"ok":"bad"]),id:"progress-mark"},d(ye.value?"✓":"✕"),3)),o("strong",ew,d(ge.value),1)]),o("p",tw,d(we.value),1),ye.value&&re.value&&n.view!=="done"?(g(),_("div",nw,[o("a",{class:"btn primary",id:"download-firmware",href:Ge.value.href,download:Ge.value.name},d(a(c)("editor.firmware.download_file",{name:Ge.value.name})),9,sw),o("ol",iw,[o("li",null,[se(ne,{keypath:"editor.installer.download_steps.plug",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.download_steps.plug_bold")),1)]),_:1})]),o("li",null,[se(ne,{keypath:"editor.installer.download_steps.open",scope:"global"},{bold:oe(()=>[o("b",null,[se(ne,{keypath:"editor.installer.download_steps.open_bold",scope:"global"},{esphome_web:oe(()=>[o("a",{href:dw,target:"_blank",rel:"noopener"},"ESPHome Web")]),_:1})])]),_:1})]),o("li",null,[se(ne,{keypath:n.board==="cyd"?"editor.installer.download_steps.install_cyd":"editor.installer.download_steps.install",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.download_steps.install_bold")),1)]),file:oe(()=>[Me(d(Ge.value.name),1)]),_:1},8,["keypath"])])]),o("small",null,d(a(c)("editor.installer.download_keep")),1)])):W("",!0),ye.value?(g(),_("div",ow,[o("div",lw,[o("span",null,d(a(c)("editor.installer.api_key")),1),o("code",{id:"api-key",ref_key:"keyBox",ref:b},d(n.apiKey||""),513),o("button",{type:"button",class:"btn quiet mini",id:"copy-key",onClick:B[10]||(B[10]=ie=>a(Lt)(n.apiKey||"",b.value))},d(a(c)("editor.common.copy")),1)]),o("ol",aw,[o("li",null,[se(ne,{keypath:"editor.installer.pairing.ha",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.pairing.ha_bold")),1)]),name:oe(()=>[Me(d(n.friendly),1)]),_:1}),B[15]||(B[15]=Me()),o("button",{type:"button",class:"btn quiet mini",onClick:B[11]||(B[11]=(...ie)=>a(ki)&&a(ki)(...ie))},d(a(c)("editor.common.open_integrations")),1)]),o("li",null,[se(ne,{keypath:"editor.installer.pairing.key",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.pairing.key_bold")),1)]),_:1})]),o("li",null,[se(ne,{keypath:"editor.installer.pairing.actions",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.pairing.actions_bold")),1)]),_:1})]),o("li",null,[se(ne,{keypath:"editor.installer.pairing.tiles",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.installer.pairing.tiles_bold")),1)]),_:1})])])])):W("",!0),n.view!=="done"?(g(),_("details",{key:2,id:"install-log-wrap",class:"log-wrap",open:p.value,onToggle:B[12]||(B[12]=ie=>p.value=ie.target.open)},[o("summary",null,d(a(c)("editor.installer.log")),1),o("pre",cw,d(r.value.join(` -`)),1)],40,rw)):W("",!0),o("div",uw,[!te.value&&!ye.value?(g(),_("button",{key:0,type:"button",class:"btn primary",id:"install-retry",onClick:le},d(a(c)("editor.installer.retry")),1)):W("",!0),o("button",{type:"button",class:"btn quiet",id:"install-close",onClick:Z},d(ye.value?a(c)("editor.installer.another"):a(c)("editor.installer.start_over")),1),o("button",{type:"button",class:he(["btn",ye.value?"primary":"quiet"]),onClick:ue},d(ye.value?a(c)("editor.installer.done"):a(c)("editor.common.close")),3)])]))])}}}),pw={class:"panel",id:"firmware-dialog"},hw={class:"panel-head"},mw={class:"tx"},bw={class:"eyebrow"},vw={class:"card"},gw={class:"card-grid"},_w={class:"field"},yw={class:"f-label",for:"firmware-file"},ww=["value"],kw={class:"field"},$w={class:"f-label",for:"firmware-port"},xw={value:"ota"},Sw={key:0,value:"usb"},Cw=["value"],Tw={value:"download"},Ew={key:0,class:"field",id:"firmware-host-label"},Aw={class:"f-label",for:"firmware-host"},Pw=["placeholder"],Ow={class:"actions"},Iw=["disabled"],Lw=["disabled"],Mw=["disabled"],Rw={key:0,class:"spin"},Nw={id:"firmware-status",class:"status-line",role:"status"},Fw={key:0,id:"firmware-download",class:"card",style:{background:"var(--surface-2)"}},Dw=["href","download"],Uw={id:"firmware-log",class:"log"},jw="https://web.esphome.io/?dashboard_install",Hw=Le({__name:"FirmwareView",setup(e){const t=$e(null),n=$e(""),s=$e("ota"),i=$e("");let l=0;async function r(T=!1){try{const k=await Ft("firmware");t.value=k,(T||!n.value)&&(n.value=k.profiles[0]?.file||"");const A=k.ports||[];s.value.startsWith("/")&&!A.includes(s.value)&&(s.value=A[0]||"usb"),s.value==="usb"&&A.length&&(s.value=A[0])}catch(k){Ce(k.message)}}const u=$(()=>t.value?.job?.state==="running"),f=$(()=>!t.value||u.value||!t.value.available||!t.value.profiles?.length),h=$(()=>f.value||s.value==="usb"),p=$(()=>t.value?.ports||[]),b=$(()=>t.value?t.value.available?t.value.job?`${t.value.job.file} · ${t.value.job.action} · ${t.value.job.state}`:c("editor.firmware.choose"):c("editor.firmware.no_cli"):c("editor.common.loading")),v=$(()=>s.value==="download"&&!!n.value&&!!t.value?.downloads?.includes(n.value)),y=$(()=>({href:`api/firmware/profiles/${encodeURIComponent(n.value)}/download`,name:n.value.replace(/\.yaml$/,"")+".factory.bin"}));async function I(T){try{await ft("firmware/jobs","POST",{file:n.value,action:T==="validate"?"validate":T==="build"?"build":s.value==="download"?"download":"install",target:s.value==="ota"?i.value.trim():s.value==="download"?"":s.value}),await r()}catch(k){Ce(k.message)}}return An(()=>{r(!0),l=window.setInterval(()=>r(),3e3)}),rs(()=>clearInterval(l)),(T,k)=>{const A=Ws("i18n-t");return g(),_("div",pw,[o("div",hw,[o("div",mw,[o("span",bw,d(a(c)("editor.nav.firmware")),1),o("h1",null,d(a(c)("editor.firmware.title")),1),se(A,{keypath:"editor.firmware.intro",tag:"p",scope:"global"},{ota:oe(()=>[o("b",null,d(a(c)("editor.firmware.ota")),1)]),download:oe(()=>[o("b",null,d(a(c)("editor.firmware.download")),1)]),check:oe(()=>[o("b",null,d(a(c)("editor.firmware.check")),1)]),build:oe(()=>[o("b",null,d(a(c)("editor.firmware.build")),1)]),install:oe(()=>[o("b",null,d(a(c)("editor.firmware.install")),1)]),_:1})]),o("button",{type:"button",class:"btn quiet",id:"close-firmware",onClick:k[0]||(k[0]=S=>a(He)(""))},d(a(c)("editor.common.back")),1)]),o("div",vw,[o("div",gw,[o("div",_w,[o("label",yw,d(a(c)("editor.firmware.profile")),1),Ee(o("select",{id:"firmware-file","onUpdate:modelValue":k[1]||(k[1]=S=>n.value=S)},[(g(!0),_(q,null,me(t.value?.profiles||[],S=>(g(),_("option",{key:S.file,value:S.file},d(S.file),9,ww))),128))],512),[[Wn,n.value]])]),o("div",kw,[o("label",$w,d(a(c)("editor.firmware.install_to")),1),Ee(o("select",{id:"firmware-port","onUpdate:modelValue":k[2]||(k[2]=S=>s.value=S)},[o("option",xw,d(a(c)("editor.firmware.ota")),1),p.value.length?W("",!0):(g(),_("option",Sw,d(a(c)("editor.firmware.no_board")),1)),(g(!0),_(q,null,me(p.value,S=>(g(),_("option",{key:S,value:S},d(S),9,Cw))),128)),o("option",Tw,d(a(c)("editor.firmware.download_target")),1)],512),[[Wn,s.value]])]),s.value==="ota"?(g(),_("div",Ew,[o("label",Aw,d(a(c)("editor.firmware.host")),1),Ee(o("input",{id:"firmware-host","onUpdate:modelValue":k[3]||(k[3]=S=>i.value=S),placeholder:n.value?n.value.replace(/\.yaml$/,".local"):"screen-livingroom.local"},null,8,Pw),[[Xe,i.value]])])):W("",!0)]),o("div",Ow,[o("button",{type:"button",class:"btn quiet",id:"firmware-validate",disabled:f.value,onClick:k[4]||(k[4]=S=>I("validate"))},d(a(c)("editor.firmware.check")),9,Iw),o("button",{type:"button",class:"btn quiet",id:"firmware-build",disabled:f.value,onClick:k[5]||(k[5]=S=>I("build"))},d(a(c)("editor.firmware.build")),9,Lw),o("button",{type:"button",class:"btn primary",id:"firmware-install",disabled:h.value,onClick:k[6]||(k[6]=S=>I("install"))},d(s.value==="download"?a(c)("editor.firmware.build_download"):a(c)("editor.firmware.install")),9,Mw),u.value?(g(),_("span",Rw)):W("",!0)]),o("p",Nw,d(b.value),1),v.value?(g(),_("div",Fw,[o("a",{class:"btn primary",id:"firmware-download-link",href:y.value.href,download:y.value.name},d(a(c)("editor.firmware.download_file",{name:y.value.name})),9,Dw),se(A,{keypath:"editor.firmware.download_how",tag:"small",scope:"global"},{esphome_web:oe(()=>[o("a",{href:jw,target:"_blank",rel:"noopener"},"ESPHome Web")]),_:1})])):W("",!0)]),o("pre",Uw,d((t.value?.logs||[]).join(` -`)),1)])}}}),Vw={class:"panel wide alerts",id:"alerts-dialog"},Ww={class:"panel-head"},Bw={class:"tx"},Kw={class:"eyebrow"},zw={key:0,class:"hint"},qw={class:"alert-hero"},Yw={class:"alert-mock",id:"alert-mock","aria-hidden":"true"},Gw={class:"mdi alert-mock-icon",id:"alert-mock-icon"},Jw={id:"alert-mock-title"},Xw={id:"alert-mock-subtitle"},Zw={class:"fake",id:"alert-mock-button"},Qw=["aria-label"],ek=["data-jump","onClick"],tk={id:"alerts-try",class:"card"},nk={class:"field"},sk={class:"f-label",for:"try-screen"},ik={value:"all"},ok=["value","disabled"],lk={class:"field"},ak={class:"f-label",for:"try-title"},rk={class:"field"},ck={class:"f-label",for:"try-subtitle"},uk={class:"field"},dk={class:"f-label",for:"try-icon"},fk={id:"try-icons"},pk=["value"],hk={class:"field"},mk={class:"f-label",for:"try-color"},bk={value:""},vk=["value"],gk={class:"field"},_k={class:"f-label",for:"try-button"},yk={class:"field"},wk={class:"f-label",for:"try-timeout"},kk={class:"check field"},$k={class:"actions field wide"},xk=["disabled"],Sk={class:"status-line",id:"try-result",role:"status"},Ck={id:"alerts-screens",class:"card"},Tk={id:"alerts-min-firmware"},Ek={id:"alerts-screen-list",class:"options"},Ak={key:0,class:"hint"},Pk={class:"alert-screen-head"},Ok={class:"copy-label"},Ik=["onClick"],Lk={id:"alerts-howto",class:"card"},Mk={class:"steps"},Rk={class:"field"},Nk={class:"f-label",for:"alerts-example-screen"},Fk=["value"],Dk={key:0,value:""},Uk={class:"copy-line"},jk={id:"alerts-example"},Hk={id:"alerts-all",class:"card"},Vk={id:"alerts-all-event"},Wk={id:"alerts-all-dismiss"},Bk={class:"copy-line"},Kk={id:"alerts-all-example"},zk={id:"alerts-fields",class:"card"},qk={class:"table-scroll"},Yk={id:"alerts-field-table"},Gk={key:0},Jk={id:"alerts-icons",class:"card"},Xk={class:"subhead"},Zk={class:"chips",id:"alerts-suggested"},Qk=["onClick"],e3={class:"mdi"},t3={class:"field"},n3={class:"f-label",for:"alerts-icon-search"},s3=["placeholder"],i3={id:"alerts-icon-groups"},o3={class:"subhead"},l3={class:"alert-icon-grid"},a3=["title","onClick"],r3={class:"mdi"},c3={key:0},u3={key:0,class:"hint"},d3={id:"alerts-colors",class:"card"},f3={class:"swatches",id:"alerts-swatches"},p3=["onClick"],h3={id:"alerts-behaviour",class:"card"},m3={class:"alerts-list"},b3={id:"alerts-events",class:"card"},v3={id:"alerts-event-name"},g3={class:"table-scroll"},_3={id:"alerts-ending-table"},y3={class:"subhead"},w3={class:"copy-line"},k3={id:"alerts-wait-example"},$3={id:"alerts-tips",class:"card"},x3={class:"alerts-list"},S3=Le({__name:"AlertsView",setup(e){const t=$(()=>m.inventory.alerts),n=qn({screen:"all",title:c("editor.alerts.example.title"),subtitle:c("editor.alerts.example.subtitle"),icon:"doorbell",color:"orange",button_text:c("editor.alerts.example.button"),timeout:30,flash:!0}),s=$e(!1),i=$e(""),l=$(()=>m.inventory.screens.filter(R=>zn(R)&&R.online));async function r(){s.value=!0,i.value="";try{const{screen:R,...L}=n,D=await Am(R,L),M=m.inventory.screens.find(te=>te.id===R)?.name,Y=R==="all"?c("editor.alerts.try.sent_all",D.sent):M?c("editor.alerts.try.sent_to",{name:M}):c("editor.alerts.try.sent_one");i.value=D.sent?[Y,D.skipped?c("editor.alerts.try.skipped",D.skipped):"",D.unusable?.length?c("editor.alerts.try.left_empty",{fields:D.unusable.join(", ")}):""].filter(Boolean).join(" "):c("editor.alerts.try.nothing",{version:t.value?.min_firmware||"0.2.31"})}catch(R){i.value=R.message}finally{s.value=!1}}const u=$(()=>m.inventory.icons),f=$e(""),h=$e(""),p=R=>`"${String(R).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`,b=R=>R.type==="string"?/^[a-z][a-z0-9-]*$/.test(R.example)?R.example:p(R.example):R.example===!0?"true":R.example===!1?"false":String(R.example),v=$(()=>m.inventory.screens.filter(R=>R.alert_action)),y=$(()=>f.value||v.value[0]?.alert_action||""),I=$(()=>{const R=(t.value?.fields||[]).map(L=>` ${L.name}: ${b(L)}`);return`action: ${y.value||"esphome._show_alert"} -data: -${R.join(` -`)}`}),T=(R,L)=>p((t.value?.fields||[]).find(D=>D.name===R)?.example||L),k=$(()=>[`# ${c("editor.alerts.wait_yaml.comment")}`,"actions:",` - action: ${y.value||"esphome._show_alert"}`," data:",` title: ${T("title","Someone is at the door")}`,` subtitle: ${T("subtitle","Door 3, back")}`," icon: doorbell"," color: orange",` button_text: ${T("button_text","Coming")}`," timeout: 0"," flash: true"," - wait_for_trigger:"," - trigger: event",` event_type: ${t.value?.event||"esphome.screen_alert"}`," event_data:"," action: ok",' timeout: "00:05:00"'," - if:"," - condition: template",' value_template: "{{ wait.trigger is not none }}"'," then:"," - action: notify.notify"," data:",` message: ${p(c("editor.alerts.wait_yaml.message"))}`].join(` -`)),A=$(()=>{const R=(t.value?.fields||[]).map(D=>` ${D.name}: ${b(D)}`),L=t.value?.camera;return L&&R.push(` # ${L.name}: ${L.example} # a Guition shows its picture on the card`),`event: ${t.value?.broadcast?.show||"esp_screens_show_alert"} -event_data: -${R.join(` -`)}`}),S=$(()=>{if(!t.value||!u.value)return[];const R=h.value.trim().toLowerCase();return[...u.value.groups,{label:c("editor.alerts.icons.extra"),icons:t.value.extra_icons}].map(D=>({label:D.label,icons:D.icons.filter(M=>!R||M.name.includes(R)||(M.label||"").toLowerCase().includes(R))})).filter(D=>D.icons.length)}),U=$(()=>t.value?.suggested_icons?.find(R=>R.name==="doorbell")),C=$(()=>t.value?.colors?.find(R=>R.name==="orange")),K=R=>["string","int","bool"].includes(R)?c(`editor.alerts.fields.types.${R}`):R;function O(R){document.getElementById(R)?.scrollIntoView({behavior:"smooth",block:"start"})}const E=["alerts-try","alerts-screens","alerts-howto","alerts-all","alerts-fields","alerts-icons","alerts-colors","alerts-behaviour","alerts-events","alerts-tips"];return(R,L)=>{const D=Ws("i18n-t");return g(),_("div",Vw,[o("div",Ww,[o("div",Bw,[o("span",Kw,d(a(c)("editor.alerts.eyebrow")),1),o("h1",null,d(a(c)("editor.alerts.title")),1),se(D,{keypath:"editor.alerts.intro",tag:"p",scope:"global"},{action:oe(()=>[...L[15]||(L[15]=[o("code",null,"show_alert",-1)])]),_:1})]),o("button",{type:"button",class:"btn quiet",id:"close-alerts",onClick:L[0]||(L[0]=M=>a(He)(""))},d(a(c)("editor.common.back")),1)]),t.value?(g(),_(q,{key:1},[o("div",qw,[o("div",Yw,[o("div",{class:"alert-mock-card",style:Ue(C.value?{background:C.value.color}:void 0)},[o("span",Gw,d(U.value?a(Ae)(U.value.cp):""),1),o("strong",Jw,d(a(c)("editor.alerts.example.title")),1),o("span",Xw,d(a(c)("editor.alerts.example.subtitle")),1),o("span",Zw,d(a(c)("editor.alerts.example.button")),1)],4)]),o("nav",{class:"alerts-nav","aria-label":a(c)("editor.alerts.sections")},[(g(),_(q,null,me(E,M=>o("button",{key:M,type:"button","data-jump":M,onClick:Y=>O(M)},d(a(c)(`editor.alerts.nav.${M.slice(7)}`)),9,ek)),64))],8,Qw)]),o("section",tk,[o("h2",null,d(a(c)("editor.alerts.nav.try")),1),o("p",null,d(a(c)("editor.alerts.try.text")),1),o("form",{class:"try-grid",onSubmit:Ot(r,["prevent"])},[o("div",nk,[o("label",sk,d(a(c)("editor.alerts.try.screen")),1),Ee(o("select",{id:"try-screen","onUpdate:modelValue":L[1]||(L[1]=M=>n.screen=M)},[o("option",ik,d(a(c)("editor.alerts.try.all",{ready:l.value.length})),1),(g(!0),_(q,null,me(a(m).inventory.screens,M=>(g(),_("option",{key:M.id,value:M.id,disabled:!a(zn)(M)||!M.online},d(a(zn)(M)&&M.online?M.name:a(c)("editor.alerts.try.not_ready",{name:M.name})),9,ok))),128))],512),[[Wn,n.screen]])]),o("div",lk,[o("label",ak,d(a(c)("editor.alerts.try.title")),1),Ee(o("input",{id:"try-title","onUpdate:modelValue":L[2]||(L[2]=M=>n.title=M),maxlength:"64"},null,512),[[Xe,n.title]])]),o("div",rk,[o("label",ck,d(a(c)("editor.alerts.try.subtitle")),1),Ee(o("input",{id:"try-subtitle","onUpdate:modelValue":L[3]||(L[3]=M=>n.subtitle=M),maxlength:"240"},null,512),[[Xe,n.subtitle]])]),o("div",uk,[o("label",dk,d(a(c)("editor.alerts.try.icon")),1),Ee(o("input",{id:"try-icon","onUpdate:modelValue":L[4]||(L[4]=M=>n.icon=M),list:"try-icons",placeholder:"doorbell"},null,512),[[Xe,n.icon]]),o("datalist",fk,[(g(!0),_(q,null,me(t.value.suggested_icons,M=>(g(),_("option",{key:M.name,value:M.name},d(M.label||M.name),9,pk))),128))])]),o("div",hk,[o("label",mk,d(a(c)("editor.alerts.try.color")),1),Ee(o("select",{id:"try-color","onUpdate:modelValue":L[5]||(L[5]=M=>n.color=M)},[o("option",bk,d(a(c)("editor.alerts.white")),1),(g(!0),_(q,null,me(t.value.colors,M=>(g(),_("option",{key:M.name,value:M.name},d(M.label),9,vk))),128))],512),[[Wn,n.color]])]),o("div",gk,[o("label",_k,d(a(c)("editor.alerts.try.button")),1),Ee(o("input",{id:"try-button","onUpdate:modelValue":L[6]||(L[6]=M=>n.button_text=M),maxlength:"16"},null,512),[[Xe,n.button_text]])]),o("div",yk,[o("label",wk,d(a(c)("editor.alerts.try.timeout")),1),Ee(o("input",{id:"try-timeout","onUpdate:modelValue":L[7]||(L[7]=M=>n.timeout=M),type:"number",min:"0",max:"86400"},null,512),[[Xe,n.timeout,void 0,{number:!0}]])]),o("label",kk,[Ee(o("input",{type:"checkbox",id:"try-flash","onUpdate:modelValue":L[8]||(L[8]=M=>n.flash=M)},null,512),[[Xf,n.flash]]),o("span",null,[Me(d(a(c)("editor.alerts.try.flash")),1),o("small",null,d(a(c)("editor.alerts.try.flash_hint")),1)])]),o("div",$k,[o("button",{type:"submit",class:"btn primary",id:"try-send",disabled:s.value||!l.value.length},d(s.value?a(c)("editor.alerts.try.sending"):a(c)("editor.alerts.try.send")),9,xk),o("span",Sk,d(i.value),1)])],32)]),o("section",Ck,[o("h2",null,d(a(c)("editor.alerts.nav.screens")),1),se(D,{keypath:"editor.alerts.screens.text",tag:"p",scope:"global"},{version:oe(()=>[o("code",Tk,d(t.value.min_firmware),1)]),_:1}),o("div",Ek,[a(m).inventory.screens.length?W("",!0):(g(),_("p",Ak,d(a(c)("editor.alerts.screens.none")),1)),(g(!0),_(q,null,me(a(m).inventory.screens,M=>(g(),_("div",{key:M.id,class:"alert-screen"},[o("div",Pk,[o("strong",null,d(M.name),1),o("span",{class:he(["chip",a(pn)(a(ls)(M),t.value.min_firmware)&&M.alert_action?"good":"update"])},d(a(pn)(a(ls)(M),t.value.min_firmware)&&M.alert_action?a(c)("editor.alerts.screens.ready",{version:M.firmware}):M.alert_action?a(c)("editor.alerts.screens.update",{version:M.firmware||a(c)("editor.common.unknown")}):a(c)("editor.alerts.screens.unknown")),3)]),(g(!0),_(q,null,me([[a(c)("editor.alerts.screens.show"),M.alert_action],[a(c)("editor.alerts.screens.dismiss"),M.dismiss_action]],([Y,te])=>(g(),_("div",{key:Y,class:"copy-line"},[o("span",Ok,d(Y),1),o("code",null,d(te||"esphome._show_alert"),1),te?(g(),_("button",{key:0,type:"button",class:"btn quiet mini",onClick:ye=>a(Lt)(te,void 0,"action_name")},d(a(c)("editor.common.copy")),9,Ik)):W("",!0)]))),128))]))),128))])]),o("section",Lk,[o("h2",null,d(a(c)("editor.alerts.nav.howto")),1),o("ol",Mk,[se(D,{keypath:"editor.alerts.howto.add",tag:"li",scope:"global"},{add:oe(()=>[o("b",null,d(a(c)("editor.alerts.howto.add_bold")),1)]),esphome:oe(()=>[...L[16]||(L[16]=[o("b",null,"ESPHome",-1)])]),device:oe(()=>[o("i",null,d(a(c)("editor.alerts.howto.device")),1)]),_:1}),se(D,{keypath:"editor.alerts.howto.fields",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.howto.fields_bold")),1)]),empty:oe(()=>[...L[17]||(L[17]=[o("code",null,'""',-1)])]),zero:oe(()=>[...L[18]||(L[18]=[o("code",null,"0",-1)])]),_:1}),se(D,{keypath:"editor.alerts.howto.yaml",tag:"li",scope:"global"},{edit:oe(()=>[o("b",null,d(a(c)("editor.alerts.edit_yaml")),1)]),_:1})]),o("div",Rk,[o("label",Nk,d(a(c)("editor.alerts.howto.example_for")),1),Ee(o("select",{id:"alerts-example-screen","onUpdate:modelValue":L[9]||(L[9]=M=>f.value=M),style:{"max-width":"360px"}},[(g(!0),_(q,null,me(v.value,M=>(g(),_("option",{key:M.id,value:M.alert_action},d(M.name),9,Fk))),128)),v.value.length?W("",!0):(g(),_("option",Dk,d(a(c)("editor.alerts.howto.no_screen")),1))],512),[[Wn,f.value]])]),o("div",Uk,[o("pre",jk,d(I.value),1),o("button",{type:"button",class:"btn quiet mini",id:"alerts-example-copy",onClick:L[10]||(L[10]=M=>a(Lt)(I.value,void 0,"yaml"))},d(a(c)("editor.alerts.copy_yaml")),1)])]),o("section",Hk,[o("h2",null,d(a(c)("editor.alerts.all.title")),1),se(D,{keypath:"editor.alerts.all.text",tag:"p",scope:"global"},{show:oe(()=>[o("code",Vk,d(t.value.broadcast?.show||"esp_screens_show_alert"),1)]),dismiss:oe(()=>[o("code",Wk,d(t.value.broadcast?.dismiss||"esp_screens_dismiss_alert"),1)]),event:oe(()=>[o("b",null,d(a(c)("editor.alerts.all.event")),1)]),edit:oe(()=>[o("b",null,d(a(c)("editor.alerts.edit_yaml")),1)]),_:1}),o("div",Bk,[o("pre",Kk,d(A.value),1),o("button",{type:"button",class:"btn quiet mini",id:"alerts-all-copy",onClick:L[11]||(L[11]=M=>a(Lt)(A.value,void 0,"yaml"))},d(a(c)("editor.alerts.copy_yaml")),1)])]),o("section",zk,[o("h2",null,d(a(c)("editor.alerts.nav.fields")),1),o("p",null,d(a(c)("editor.alerts.fields.text")),1),o("div",qk,[o("table",Yk,[o("tr",null,[o("th",null,d(a(c)("editor.alerts.fields.field")),1),o("th",null,d(a(c)("editor.alerts.fields.type")),1),o("th",null,d(a(c)("editor.alerts.fields.what")),1),o("th",null,d(a(c)("editor.alerts.fields.example")),1),o("th",null,d(a(c)("editor.alerts.fields.limit")),1)]),(g(!0),_(q,null,me(t.value.fields,M=>(g(),_("tr",{key:M.name},[o("td",null,[o("code",null,d(M.name),1),o("small",null,d(M.label),1)]),o("td",null,d(K(M.type)),1),o("td",null,d(M.help),1),o("td",null,[o("code",null,d(typeof M.example=="string"?M.example:String(M.example)),1)]),o("td",null,d(t.value.limits.cyd[M.name]?a(c)("editor.alerts.fields.bytes",{cyd:t.value.limits.cyd[M.name],guition:t.value.limits.guition[M.name]}):M.type==="int"?a(c)("editor.alerts.fields.seconds"):"—"),1)]))),128)),t.value.camera?(g(),_("tr",Gk,[o("td",null,[o("code",null,d(t.value.camera.name),1),o("small",null,d(t.value.camera.label),1)]),o("td",null,d(a(c)("editor.alerts.fields.types.entity")),1),o("td",null,d(t.value.camera.help),1),o("td",null,[o("code",null,d(t.value.camera.example),1)]),o("td",null,d(a(c)("editor.alerts.fields.camera_limit")),1)])):W("",!0)])])]),o("section",Jk,[o("h2",null,d(a(c)("editor.alerts.nav.icons")),1),se(D,{keypath:"editor.alerts.icons.text",tag:"p",scope:"global"},{field:oe(()=>[...L[19]||(L[19]=[o("code",null,"icon",-1)])]),example:oe(()=>[...L[20]||(L[20]=[o("code",null,"doorbell",-1)])]),mdi:oe(()=>[...L[21]||(L[21]=[o("code",null,"mdi:doorbell",-1)])]),hex:oe(()=>[...L[22]||(L[22]=[o("code",null,"F12E6",-1)])]),_:1}),o("p",Xk,d(a(c)("editor.alerts.icons.handy")),1),o("div",Zk,[(g(!0),_(q,null,me(t.value.suggested_icons,M=>(g(),_("button",{key:M.name,type:"button",class:"chip",onClick:Y=>a(Lt)(M.name,void 0,"icon_name")},[o("span",e3,d(a(Ae)(M.cp)),1),o("code",null,d(M.name),1)],8,Qk))),128))]),o("div",t3,[o("label",n3,d(a(c)("editor.alerts.icons.search_label")),1),Ee(o("input",{id:"alerts-icon-search","onUpdate:modelValue":L[12]||(L[12]=M=>h.value=M),type:"search",placeholder:a(c)("editor.alerts.icons.search"),autocomplete:"off"},null,8,s3),[[Xe,h.value]])]),o("div",i3,[(g(!0),_(q,null,me(S.value,M=>(g(),_("div",{key:M.label,class:"field"},[o("p",o3,d(M.label)+" · "+d(M.icons.length),1),o("div",l3,[(g(!0),_(q,null,me(M.icons,Y=>(g(),_("button",{key:Y.name,type:"button",class:"alert-icon",title:a(c)("editor.alerts.icons.copy",{name:Y.name}),onClick:te=>a(Lt)(Y.name,void 0,"icon_name")},[o("span",r3,d(a(Ae)(Y.cp)),1),o("code",null,d(Y.name),1),Y.label?(g(),_("small",c3,d(Y.label),1)):W("",!0)],8,a3))),128))])]))),128)),S.value.length?W("",!0):(g(),_("p",u3,d(a(c)("editor.alerts.icons.none",{query:h.value,fallback:t.value.fallback_icon})),1))])]),o("section",d3,[o("h2",null,d(a(c)("editor.alerts.nav.colors")),1),se(D,{keypath:"editor.alerts.colors.text",tag:"p",scope:"global"},{field:oe(()=>[...L[23]||(L[23]=[o("code",null,"color",-1)])]),_:1}),o("div",f3,[o("button",{type:"button",class:"swatch",onClick:L[13]||(L[13]=M=>a(Lt)("",void 0,"empty_color"))},[L[25]||(L[25]=o("i",{style:{background:"#ffffff"}},null,-1)),o("span",null,[L[24]||(L[24]=o("code",null,"empty",-1)),o("small",null,d(a(c)("editor.alerts.white")),1)])]),(g(!0),_(q,null,me(t.value.colors,M=>(g(),_("button",{key:M.name,type:"button",class:"swatch",onClick:Y=>a(Lt)(M.name,void 0,"color_name")},[o("i",{style:Ue({background:M.color})},null,4),o("span",null,[o("code",null,d(M.name),1),o("small",null,d(M.label)+" · "+d(M.color),1)])],8,p3))),128))])]),o("section",h3,[o("h2",null,d(a(c)("editor.alerts.nav.behaviour")),1),o("ul",m3,[se(D,{keypath:"editor.alerts.behaviour.wakes",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.wakes_bold")),1)]),_:1}),se(D,{keypath:"editor.alerts.behaviour.on",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.on_bold")),1)]),_:1}),se(D,{keypath:"editor.alerts.behaviour.timeout",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.timeout_bold")),1)]),zero:oe(()=>[...L[26]||(L[26]=[o("code",null,"timeout: 0",-1)])]),minute:oe(()=>[...L[27]||(L[27]=[o("code",null,"timeout: 60",-1)])]),_:1}),se(D,{keypath:"editor.alerts.behaviour.blinking",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.blinking_bold")),1)]),flash:oe(()=>[...L[28]||(L[28]=[o("code",null,"flash: true",-1)])]),_:1}),se(D,{keypath:"editor.alerts.behaviour.replacing",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.replacing_bold")),1)]),replaced:oe(()=>[...L[29]||(L[29]=[o("code",null,"replaced",-1)])]),_:1}),se(D,{keypath:"editor.alerts.behaviour.closing",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.closing_bold")),1)]),dismiss:oe(()=>[...L[30]||(L[30]=[o("code",null,"dismiss_alert",-1)])]),_:1}),se(D,{keypath:"editor.alerts.behaviour.beside",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.behaviour.beside_bold")),1)]),_:1})])]),o("section",b3,[o("h2",null,d(a(c)("editor.alerts.nav.events")),1),se(D,{keypath:"editor.alerts.events.text",tag:"p",scope:"global"},{event:oe(()=>[o("code",v3,d(t.value.event),1)]),action:oe(()=>[...L[31]||(L[31]=[o("code",null,"action",-1)])]),title:oe(()=>[...L[32]||(L[32]=[o("code",null,"title",-1)])]),screen:oe(()=>[...L[33]||(L[33]=[o("code",null,"screen",-1)])]),device_id:oe(()=>[...L[34]||(L[34]=[o("code",null,"device_id",-1)])]),_:1}),o("div",g3,[o("table",_3,[o("tr",null,[L[35]||(L[35]=o("th",null,"action",-1)),o("th",null,d(a(c)("editor.alerts.events.when")),1)]),(g(!0),_(q,null,me(t.value.endings,M=>(g(),_("tr",{key:M.action},[o("td",null,[o("code",null,d(M.action),1)]),o("td",null,d(M.label),1)]))),128))])]),o("p",y3,d(a(c)("editor.alerts.events.wait")),1),o("div",w3,[o("pre",k3,d(k.value),1),o("button",{type:"button",class:"btn quiet mini",id:"alerts-wait-copy",onClick:L[14]||(L[14]=M=>a(Lt)(k.value,void 0,"yaml"))},d(a(c)("editor.alerts.copy_yaml")),1)])]),o("section",$3,[o("h2",null,d(a(c)("editor.alerts.nav.tips")),1),o("ul",x3,[se(D,{keypath:"editor.alerts.tips.color",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.tips.color_bold")),1)]),_:1}),se(D,{keypath:"editor.alerts.tips.short",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.tips.short_bold")),1)]),_:1}),se(D,{keypath:"editor.alerts.tips.button",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.tips.button_bold")),1)]),_:1}),se(D,{keypath:"editor.alerts.tips.resolve",tag:"li",scope:"global"},{dismiss:oe(()=>[...L[36]||(L[36]=[o("code",null,"dismiss_alert",-1)])]),_:1}),se(D,{keypath:"editor.alerts.tips.every",tag:"li",scope:"global"},{event:oe(()=>[o("code",null,d(t.value.broadcast?.show||"esp_screens_show_alert"),1)]),screen:oe(()=>[...L[37]||(L[37]=[o("code",null,"screen",-1)])]),_:1}),se(D,{keypath:"editor.alerts.tips.claude",tag:"li",scope:"global"},{bold:oe(()=>[o("b",null,d(a(c)("editor.alerts.tips.claude_bold")),1)]),_:1})])])],64)):(g(),_("p",zw,d(a(c)("editor.alerts.loading")),1))])}}}),C3={class:"panel",id:"override-dialog"},T3={class:"panel-head"},E3={class:"tx"},A3={class:"eyebrow"},P3={id:"override-title"},O3={class:"notice"},I3={class:"mdi"},L3={class:"file-row"},M3={id:"override-file"},R3={class:"yaml-editor",id:"yaml-editor-wrap"},N3=["aria-label"],F3={class:"actions"},D3={id:"override-count",class:"hint"},U3={class:"actions"},j3=["disabled"],H3=["disabled"],V3=`# Hardware-specific changes for this screen. -# This file is kept when the shared firmware package updates. -# Do not add esphome:, api:, ota:, wifi: or packages: here. - -# Example: a CYD with the ST7789V display controller. -# "!extend" changes the display the shared package already defines; -# a bare id would add a second, incomplete display and fail the build. -display: - - id: !extend my_display - model: ST7789V -`,W3=Le({__name:"OverrideView",setup(e){const t=$(()=>m.overrideProfile),n=$e(""),s=$e(""),i=$e(!1),l=$e(c("editor.common.loading")),r=$e(""),u=$e(!1),f=$e(null),h=$e(null),p=$(()=>n.value.split(` -`).length),b=$(()=>Array.from({length:p.value},(O,E)=>E+1).join(` -`)),v=$(()=>`${c("editor.override.characters",n.value.length)} · ${c("editor.override.lines",p.value)}`);let y=!0;function I(O,E=""){l.value=O,r.value=E}async function T(){if(!t.value){I(c("editor.override.no_profile"),"error");return}I(c("editor.common.loading"));try{const O=await Ft(`firmware/profiles/${encodeURIComponent(t.value)}/override`);s.value=O.override_file,i.value=!!O.attached,n.value=O.exists&&O.content!==`{} -`?O.content:"",I(c(O.attached?"editor.override.attached":"editor.override.not_attached"))}catch(O){I(O.message,"error")}}async function k(O=!1){if(!(!t.value||u.value)){u.value=!0,I(c("editor.override.saving"));try{const E=await ft(`firmware/profiles/${encodeURIComponent(t.value)}/override`,"PUT",{content:n.value});if(s.value=E.override_file,i.value=!0,!O){I(c("editor.override.saved"),"ok"),Ce(c("editor.override.saved_toast"));return}I(c("editor.override.checking")),await ft("firmware/jobs","POST",{file:t.value,action:"validate"}),A()}catch(E){I(E.message,"error")}finally{u.value=!1}}}function A(){const O=Date.now(),E=t.value,R=async()=>{if(!(!y||t.value!==E))try{const L=await Ft("firmware"),D=L.job;if(D&&D.file===E&&D.state==="running")I(D.stage?c("editor.override.checking_stage",{stage:D.stage}):c("editor.override.checking_profile"));else if(D&&D.file===E&&D.state==="success"){I(c("editor.override.valid"),"ok");return}else if(D&&D.file===E&&D.state==="failed"){const M=(L.logs||[]).filter(Y=>/error|failed/i.test(Y)).pop();I(M||c("editor.override.rejected"),"error");return}Date.now()-O<72e5&&setTimeout(R,1200)}catch(L){I(L.message,"error")}};R()}function S(){(!n.value.trim()||confirm(c("editor.override.confirm_example")))&&(n.value=V3,I(c("editor.override.example_loaded")),f.value?.focus())}function U(){(!n.value.trim()||confirm(c("editor.override.confirm_clear")))&&(n.value="",I(c("editor.override.cleared")),f.value?.focus())}function C(O){const E=f.value;if(O.key==="Tab"){O.preventDefault();const R=E.selectionStart,L=E.selectionEnd;E.setRangeText(" ",R,L,"end"),n.value=E.value}else(O.ctrlKey||O.metaKey)&&O.key.toLowerCase()==="s"&&(O.preventDefault(),k(!1))}function K(){h.value&&f.value&&(h.value.scrollTop=f.value.scrollTop)}return An(T),rs(()=>{y=!1}),(O,E)=>(g(),_("div",C3,[o("div",T3,[o("div",E3,[o("span",A3,d(a(c)("editor.override.eyebrow")),1),o("h1",P3,d(a(m).overrideFriendly?a(c)("editor.override.title_named",{name:a(m).overrideFriendly}):a(c)("editor.override.title")),1),o("p",null,d(a(c)("editor.override.intro")),1)]),o("button",{type:"button",class:"btn quiet",id:"close-override",onClick:E[0]||(E[0]=R=>a(He)(""))},d(a(c)("editor.common.back")),1)]),o("div",O3,[o("span",I3,d(a(Ae)("F0493")),1),o("div",null,[o("strong",null,d(a(c)("editor.override.safe_title")),1),o("span",null,d(a(c)("editor.override.safe_text")),1)])]),o("div",L3,[o("code",M3,d(s.value||t.value||""),1),o("span",{id:"override-state",class:he(["chip",{good:i.value}])},d(i.value?a(c)("editor.override.active"):a(c)("editor.override.ready")),3)]),o("div",R3,[o("div",{ref_key:"gutter",ref:h,class:"yaml-gutter",id:"override-gutter","aria-hidden":"true"},d(b.value),513),Ee(o("textarea",{ref_key:"editor",ref:f,id:"override-editor","onUpdate:modelValue":E[1]||(E[1]=R=>n.value=R),spellcheck:"false",autocapitalize:"off",autocomplete:"off",autocorrect:"off","aria-label":a(c)("editor.override.editor_label"),placeholder:`# Example -display: - - id: !extend my_display - model: ST7789V`,onKeydown:C,onScroll:K},null,40,N3),[[Xe,n.value]])]),o("div",F3,[o("button",{type:"button",class:"btn quiet mini",id:"override-example",onClick:S},d(a(c)("editor.override.use_example")),1),o("button",{type:"button",class:"btn quiet mini",id:"override-empty",onClick:U},d(a(c)("editor.override.clear")),1),o("span",D3,d(v.value),1)]),o("p",{id:"override-status",class:he(["status-line",r.value]),role:"status"},d(l.value),3),o("div",U3,[o("button",{type:"button",class:"btn quiet",id:"override-check",disabled:u.value||!t.value,onClick:E[2]||(E[2]=R=>k(!0))},d(a(c)("editor.override.save_check")),9,j3),o("button",{type:"button",class:"btn primary",id:"override-save",disabled:u.value||!t.value,onClick:E[3]||(E[3]=R=>k(!1))},d(a(c)("editor.override.save")),9,H3)])]))}}),B3={class:"main"},K3=Le({__name:"App",setup(e){const t=$(()=>xt.value==="#settings"?b2:xt.value==="#new-screen"?fw:xt.value==="#firmware"?Hw:xt.value==="#alerts"?S3:xt.value==="#override"?W3:yt.value&&m.layout?g1:w1);function n(s){(s.metaKey||s.ctrlKey)&&s.key.toLowerCase()==="k"&&(s.preventDefault(),m.palette=!m.palette)}return An(()=>document.addEventListener("keydown",n)),rs(()=>document.removeEventListener("keydown",n)),(s,i)=>(g(),_("div",{class:he(["app",{dragging:a(m).drag.active}])},[se(Ib),o("main",B3,[(g(),it(Hd(t.value)))]),se(Mb),se(zb)],2))}});Jh().finally(()=>{ip(K3).use(cs).mount("#app"),Jm()}); diff --git a/screen_manager/app/static/assets/it-Dpzyqhcz.js b/screen_manager/app/static/assets/it-VhrDkYVK.js similarity index 56% rename from screen_manager/app/static/assets/it-Dpzyqhcz.js rename to screen_manager/app/static/assets/it-VhrDkYVK.js index 1355118..c1a838e 100644 --- a/screen_manager/app/static/assets/it-Dpzyqhcz.js +++ b/screen_manager/app/static/assets/it-VhrDkYVK.js @@ -1 +1 @@ -const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Annulla"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"sconosciuto"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Modifiche non salvate"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Annulla"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Apri Dispositivi e servizi"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Salva e invia"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Salvataggio…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Leggi i dati attuali"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 risultato. Continua a scrivere per restringere l'elenco."},{t:2,i:[{t:4,k:"n"},{t:3,v:" risultati. Continua a scrivere per restringere l'elenco."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Chiudi"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Rimuovi"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Cambia"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Caricamento…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Indietro"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copia"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nuovo schermo"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware e USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Avvisi"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Collega e installa"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Non ha funzionato. Ricarica la pagina e riprova."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Chiave API copiata."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"La chiave API è selezionata. Copiala con Ctrl+C o Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON della disposizione copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il JSON della disposizione è selezionato. Copialo con Ctrl+C o Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome dell'azione copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il nome dell'azione è selezionato. Copialo con Ctrl+C o Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Lo YAML è selezionato. Copialo con Ctrl+C o Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome dell'icona copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il nome dell'icona è selezionato. Copialo con Ctrl+C o Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Colore vuoto copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il colore vuoto è selezionato. Copialo con Ctrl+C o Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome del colore copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il nome del colore è selezionato. Copialo con Ctrl+C o Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Pagina di gestione non raggiungibile · nuovo tentativo…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant connesso"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Riconnessione a Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Schermi"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Altro"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Ricarica"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornamento"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"In coda per l'aggiornamento"}},available:{t:0,b:{t:2,i:[{t:3,v:"Aggiornamento "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Nessun profilo ESPHome trovato con questo nome dispositivo."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Novità"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Registro completo"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"L'indirizzo IP, una sola volta; poi il nuovo firmware lo comunica da solo."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Indirizzo IP, es. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Indirizzo IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Avvia"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Installato, ma non ancora in Home Assistant. Aggiungi il dispositivo ESPHome rilevato in Impostazioni → Dispositivi e servizi, incolla lì la chiave API e attiva «Allow the device to perform Home Assistant actions» in Configura."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware scaricato, non ancora in Home Assistant. Mettilo sullo schermo con ESPHome Web, poi aggiungi il dispositivo ESPHome rilevato in Impostazioni → Dispositivi e servizi, incolla lì la chiave API e consenti le azioni di Home Assistant in Configura."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Non ancora in Home Assistant. Firmware già installato? Aggiungi il dispositivo ESPHome in Impostazioni → Dispositivi e servizi, poi consenti le azioni di Home Assistant in Configura. Non ancora installato? Firmware e USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copia chiave API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Schermi"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Azioni"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi a questo schermo"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Guida rapida e avviso di prova"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornamenti, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Niente da salvare"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifica questo schermo"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Fa lampeggiare la retroilluminazione e mostra una scheda"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Richiede un firmware più recente"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Esporta disposizione"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Scarica e copia come JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Cerca schermi, entità, azioni…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Nessun risultato. Scrivi parte del nome di uno schermo, di un'entità o di un'azione."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Scegli uno schermo"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Scegli uno dei tuoi schermi a sinistra per modificarne i riquadri, la barra superiore e le impostazioni."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Inizia con uno schermo"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Collega un CYD o un Guition via USB alla macchina di Home Assistant. Profilo, firmware e prima installazione in un colpo solo."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Installa un nuovo schermo"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Hai modifiche non salvate. Aprire comunque un altro schermo?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Sostituire la disposizione non salvata con una copia di quella dell'altro schermo?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Sostituire la disposizione non salvata con quella importata?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. Il tuo schermo si sta aggiornando."}},other:{t:0,b:{t:2,i:[{t:3,v:"Salvato. "},{t:4,k:"name"},{t:3,v:" si sta aggiornando."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. Lo schermo si sta aggiornando."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. La tua ultima modifica non è ancora stata inviata: premi di nuovo Salva e invia."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" lampeggia e mostra una scheda per qualche secondo."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · modifiche salvate"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Disposizione"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni schermo"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Salvato · inviato allo schermo"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Tutto salvato"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Altro"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifica"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"fa lampeggiare lo schermo"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Richiede il firmware 0.2.31 o più recente"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"da Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copia disposizione da…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" schermo"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" schermi"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"nessun altro schermo"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" riquadro"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" riquadri"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Esporta disposizione"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importa disposizione…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizzato"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"avanzato"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Nessun profilo ESPHome trovato per questo schermo"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Riquadro rimosso: "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Non c'è spazio per questo riquadro a pagina "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna pagina è libera per un riquadro a pagina intera. Libera prima una pagina."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Questo schermo ha già un riquadro che porta a pagina "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Disposizione di "},{t:4,k:"name"},{t:3,v:" copiata. Salva e invia quando ti sembra giusta."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Disposizione di "},{t:4,k:"name"},{t:3,v:" copiata. Riquadri compatibili con il firmware di questo schermo: "},{t:4,k:"kept"},{t:3,v:" su "},{t:4,k:"total"},{t:3,v:". Salva e invia quando ti sembra giusta."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Disposizione importata. Salva e invia quando ti sembra giusta."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Disposizione importata. Riquadri compatibili con il firmware di questo schermo: "},{t:4,k:"kept"},{t:3,v:" su "},{t:4,k:"total"},{t:3,v:". Salva e invia quando ti sembra giusta."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Questo non è JSON. Esporta prima una disposizione, oppure incollane una da un altro ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Nessun riquadro in questo file. Serve una disposizione esportata da ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" pagina · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" riquadri"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pagine · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" riquadri"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi la tua prima luce, scena o dispositivo dalla libreria."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Tocca la barra superiore o un riquadro per cambiarne le impostazioni. Trascina per spostare; rilascia sulla pagina successiva per crearne una nuova."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Gli spazi vuoti e le posizioni fisse funzionano a partire dal firmware 0.2.26. Fino a quell'aggiornamento, questo schermo (firmware "},{t:4,k:"firmware"},{t:3,v:") sposta i riquadri verso il primo spazio libero."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Disposizione dello schermo"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Aggiungi pagina"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Al massimo 1 pagina"},{t:2,i:[{t:3,v:"Al massimo "},{t:4,k:"n"},{t:3,v:" pagine"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Pagina "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Rimuovi pagina"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Le pagine successive scalano di un posto"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Modifica barra superiore"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Spazio vuoto. Fai clic per aggiungere un riquadro qui, o trascinane uno."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Spazio vuoto "},{t:4,k:"slot"},{t:3,v:" a pagina "},{t:4,k:"page"},{t:3,v:": aggiungi qui il prossimo riquadro"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Il prossimo riquadro va qui"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Vuoto"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Libreria"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entità"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entità"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca per nome, dispositivo o area…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi un'entità"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Tutti"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Luci"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruttori"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Stato"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Azioni"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatori"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Coperture"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scene"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirapolvere"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensori"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Meteo"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valori"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selezioni"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Persone"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Schermo"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Area"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Tutte le aree"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Nascondi quelle già inserite"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Nascondi ciò che è già su questo schermo"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Tutto ciò che è qui è già su questo schermo."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna entità trovata. Prova un altro nome, un'altra area o un altro filtro."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Questo schermo può contenere 1 riquadro."},{t:2,i:[{t:3,v:"Questo schermo può contenere "},{t:4,k:"n"},{t:3,v:" riquadri."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Questo schermo può contenere 1 riquadro; aggiorna il suo firmware per averne 48."},{t:2,i:[{t:3,v:"Questo schermo può contenere "},{t:4,k:"n"},{t:3,v:" riquadri; aggiorna il suo firmware per averne 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Trascina su una pagina, o tocca + per aggiungere al primo spazio libero. ⌘K cerca ovunque."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Luce"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirapolvere"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatore"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Copertura"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensore"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Stato"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruttore"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Interruttore"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scena"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Meteo"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valore"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Valore"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selezione"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Selezione"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Azione"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Azione"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Schermo"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sole"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Persona"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Telecamera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Immagine"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entità"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"valore grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"previsioni meteo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"grafico"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"orologio digitale"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"orologio analogico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"percorso del sole"}},live:{t:0,b:{t:2,i:[{t:3}],s:"immagine dal vivo"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"copertina"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normale"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"doppia"}},full:{t:0,b:{t:2,i:[{t:3}],s:"pagina intera"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nome sullo schermo"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatica (da Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatica (predefinita)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo mostra l'icona scelta a partire dal firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Porta alla pagina"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (vuota)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"I riquadri di navigazione richiedono il firmware 0.2.62: premi prima Aggiorna per questo schermo."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Questo schermo non ha la pagina "},{t:4,k:"page"},{t:3,v:", quindi un tocco apre la sua ultima pagina. Scegli un'altra pagina."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Un tocco sul riquadro apre quella pagina."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Visualizzazione"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Orologio digitale"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Orologio analogico"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nome e stato"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Valore grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Previsioni meteo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Grafico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Percorso del sole"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Immagine dal vivo"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Una piccola immagine della telecamera al posto dell'icona, aggiornata al ritmo qui sotto finché la pagina è sullo schermo. Un tocco la apre ancora a schermo intero."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Un'immagine dal vivo richiede il firmware 0.2.77 o più recente: premi Aggiorna sullo schermo dopo il salvataggio."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Copertina"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"La copertina di ciò che suona al posto dell'icona, come nel riquadro di Home Assistant; un lettore senza immagine mantiene la sua icona. Un tocco apre ancora la scheda."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La copertina sul riquadro richiede il firmware 0.2.78 o più recente: premi Aggiorna sullo schermo dopo il salvataggio."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non ha valori numerici per questa entità, quindi il grafico resta vuoto. Scegli un'altra visualizzazione."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Questo servizio meteo non ha previsioni giornaliere in Home Assistant. Scegli un'altra visualizzazione."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Ogni "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Dimensione"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Larghezza doppia"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Pagina intera"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Pagina intera: un grande pulsante nel colore del riquadro; in basso trovano posto un cursore, i comandi o un grafico."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Un riquadro a pagina intera richiede il firmware 0.2.62: premi prima Aggiorna per questo schermo."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pagina"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nuova pagina"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Controllo diretto sul riquadro"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non offre questo controllo per questa entità, quindi sullo schermo resta vuoto. Scegline un altro."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"In basso nel riquadro a pagina intera; un tocco altrove funziona come impostato qui sotto."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"A destra del riquadro a larghezza doppia, come le righe in Home Assistant. Un tocco sul nome funziona come impostato qui sotto."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo mostra il controllo diretto a partire dal firmware 0.2.19; fino ad allora il riquadro resta com'era."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Al tocco"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatico"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Apri i controlli"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Solo visualizzazione"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Accendi / spegni"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Esegui azione"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non può accendere e spegnere questa entità, quindi un tocco non fa nulla. Scegli un'altra opzione."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo accende e spegne questa entità a partire dal firmware 0.2.58: premi Aggiorna per questo schermo. Fino ad allora un tocco apre la sua scheda."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Tieni premuto il riquadro per aprire la sua scheda."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Piccolo cursore sul riquadro"}},no:{t:0,b:{t:2,i:[{t:3}],s:"No"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Sì, controllo diretto"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non ha nulla che un cursore possa regolare per questa entità. Scegli No."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Storico"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ora"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ore"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Sfondo pastello"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Sfondo: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", spazio "},{t:4,k:"slot"},{t:3,v:" a pagina "},{t:4,k:"page"},{t:3,v:". Enter: configura, tasti freccia: sposta"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Rimuovi riquadro"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Rimuovi "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Azione"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Chiedo a Home Assistant quali azioni ha questa entità…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non risponde al momento. Riprova tra poco."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Scegli un'azione"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca, per esempio toggle, position o play"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Cerca un'azione"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna azione trovata."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non offre più questa azione per questa entità, quindi un tocco non fa nulla. Scegline un'altra."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (facoltativo)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Non impostato"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Attivo"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Disattivo"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant richiede: "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo esegue un'azione a partire dal firmware 0.2.58: premi Aggiorna per questo schermo. Fino ad allora un tocco funziona come Automatico."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icona"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna icona"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca, per esempio lampada, musica o porta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Cerca un'icona"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna icona, solo testo"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icona: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna icona trovata."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Dati attuali"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Connessione, stato e proprietà supportate"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Lettura…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Recupero dello stato attuale da HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Stato: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Piccolo cursore: "},{t:4,k:"slider"},{t:3,v:" · Visualizzazione: "},{t:4,k:"display"},{t:3,v:" · Dimensione: "},{t:4,k:"size"},{t:3,v:" · Controllo: "},{t:4,k:"control"},{t:3,v:" · Sfondo: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"sì"}},no:{t:0,b:{t:2,i:[{t:3}],s:"no"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"nessuno"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Predefinito"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Leggi di nuovo"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Rimosso dalla barra superiore: "},{t:4,k:"name"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"La barra superiore ha spazio per 1 elemento."},{t:2,i:[{t:3,v:"La barra superiore ha spazio per "},{t:4,k:"n"},{t:3,v:" elementi."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"È già nella barra superiore."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Barra superiore"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Barra superiore: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Dallo schermo stesso, funziona anche senza Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" di "},{t:4,k:"n"},{t:3,v:" elemento"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" di "},{t:4,k:"n"},{t:3,v:" elementi"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Sinistra: nome"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Per esempio: Soggiorno"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Destra: ora, sensori o orologio"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", spazio "},{t:4,k:"slot"},{t:3,v:". Enter: configura, frecce: sposta"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Rimuovi "},{t:4,k:"name"},{t:3,v:" dalla barra superiore"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Massimo 1 elemento"},{t:2,i:[{t:3,v:"Massimo "},{t:4,k:"n"},{t:3,v:" elementi"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi l'ora, la data, l'orologio analogico o un'entità"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Aggiungi ora, data o un'entità"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Non tutto sta accanto al nome: lo schermo tralascia gli elementi tratteggiati. Rimuovine uno o scegli un nome più corto."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Trascina per riordinare; tocca un elemento per configurarlo."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensori, data e orologio analogico compaiono a partire dal firmware "},{t:4,k:"version"},{t:3,v:"; fino a quell'aggiornamento questo schermo mostra il nome e, se l'ora è nella barra, l'orologio."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Nascosto: non attivo al momento"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Non sta accanto al nome"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Quadrante"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Nascosto al momento: non attivo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Al momento non sta accanto al nome"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Come appare sullo schermo"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Piccolo quadrante con l'ora"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Cosa mostrare"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Ultima modifica» continua a contare sullo schermo stesso: «Proprio ora», «5 min fa», «Ieri»."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatica (come Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mostra"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Solo quando attivo» nasconde l'elemento finché è spento, chiuso, fuori casa o a 0. Utile per una porta aperta, una lavatrice in funzione o per sapere chi è a casa."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Orologio a 24 ore · si cambia in "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Orologio a 12 ore · si cambia in "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni → Lingua e regione"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Oggi: "},{t:4,k:"date"},{t:3,v:". La data segue l'orologio dello schermo stesso."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Su"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Giù"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi alla barra superiore"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" di "},{t:4,k:"n"},{t:3,v:" spazio usato"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" di "},{t:4,k:"n"},{t:3,v:" spazi usati"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Dallo schermo stesso"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Già aggiunto"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Suggerimenti da Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Un'entità"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca per nome, area o entità, es. temperatura o porta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Cerca un'entità per la barra superiore"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna entità trovata."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosità"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Notte"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Schermo"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosità"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Modalità scura"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Standby automatico"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Standby dopo"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosità standby"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Modalità notte"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Inizio"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Fine"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosità notte"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Torna a pagina 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Dopo"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Anche in standby"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Scorri tra le pagine"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Pulsanti pagina"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotazione"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Sto ancora salvando le impostazioni dell'altro schermo. Riprova tra poco."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"I pulsanti pagina e lo scorrimento sono disattivati, quindi solo i riquadri «Vai alla pagina» cambiano pagina."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"pagina "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"pagine "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadro «Vai alla pagina», che porta a "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadri «Vai alla pagina», che portano a "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadro «Vai alla pagina», che porta a "},{t:4,k:"targets"},{t:3,v:", ma nessuno a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerla."}]},{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadri «Vai alla pagina», che portano a "},{t:4,k:"targets"},{t:3,v:", ma nessuno a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerla."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadro «Vai alla pagina», che porta a "},{t:4,k:"targets"},{t:3,v:", ma nessuno a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerle."}]},{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadri «Vai alla pagina», che portano a "},{t:4,k:"targets"},{t:3,v:", ma nessuno a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerle."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Non hai riquadri «Vai alla pagina»."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Non hai riquadri «Vai alla pagina» che portano a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerla."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Non hai riquadri «Vai alla pagina» che portano a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerle."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"I riquadri che portano a "},{t:4,k:"pages"},{t:3,v:" sono solo su pagine che non puoi raggiungere."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Da "},{t:4,k:"pages"},{t:3,v:" nessun riquadro riporta a pagina 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Questo schermo è offline. Le sue impostazioni si potranno cambiare quando torna online."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Le modifiche si applicano subito sullo schermo, e quelle fatte sullo schermo compaiono qui."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Le modifiche si applicano subito. A partire dal firmware 0.2.49 lo schermo le conserva da solo."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Questa entità è disattivata in Home Assistant, oppure lo schermo si sta riavviando."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": diminuisci"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": aumenta"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Avvio dell'aggiornamento…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilazione del firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Scrittura del firmware via Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Compilazione e installazione…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"In attesa che lo schermo torni online…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Verifica della stabilità…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Nuova lingua: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Gli schermi ora si aggiorneranno automaticamente di notte."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Gli aggiornamenti automatici sono disattivati."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornamenti del firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Aggiornamento al firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Nessuno schermo associato finora. I nuovi schermi ricevono il firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il firmware "},{t:4,k:"version"},{t:3,v:" è disponibile per "},{t:4,k:"n"},{t:3,v:" schermo."}]},{t:2,i:[{t:3,v:"Il firmware "},{t:4,k:"version"},{t:3,v:" è disponibile per "},{t:4,k:"n"},{t:3,v:" schermi."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Tutti gli schermi hanno il firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Aggiorna 1 schermo"},{t:2,i:[{t:3,v:"Aggiorna tutti i "},{t:4,k:"n"},{t:3,v:" schermi"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Novità del firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna automaticamente ogni notte"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Tra le 03:00 e le 06:00, uno schermo alla volta. Si ferma in caso di errore e lo segnala in Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Skill installata. Claude Code la rileva subito."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Skill installata. Riavvia Claude Code una volta perché trovi la nuova cartella delle skill."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Insegna ESP Screens a Claude, poi chiedi: «Mostra un avviso su tutti i miei schermi quando la cassetta della posta è piena». Claude conosce gli eventi degli avvisi, ogni campo, colore e icona."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installa per Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Installa di nuovo"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna la skill"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Non installata"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Installata"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Installata · è pronta una versione più recente"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Per Claude Code in Home Assistant. Scrive un file in "},{t:4,k:"path"},{t:3,v:"; installando di nuovo lo sostituisci."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Scarica per claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Carica lo zip in Claude, in Personalizza → Skill."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tutto ciò che riguarda i tuoi schermi."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← I miei schermi"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Schermi"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi uno schermo, oppure compila e reinstalla il firmware di uno che hai già."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Compila e installa via USB o Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Lingua e regione"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Lingua degli schermi"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Lingua di Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Lingua di Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Gli schermi usano l'inglese finché la lingua di Home Assistant non è disponibile."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · non ancora verificato, aiuto benvenuto"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" non è ancora verificato, ogni aiuto è benvenuto: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"come tradurre"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Dopo una modifica ogni schermo ha bisogno di un aggiornamento del firmware, una compilazione per schermo: con il suo pulsante Aggiorna, o con gli aggiornamenti notturni."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Formato orario"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatico, segue la lingua ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 ore"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 ore"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Formato numerico"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatico, segue la lingua ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Il tuo profilo Home Assistant: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Usa questi"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"L'editor segue la lingua del tuo profilo Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Salvato."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. Ogni schermo passa alla nuova lingua con il suo prossimo aggiornamento."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Una scheda a tutto schermo da un'automazione, su uno schermo o su tutti. La guida rapida contiene i nomi delle azioni, i campi, le icone e i colori, e un modulo per provarne uno."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Notifiche a schermo intero, da un'automazione"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Compila e installa il firmware degli schermi"}},intro:{t:0,b:{t:2,i:[{t:3,v:"La CLI di ESPHome integrata usa il tuo profilo (YAML con le chiavi) e i tuoi segreti. Scegli il profilo dello schermo, poi una porta USB (schermo collegato alla macchina di Home Assistant), "},{t:4,k:"ota"},{t:3,v:" con il nome host, oppure "},{t:4,k:"download"},{t:3,v:" per mettere il firmware sullo schermo dal tuo computer. "},{t:4,k:"check"},{t:3,v:" verifica soltanto, "},{t:4,k:"build"},{t:3,v:" compila, "},{t:4,k:"install"},{t:3,v:" mette il firmware sullo schermo. I tuoi riquadri restano come sono in ESP Screens. La prima compilazione richiede qualche minuto."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Scarica"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Verifica"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Solo compilazione"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Compila e installa"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Compila e scarica"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Manca la CLI di ESPHome. Aggiorna l'app alla versione 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Scegli il profilo giusto, poi una porta USB, un indirizzo IP o Scarica."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Profilo ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Installa su"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · nessuno schermo rilevato finora sulla macchina di Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Scarica · installa dal tuo computer"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Indirizzo IP o nome host"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Scarica "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Mettilo sullo schermo con "},{t:4,k:"esphome_web"},{t:3,v:" in Chrome o Edge: Connect, scegli la porta USB dello schermo, Install e seleziona questo file. Contiene la tua password Wi-Fi e le chiavi dello schermo: tienilo per te."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Collega e installa."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profilo salvato."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Un attimo…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Pronto da scaricare."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Fatto."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Non ha funzionato."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens crea il profilo dello schermo con chiavi uniche e compila il firmware. Collega lo schermo con un cavo USB dati alla macchina su cui gira Home Assistant, oppure scarica il firmware e mettilo sullo schermo dal tuo computer."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Quale schermo hai?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 pollici"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 pollici"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nome"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Schermo del soggiorno"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nome dispositivo"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"personalizza"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Ogni schermo ha il suo profilo con le sue chiavi. Quattro schermi? Ripeti questi passaggi quattro volte con un nome diverso."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Lettere minuscole, cifre e trattini. Un nome diverso per ogni schermo."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nome Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Password Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Da compilare una sola volta: ESP Screens lo salva nel secrets.yaml di ESPHome e gli schermi successivi lo usano automaticamente."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Nel tuo secrets.yaml di ESPHome mancano ancora i dati Wi-Fi. ESP Screens compila solo le righe mancanti."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Il Wi-Fi viene dal tuo secrets.yaml di ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Il secrets.yaml nella cartella di ESPHome non è YAML valido. Correggi prima il file; non verrà sovrascritto."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Installa tramite"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Più tardi · salva solo il profilo"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Collega lo schermo con un cavo USB dati alla macchina di Home Assistant; l'elenco si aggiorna da solo. Oppure scegli Scarica per usare il tuo computer."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Scarica il firmware e mettilo sullo schermo dal tuo computer, in Chrome o Edge. Dopo, gli aggiornamenti arrivano via Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Il profilo va nella cartella di ESPHome. Puoi installarlo più tardi da Firmware e USB, o da ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Più schermi collegati: scegli la porta di questo schermo."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Una sola volta via USB; dopo, tutto senza fili."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installa"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Salva profilo"}},busy:{t:0,b:{t:2,i:[{t:3,v:"È già in corso una compilazione o un'installazione ("},{t:4,k:"file"},{t:3,v:"). Attendi che finisca."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"In questa installazione manca la CLI di ESPHome; puoi solo salvare il profilo."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" è nella cartella di ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Scrittura del firmware su "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilazione del firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Il firmware per "},{t:4,k:"name"},{t:3,v:" è pronto"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Il firmware è su "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Compilazione non riuscita"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Installazione non riuscita"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Installalo più tardi da Firmware e USB: scegli questo profilo, poi la porta USB della macchina di Home Assistant, oppure Scarica per mettere il firmware sullo schermo dal tuo computer. Conserva la chiave API per l'associazione:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Non scollegare ancora il cavo USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Una prima compilazione richiede qualche minuto su un Raspberry Pi. Puoi lasciare questa pagina: l'installazione continua e la ritrovi in Nuovo schermo."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Una prima compilazione richiede qualche minuto su un Raspberry Pi. Puoi lasciare questa pagina: la compilazione continua e la ritrovi in Nuovo schermo."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Mettilo sullo schermo dal tuo computer, poi associa lo schermo a Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo si avvia e si collega al tuo Wi-Fi. Ora associalo a Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo si avvia e si collega al tuo Wi-Fi. Il CYD chiede prima una calibrazione del touch: tocca le croci. Ora associalo a Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Vedi il registro qui sotto."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" con un cavo USB dati."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Collega lo schermo al tuo computer"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" in Chrome o Edge, fai clic su Connect e scegli la porta USB dello schermo."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Apri "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" e seleziona "},{t:4,k:"file"},{t:3,v:". Lo schermo si riavvia e si collega al tuo Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" e seleziona "},{t:4,k:"file"},{t:3,v:". Lo schermo si riavvia e si collega al tuo Wi-Fi. Il CYD chiede prima una calibrazione del touch: tocca le croci."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fai clic su Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Il file contiene la tua password Wi-Fi e le chiavi dello schermo: tienilo per te."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Chiave API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Questo avviene fuori da ESP Screens. Home Assistant rileva "},{t:4,k:"name"},{t:3,v:" come dispositivo ESPHome; fai clic su Aggiungi. Non rilevato? Aggiungi ESPHome manualmente con l'indirizzo IP dello schermo."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Vai in Home Assistant → Impostazioni → Dispositivi e servizi."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" qui sopra quando Home Assistant chiede una chiave di cifratura."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Incolla la chiave API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" integrazione ESPHome → Configura → «Allow the device to perform Home Assistant actions». Senza questo, lo schermo vede tutto ma non controlla nulla."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Consenti le azioni di HA:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" In ESP Screens lo schermo compare nell'elenco a sinistra entro una trentina di secondi; fino ad allora è indicato lì come «non ancora in Home Assistant»."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Scegli i tuoi riquadri."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Registro ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Riprova"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Installa un altro schermo"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Ricomincia"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Fatto"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avvisi · guida rapida"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Una notifica a schermo intero, da un'automazione."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Ogni schermo ha l'azione "},{t:4,k:"action"},{t:3,v:". Mette una scheda sopra tutto, riattiva lo schermo e mantiene la retroilluminazione a luminosità normale finché qualcuno non tocca il pulsante o non scade il timeout. Home Assistant da solo non mostra spiegazioni né menu a tendina per le azioni ESPHome; qui trovi tutto quello che puoi compilare."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"La guida rapida si sta ancora caricando; un attimo."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"C'è qualcuno alla porta"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Porta 3, retro"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Arrivo"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Sezioni"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Prova"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"I tuoi schermi"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"In un'automazione"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Tutti gli schermi"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"I campi"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Icone"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Colori"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Comportamento"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Eventi"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Suggerimenti"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Invia subito un avviso, con gli stessi campi che invia un'automazione. Lo schermo mostra la scheda e, con il lampeggio attivo, fa lampeggiare la retroilluminazione."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Schermo"}},all:{t:0,b:{t:2,i:[{t:3,v:"Tutti gli schermi (pronti: "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · non pronto"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Titolo"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Sottotitolo"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icona"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Colore"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Testo del pulsante"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Timeout (secondi, 0 aspetta il pulsante)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Fai lampeggiare la retroilluminazione"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Quattro volte all'arrivo dell'avviso."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Invio…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Invia avviso"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Inviato a "},{t:4,k:"n"},{t:3,v:" schermo."}]},{t:2,i:[{t:3,v:"Inviato a "},{t:4,k:"n"},{t:3,v:" schermi."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Inviato a "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Inviato allo schermo."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 schermo saltato (offline o firmware troppo vecchio)."},{t:2,i:[{t:4,k:"n"},{t:3,v:" schermi saltati (offline o firmware troppo vecchio)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Campi lasciati vuoti: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Nessuno schermo ha potuto mostrarlo: verifica che uno schermo sia online con il firmware "},{t:4,k:"version"},{t:3,v:" o più recente."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Bianco (predefinito)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Ogni schermo ha la sua azione, con il nome del dispositivo. A partire dal firmware "},{t:4,k:"version"},{t:3,v:"; aggiorna uno schermo più vecchio con il suo pulsante Aggiorna in Schermi."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nessuno schermo associato finora. Installane uno da Nuovo schermo; l'azione compare appena Home Assistant vede lo schermo."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Aggiornamento necessario · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nome dispositivo sconosciuto · aggiorna lo schermo"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Mostra avviso"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Chiudi avviso"}}},howto:{add:{t:0,b:{t:2,i:[{t:4,k:"add"},{t:3,v:" e cerca "},{t:4,k:"esphome"},{t:3,v:". Scegli l'azione del tuo schermo: Home Assistant la chiama «Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"»."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi azione"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nome dispositivo"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant li chiede tutti e sette; lascia vuoto ciò che non usi ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", disattivo)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Compila i campi."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Preferisci lo YAML? Scegli "},{t:4,k:"edit"},{t:3,v:" sull'azione e incolla l'esempio qui sotto."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Esempio per"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"uno schermo (non ancora associato)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Modifica in YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copia YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Tutti gli schermi insieme"}},text:{t:0,b:{t:2,i:[{t:3,v:"Attiva l'evento "},{t:4,k:"show"},{t:3,v:" con gli stessi campi ed ESP Screens inoltra l'avviso a ogni schermo online, compresi quelli che aggiungerai in seguito. "},{t:4,k:"dismiss"},{t:3,v:" lo rimuove ovunque. In un'automazione, aggiungi l'azione "},{t:4,k:"event"},{t:3,v:" o incolla l'esempio in "},{t:4,k:"edit"},{t:3,v:". Tralascia i campi che non usi. Perché funzioni, ESP Screens deve essere in esecuzione."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Attiva manualmente evento"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Il testo è libero; il limite è in byte e una lettera accentata conta per due. Ciò che non ci sta finisce con i puntini di sospensione (titolo) o viene tagliato (sottotitolo)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Campo"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Tipo"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Cosa fa"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Esempio"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limite"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"testo"}},int:{t:0,b:{t:2,i:[{t:3}],s:"numero"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"attivo / disattivo"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entità"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" byte"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"da 0 a 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Inserisci il nome in "},{t:4,k:"field"},{t:3,v:", per esempio "},{t:4,k:"example"},{t:3,v:". Funzionano anche "},{t:4,k:"mdi"},{t:3,v:" e il codice esadecimale ("},{t:4,k:"hex"},{t:3,v:"). Nel firmware ci sono solo queste icone; qualsiasi altro nome mostra il triangolo di avvertimento. Tocca un'icona per copiarne il nome."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Utili per le notifiche"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Cerca un'icona"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca per nome o descrizione…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Disponibili anche: icone di controllo e meteo"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copia "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Nessuna icona per «"},{t:4,k:"query"},{t:3,v:"». I nomi sconosciuti mostrano il triangolo di avvertimento ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Inserisci il nome in "},{t:4,k:"field"},{t:3,v:". Sono le tonalità pastello dei riquadri, con testo scuro. Un nome vuoto o sconosciuto dà la scheda bianca. Tocca per copiare."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Un avviso riattiva subito uno schermo attenuato o spento e compare sopra ogni pagina, ogni scheda luce aperta e il livello di standby."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Riattiva lo schermo."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Finché la scheda è visibile, la retroilluminazione resta a luminosità normale. Standby e ore notturne aspettano. Dopo il pulsante, riparte il normale tempo di standby."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Acceso fino al pulsante."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" aspetta il pulsante, per tutto il tempo necessario. Con "},{t:4,k:"minute"},{t:3,v:" la scheda sparisce dopo un minuto, ma il pulsante la chiude prima."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Timeout."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" fa lampeggiare la retroilluminazione quattro volte all'arrivo dell'avviso (circa un secondo) e poi lascia lo schermo acceso."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Lampeggio."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Un nuovo avviso sostituisce quello attuale; gli avvisi non si accumulano. L'avviso sostituito si segnala come "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Sostituzione."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" rimuove la scheda, per esempio se la porta è già aperta. Senza un avviso, quell'azione non fa nulla."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Chiusura a distanza."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" non fa nulla; solo il pulsante la chiude. Così un tocco per riattivare lo schermo non chiude mai l'avviso per sbaglio."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Toccare accanto alla scheda"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Ogni volta che un avviso termina, parte l'evento "},{t:4,k:"event"},{t:3,v:" con "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (il nome del dispositivo) e il "},{t:4,k:"device_id"},{t:3,v:" che aggiunge Home Assistant. Visibile in Impostazioni → Strumenti → Eventi."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Quando"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Aspettare che qualcuno prema il pulsante"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Usa un "},{t:4,k:"bold"},{t:3,v:": arancione per la porta, rosso per fumo o acqua, verde per «fatto». Il testo resta sempre scuro e leggibile."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"colore per ogni tipo di notifica"}},short:{t:0,b:{t:2,i:[{t:3,v:"Tieni il titolo "},{t:4,k:"bold"},{t:3,v:": uno schermo mostra circa venti caratteri su una riga e chiude un titolo più lungo con i puntini di sospensione. Metti i dettagli nel sottotitolo."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"breve"}},button:{t:0,b:{t:2,i:[{t:3,v:"Un "},{t:4,k:"bold"},{t:3,v:" trasforma la notifica in una domanda: «Arrivo», «Visto», «Spegni». L'evento poi ti dice chi ha risposto."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"testo del pulsante personalizzato"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Per un avviso che si risolve da solo (la porta si apre, il bucato viene ritirato), chiudilo nella stessa automazione con "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Tutti gli schermi? Attiva "},{t:4,k:"event"},{t:3,v:" una sola volta (vedi Tutti gli schermi insieme). Gli schermi restano indipendenti e ognuno risponde con il proprio "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Preferisci "},{t:4,k:"bold"},{t:3,v:" l'automazione? Installa la skill di ESP Screens in Impostazioni → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"chiedere a Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Campanello: mostra l’avviso e aspetta che qualcuno prema il pulsante."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Qualcuno sta arrivando alla porta."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avanzate · personalizzazione locale"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizzato"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML personalizzato · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Questo piccolo file è tuo. Viene caricato dopo il pacchetto condiviso degli schermi e resta al suo posto quando ESP Screens si aggiorna. Cambia qui i dettagli specifici dell'hardware, come il modello del display."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Cosa si può cambiare senza rischi?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Display, touchscreen, substitutions, pin e altri dettagli del dispositivo. Nome, Wi-Fi, API, OTA e collegamenti ai package restano gestiti automaticamente."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Attivo"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Pronto da collegare"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizzato locale"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Usa l'esempio"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Cancella"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 carattere"},{t:2,i:[{t:4,k:"n"},{t:3,v:" caratteri"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 riga"},{t:2,i:[{t:4,k:"n"},{t:3,v:" righe"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Salva e verifica"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Salva YAML personalizzato"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Non è stato trovato nessun profilo ESPHome per questo schermo."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Le modifiche fatte qui valgono dalla prossima compilazione."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Salva una volta per collegare questo file al profilo."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Verifica e salvataggio…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. Lo YAML personalizzato viene mantenuto negli aggiornamenti del firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizzato salvato."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. ESPHome sta verificando il profilo completo…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome sta verificando il profilo…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome sta verificando il profilo… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Il profilo completo è valido. Puoi compilare e installare senza rischi."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome ha rifiutato il profilo completo. Vedi Firmware e USB per il registro completo."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Sostituire il testo attuale con l'esempio?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Esempio caricato. Salvalo quando vuoi."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Cancellare lo YAML personalizzato locale?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Lo YAML personalizzato sarà vuoto dopo il salvataggio."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Casa"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Sconosciuto"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Non disponibile"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Riscaldamento"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Freddo"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Caldo/Freddo"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatico"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Deumidificazione"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Ventilazione"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Riscaldamento"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Raffreddando"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inattivo"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"In deumidificazione"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatore"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Preriscaldamento"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Defrosting"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"In apertura"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"In chiusura"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"In esecuzione"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"In pausa"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inattivo"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"In attesa"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"In casa"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Fuori casa"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Sopra l'orizzonte"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Sotto l'orizzonte"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Alla base"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"In pulizia"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"In pausa"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Ritornando alla base"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inattivo"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Soleggiato"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Sereno, notte"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Nuvoloso"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Parzialmente nuvoloso"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Piovoso"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Rovescio"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Nevoso"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Nevoso, piovoso"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Nebbia"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Grandine"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Temporale"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Temporale, piovoso"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Ventoso"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Eccezionale"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Basso/a"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"In carica"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Non in carica"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Freddo"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Connesso"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Disconnesso"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Caldo"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Luce rilevata"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna luce"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Sbloccato/a"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Bloccato/a"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Bagnato"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Asciutto"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"In movimento"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Non si muove"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Collegato"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Scollegato"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"In casa"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Fuori casa"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problema"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"In esecuzione"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Non in esecuzione"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Non Sicuro"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Sicuro"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevata manomissione"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornamento disponibile"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornato"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Attiva"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Esegui"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Premi"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatico"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Basso/a"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Medio/a"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Alto/a"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Mezzo"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Focalizzato"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffuso"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Superiore"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Entrambi"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Verticale"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Orizzontale"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Proprio ora"}},minutes_ago:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min fa"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 ora fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" ore fa"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Ieri"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 giorno fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" giorni fa"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 settimana fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" settimane fa"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 mese fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" mesi fa"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 anno fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" anni fa"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Tra "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Tra 1 ora"},{t:2,i:[{t:3,v:"Tra "},{t:4,k:"n"},{t:3,v:" ore"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Domani"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Tra 1 giorno"},{t:2,i:[{t:3,v:"Tra "},{t:4,k:"n"},{t:3,v:" giorni"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"domenica"}},{t:0,b:{t:2,i:[{t:3}],s:"lunedì"}},{t:0,b:{t:2,i:[{t:3}],s:"martedì"}},{t:0,b:{t:2,i:[{t:3}],s:"mercoledì"}},{t:0,b:{t:2,i:[{t:3}],s:"giovedì"}},{t:0,b:{t:2,i:[{t:3}],s:"venerdì"}},{t:0,b:{t:2,i:[{t:3}],s:"sabato"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"dom"}},{t:0,b:{t:2,i:[{t:3}],s:"lun"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"mer"}},{t:0,b:{t:2,i:[{t:3}],s:"gio"}},{t:0,b:{t:2,i:[{t:3}],s:"ven"}},{t:0,b:{t:2,i:[{t:3}],s:"sab"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"lu"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"me"}},{t:0,b:{t:2,i:[{t:3}],s:"gi"}},{t:0,b:{t:2,i:[{t:3}],s:"ve"}},{t:0,b:{t:2,i:[{t:3}],s:"sa"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"gennaio"}},{t:0,b:{t:2,i:[{t:3}],s:"febbraio"}},{t:0,b:{t:2,i:[{t:3}],s:"marzo"}},{t:0,b:{t:2,i:[{t:3}],s:"aprile"}},{t:0,b:{t:2,i:[{t:3}],s:"maggio"}},{t:0,b:{t:2,i:[{t:3}],s:"giugno"}},{t:0,b:{t:2,i:[{t:3}],s:"luglio"}},{t:0,b:{t:2,i:[{t:3}],s:"agosto"}},{t:0,b:{t:2,i:[{t:3}],s:"settembre"}},{t:0,b:{t:2,i:[{t:3}],s:"ottobre"}},{t:0,b:{t:2,i:[{t:3}],s:"novembre"}},{t:0,b:{t:2,i:[{t:3}],s:"dicembre"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"gen"}},{t:0,b:{t:2,i:[{t:3}],s:"feb"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"apr"}},{t:0,b:{t:2,i:[{t:3}],s:"mag"}},{t:0,b:{t:2,i:[{t:3}],s:"giu"}},{t:0,b:{t:2,i:[{t:3}],s:"lug"}},{t:0,b:{t:2,i:[{t:3}],s:"ago"}},{t:0,b:{t:2,i:[{t:3}],s:"set"}},{t:0,b:{t:2,i:[{t:3}],s:"ott"}},{t:0,b:{t:2,i:[{t:3}],s:"nov"}},{t:0,b:{t:2,i:[{t:3}],s:"dic"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:"."}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"2"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Pagina "},{t:4,k:"n"}]}}}}};export{t as default}; +const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Annulla"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"sconosciuto"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Modifiche non salvate"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Annulla"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Apri Dispositivi e servizi"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Salva e invia"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Salvataggio…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Leggi i dati attuali"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 risultato. Continua a scrivere per restringere l'elenco."},{t:2,i:[{t:4,k:"n"},{t:3,v:" risultati. Continua a scrivere per restringere l'elenco."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Chiudi"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Rimuovi"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Cambia"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Caricamento…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Indietro"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copia"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nuovo schermo"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware e USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Avvisi"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Collega e installa"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Non ha funzionato. Ricarica la pagina e riprova."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Chiave API copiata."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"La chiave API è selezionata. Copiala con Ctrl+C o Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON della disposizione copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il JSON della disposizione è selezionato. Copialo con Ctrl+C o Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome dell'azione copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il nome dell'azione è selezionato. Copialo con Ctrl+C o Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Lo YAML è selezionato. Copialo con Ctrl+C o Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome dell'icona copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il nome dell'icona è selezionato. Copialo con Ctrl+C o Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Colore vuoto copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il colore vuoto è selezionato. Copialo con Ctrl+C o Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome del colore copiato."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Il nome del colore è selezionato. Copialo con Ctrl+C o Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Pagina di gestione non raggiungibile · nuovo tentativo…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant connesso"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Riconnessione a Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Schermi"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Altro"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Ricarica"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornamento"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"In coda per l'aggiornamento"}},available:{t:0,b:{t:2,i:[{t:3,v:"Aggiornamento "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Nessun profilo ESPHome trovato con questo nome dispositivo."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Novità"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Registro completo"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"L'indirizzo IP, una sola volta; poi il nuovo firmware lo comunica da solo."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Indirizzo IP, es. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Indirizzo IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Avvia"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Installato, ma non ancora in Home Assistant. Aggiungi il dispositivo ESPHome rilevato in Impostazioni → Dispositivi e servizi, incolla lì la chiave API e attiva «Allow the device to perform Home Assistant actions» in Configura."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware scaricato, non ancora in Home Assistant. Mettilo sullo schermo con ESPHome Web, poi aggiungi il dispositivo ESPHome rilevato in Impostazioni → Dispositivi e servizi, incolla lì la chiave API e consenti le azioni di Home Assistant in Configura."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Non ancora in Home Assistant. Firmware già installato? Aggiungi il dispositivo ESPHome in Impostazioni → Dispositivi e servizi, poi consenti le azioni di Home Assistant in Configura. Non ancora installato? Firmware e USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copia chiave API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Schermi"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Azioni"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi a questo schermo"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Guida rapida e avviso di prova"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornamenti, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Niente da salvare"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifica questo schermo"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Fa lampeggiare la retroilluminazione e mostra una scheda"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Richiede un firmware più recente"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Esporta disposizione"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Scarica e copia come JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Cerca schermi, entità, azioni…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Nessun risultato. Scrivi parte del nome di uno schermo, di un'entità o di un'azione."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Scegli uno schermo"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Scegli uno dei tuoi schermi a sinistra per modificarne i riquadri, la barra superiore e le impostazioni."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Inizia con uno schermo"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Collega un CYD o un Guition via USB alla macchina di Home Assistant. Profilo, firmware e prima installazione in un colpo solo."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Installa un nuovo schermo"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Hai modifiche non salvate. Aprire comunque un altro schermo?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Sostituire la disposizione non salvata con una copia di quella dell'altro schermo?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Sostituire la disposizione non salvata con quella importata?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. Il tuo schermo si sta aggiornando."}},other:{t:0,b:{t:2,i:[{t:3,v:"Salvato. "},{t:4,k:"name"},{t:3,v:" si sta aggiornando."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. Lo schermo si sta aggiornando."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. La tua ultima modifica non è ancora stata inviata: premi di nuovo Salva e invia."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" lampeggia e mostra una scheda per qualche secondo."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · modifiche salvate"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Disposizione"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni schermo"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Salvato · inviato allo schermo"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Tutto salvato"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Altro"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identifica"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"fa lampeggiare lo schermo"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Richiede il firmware 0.2.31 o più recente"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"da Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copia disposizione da…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" schermo"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" schermi"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"nessun altro schermo"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" riquadro"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" riquadri"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Esporta disposizione"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importa disposizione…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizzato"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"avanzato"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Nessun profilo ESPHome trovato per questo schermo"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Riquadro rimosso: "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Non c'è spazio per questo riquadro a pagina "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna pagina è libera per un riquadro a pagina intera. Libera prima una pagina."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Questo schermo ha già un riquadro che porta a pagina "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Disposizione di "},{t:4,k:"name"},{t:3,v:" copiata. Salva e invia quando ti sembra giusta."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Disposizione di "},{t:4,k:"name"},{t:3,v:" copiata. Riquadri compatibili con il firmware di questo schermo: "},{t:4,k:"kept"},{t:3,v:" su "},{t:4,k:"total"},{t:3,v:". Salva e invia quando ti sembra giusta."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Disposizione importata. Salva e invia quando ti sembra giusta."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Disposizione importata. Riquadri compatibili con il firmware di questo schermo: "},{t:4,k:"kept"},{t:3,v:" su "},{t:4,k:"total"},{t:3,v:". Salva e invia quando ti sembra giusta."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Questo non è JSON. Esporta prima una disposizione, oppure incollane una da un altro ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Nessun riquadro in questo file. Serve una disposizione esportata da ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" pagina · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" riquadri"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pagine · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" riquadri"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi la tua prima luce, scena o dispositivo dalla libreria."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Tocca la barra superiore o un riquadro per cambiarne le impostazioni. Trascina per spostare; rilascia sulla pagina successiva per crearne una nuova."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Gli spazi vuoti e le posizioni fisse funzionano a partire dal firmware 0.2.26. Fino a quell'aggiornamento, questo schermo (firmware "},{t:4,k:"firmware"},{t:3,v:") sposta i riquadri verso il primo spazio libero."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Disposizione dello schermo"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Aggiungi pagina"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Al massimo 1 pagina"},{t:2,i:[{t:3,v:"Al massimo "},{t:4,k:"n"},{t:3,v:" pagine"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Pagina "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Rimuovi pagina"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Le pagine successive scalano di un posto"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Modifica barra superiore"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Spazio vuoto. Fai clic per aggiungere un riquadro qui, o trascinane uno."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Spazio vuoto "},{t:4,k:"slot"},{t:3,v:" a pagina "},{t:4,k:"page"},{t:3,v:": aggiungi qui il prossimo riquadro"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Il prossimo riquadro va qui"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Vuoto"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Libreria"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entità"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entità"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca per nome, dispositivo o area…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi un'entità"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Tutti"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Luci"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruttori"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Stato"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Azioni"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatori"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Coperture"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scene"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirapolvere"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensori"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Meteo"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valori"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selezioni"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Persone"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Schermo"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Area"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Tutte le aree"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Nascondi quelle già inserite"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Nascondi ciò che è già su questo schermo"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Tutto ciò che è qui è già su questo schermo."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna entità trovata. Prova un altro nome, un'altra area o un altro filtro."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Questo schermo può contenere 1 riquadro."},{t:2,i:[{t:3,v:"Questo schermo può contenere "},{t:4,k:"n"},{t:3,v:" riquadri."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Questo schermo può contenere 1 riquadro; aggiorna il suo firmware per averne 48."},{t:2,i:[{t:3,v:"Questo schermo può contenere "},{t:4,k:"n"},{t:3,v:" riquadri; aggiorna il suo firmware per averne 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Trascina su una pagina, o tocca + per aggiungere al primo spazio libero. ⌘K cerca ovunque."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Luce"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirapolvere"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatore"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Copertura"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensore"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Stato"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruttore"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Interruttore"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scena"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Meteo"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valore"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Valore"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selezione"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Selezione"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Azione"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Azione"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Schermo"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sole"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Persona"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Telecamera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Immagine"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entità"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"valore grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"previsioni meteo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"grafico"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"orologio digitale"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"orologio analogico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"percorso del sole"}},live:{t:0,b:{t:2,i:[{t:3}],s:"immagine dal vivo"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"copertina"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normale"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"doppia"}},full:{t:0,b:{t:2,i:[{t:3}],s:"pagina intera"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nome sullo schermo"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatica (da Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatica (predefinita)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo mostra l'icona scelta a partire dal firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Porta alla pagina"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (vuota)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"I riquadri di navigazione richiedono il firmware 0.2.62: premi prima Aggiorna per questo schermo."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Questo schermo non ha la pagina "},{t:4,k:"page"},{t:3,v:", quindi un tocco apre la sua ultima pagina. Scegli un'altra pagina."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Un tocco sul riquadro apre quella pagina."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Visualizzazione"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Orologio digitale"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Orologio analogico"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nome e stato"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Valore grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Previsioni meteo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Grafico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Percorso del sole"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Immagine dal vivo"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Una piccola immagine della telecamera al posto dell'icona, aggiornata al ritmo qui sotto finché la pagina è sullo schermo. Un tocco la apre ancora a schermo intero."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Un'immagine dal vivo richiede il firmware 0.2.77 o più recente: premi Aggiorna sullo schermo dopo il salvataggio."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Copertina"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"La copertina di ciò che suona al posto dell'icona, come nel riquadro di Home Assistant; un lettore senza immagine mantiene la sua icona. Un tocco apre ancora la scheda."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"La copertina sul riquadro richiede il firmware 0.2.78 o più recente: premi Aggiorna sullo schermo dopo il salvataggio."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non ha valori numerici per questa entità, quindi il grafico resta vuoto. Scegli un'altra visualizzazione."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Questo servizio meteo non ha previsioni giornaliere in Home Assistant. Scegli un'altra visualizzazione."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Ogni "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Dimensione"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Larghezza doppia"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Pagina intera"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Pagina intera: un grande pulsante nel colore del riquadro; in basso trovano posto un cursore, i comandi o un grafico."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Un riquadro a pagina intera richiede il firmware 0.2.62: premi prima Aggiorna per questo schermo."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pagina"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nuova pagina"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Controllo diretto sul riquadro"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non offre questo controllo per questa entità, quindi sullo schermo resta vuoto. Scegline un altro."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"In basso nel riquadro a pagina intera; un tocco altrove funziona come impostato qui sotto."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"A destra del riquadro a larghezza doppia, come le righe in Home Assistant. Un tocco sul nome funziona come impostato qui sotto."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo mostra il controllo diretto a partire dal firmware 0.2.19; fino ad allora il riquadro resta com'era."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Al tocco"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatico"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Apri i controlli"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Solo visualizzazione"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Accendi / spegni"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Esegui azione"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non può accendere e spegnere questa entità, quindi un tocco non fa nulla. Scegli un'altra opzione."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo accende e spegne questa entità a partire dal firmware 0.2.58: premi Aggiorna per questo schermo. Fino ad allora un tocco apre la sua scheda."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Tieni premuto il riquadro per aprire la sua scheda."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Piccolo cursore sul riquadro"}},no:{t:0,b:{t:2,i:[{t:3}],s:"No"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Sì, controllo diretto"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non ha nulla che un cursore possa regolare per questa entità. Scegli No."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Storico"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ora"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ore"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Sfondo pastello"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Sfondo: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", spazio "},{t:4,k:"slot"},{t:3,v:" a pagina "},{t:4,k:"page"},{t:3,v:". Enter: configura, tasti freccia: sposta"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Rimuovi riquadro"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Rimuovi "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Azione"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Chiedo a Home Assistant quali azioni ha questa entità…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non risponde al momento. Riprova tra poco."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Scegli un'azione"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca, per esempio toggle, position o play"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Cerca un'azione"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna azione trovata."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant non offre più questa azione per questa entità, quindi un tocco non fa nulla. Scegline un'altra."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (facoltativo)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Non impostato"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Attivo"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Disattivo"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant richiede: "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo esegue un'azione a partire dal firmware 0.2.58: premi Aggiorna per questo schermo. Fino ad allora un tocco funziona come Automatico."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icona"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna icona"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca, per esempio lampada, musica o porta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Cerca un'icona"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna icona, solo testo"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icona: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna icona trovata."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Dati attuali"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Connessione, stato e proprietà supportate"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Lettura…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Recupero dello stato attuale da HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Stato: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Piccolo cursore: "},{t:4,k:"slider"},{t:3,v:" · Visualizzazione: "},{t:4,k:"display"},{t:3,v:" · Dimensione: "},{t:4,k:"size"},{t:3,v:" · Controllo: "},{t:4,k:"control"},{t:3,v:" · Sfondo: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"sì"}},no:{t:0,b:{t:2,i:[{t:3}],s:"no"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"nessuno"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Predefinito"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Leggi di nuovo"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Rimosso dalla barra superiore: "},{t:4,k:"name"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"La barra superiore ha spazio per 1 elemento."},{t:2,i:[{t:3,v:"La barra superiore ha spazio per "},{t:4,k:"n"},{t:3,v:" elementi."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"È già nella barra superiore."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Barra superiore"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Barra superiore: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Dallo schermo stesso, funziona anche senza Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" di "},{t:4,k:"n"},{t:3,v:" elemento"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" di "},{t:4,k:"n"},{t:3,v:" elementi"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Sinistra: nome"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Per esempio: Soggiorno"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Destra: ora, sensori o orologio"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", spazio "},{t:4,k:"slot"},{t:3,v:". Enter: configura, frecce: sposta"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Rimuovi "},{t:4,k:"name"},{t:3,v:" dalla barra superiore"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Massimo 1 elemento"},{t:2,i:[{t:3,v:"Massimo "},{t:4,k:"n"},{t:3,v:" elementi"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi l'ora, la data, l'orologio analogico o un'entità"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Aggiungi ora, data o un'entità"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Non tutto sta accanto al nome: lo schermo tralascia gli elementi tratteggiati. Rimuovine uno o scegli un nome più corto."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Trascina per riordinare; tocca un elemento per configurarlo."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensori, data e orologio analogico compaiono a partire dal firmware "},{t:4,k:"version"},{t:3,v:"; fino a quell'aggiornamento questo schermo mostra il nome e, se l'ora è nella barra, l'orologio."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Nascosto: non attivo al momento"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Non sta accanto al nome"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Quadrante"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Nascosto al momento: non attivo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Al momento non sta accanto al nome"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Come appare sullo schermo"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Piccolo quadrante con l'ora"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Cosa mostrare"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Ultima modifica» continua a contare sullo schermo stesso: «Proprio ora», «5 min fa», «Ieri»."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatica (come Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mostra"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Solo quando attivo» nasconde l'elemento finché è spento, chiuso, fuori casa o a 0. Utile per una porta aperta, una lavatrice in funzione o per sapere chi è a casa."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Orologio a 24 ore · si cambia in "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Orologio a 12 ore · si cambia in "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Impostazioni → Lingua e regione"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Oggi: "},{t:4,k:"date"},{t:3,v:". La data segue l'orologio dello schermo stesso."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Su"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Giù"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi alla barra superiore"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" di "},{t:4,k:"n"},{t:3,v:" spazio usato"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" di "},{t:4,k:"n"},{t:3,v:" spazi usati"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Dallo schermo stesso"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Già aggiunto"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Suggerimenti da Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Un'entità"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca per nome, area o entità, es. temperatura o porta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Cerca un'entità per la barra superiore"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna entità trovata."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosità"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Notte"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Schermo"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosità"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Modalità scura"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Standby automatico"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Standby dopo"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosità standby"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Modalità notte"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Inizio"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Fine"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Luminosità notte"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Torna a pagina 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Dopo"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Anche in standby"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Scorri tra le pagine"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Pulsanti pagina"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotazione"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Sto ancora salvando le impostazioni dell'altro schermo. Riprova tra poco."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"I pulsanti pagina e lo scorrimento sono disattivati, quindi solo i riquadri «Vai alla pagina» cambiano pagina."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"pagina "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"pagine "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadro «Vai alla pagina», che porta a "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadri «Vai alla pagina», che portano a "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadro «Vai alla pagina», che porta a "},{t:4,k:"targets"},{t:3,v:", ma nessuno a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerla."}]},{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadri «Vai alla pagina», che portano a "},{t:4,k:"targets"},{t:3,v:", ma nessuno a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerla."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadro «Vai alla pagina», che porta a "},{t:4,k:"targets"},{t:3,v:", ma nessuno a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerle."}]},{t:2,i:[{t:3,v:"Hai "},{t:4,k:"n"},{t:3,v:" riquadri «Vai alla pagina», che portano a "},{t:4,k:"targets"},{t:3,v:", ma nessuno a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerle."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Non hai riquadri «Vai alla pagina»."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Non hai riquadri «Vai alla pagina» che portano a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerla."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Non hai riquadri «Vai alla pagina» che portano a "},{t:4,k:"missing"},{t:3,v:", quindi non puoi raggiungerle."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"I riquadri che portano a "},{t:4,k:"pages"},{t:3,v:" sono solo su pagine che non puoi raggiungere."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Da "},{t:4,k:"pages"},{t:3,v:" nessun riquadro riporta a pagina 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Questo schermo è offline. Le sue impostazioni si potranno cambiare quando torna online."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Le modifiche si applicano subito sullo schermo, e quelle fatte sullo schermo compaiono qui."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Le modifiche si applicano subito. A partire dal firmware 0.2.49 lo schermo le conserva da solo."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Questa entità è disattivata in Home Assistant, oppure lo schermo si sta riavviando."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": diminuisci"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": aumenta"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Avvio dell'aggiornamento…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilazione del firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Scrittura del firmware via Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Compilazione e installazione…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"In attesa che lo schermo torni online…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Verifica della stabilità…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Nuova lingua: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Gli schermi ora si aggiorneranno automaticamente di notte."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Gli aggiornamenti automatici sono disattivati."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornamenti del firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Aggiornamento al firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Nessuno schermo associato finora. I nuovi schermi ricevono il firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Il firmware "},{t:4,k:"version"},{t:3,v:" è disponibile per "},{t:4,k:"n"},{t:3,v:" schermo."}]},{t:2,i:[{t:3,v:"Il firmware "},{t:4,k:"version"},{t:3,v:" è disponibile per "},{t:4,k:"n"},{t:3,v:" schermi."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Tutti gli schermi hanno il firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Aggiorna 1 schermo"},{t:2,i:[{t:3,v:"Aggiorna tutti i "},{t:4,k:"n"},{t:3,v:" schermi"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Novità del firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna automaticamente ogni notte"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Tra le 03:00 e le 06:00, uno schermo alla volta. Si ferma in caso di errore e lo segnala in Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Skill installata. Claude Code la rileva subito."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Skill installata. Riavvia Claude Code una volta perché trovi la nuova cartella delle skill."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Insegna ESP Screens a Claude, poi chiedi: «Mostra un avviso su tutti i miei schermi quando la cassetta della posta è piena». Claude conosce gli eventi degli avvisi, ogni campo, colore e icona."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installa per Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Installa di nuovo"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Aggiorna la skill"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Non installata"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Installata"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Installata · è pronta una versione più recente"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Per Claude Code in Home Assistant. Scrive un file in "},{t:4,k:"path"},{t:3,v:"; installando di nuovo lo sostituisci."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Scarica per claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Carica lo zip in Claude, in Personalizza → Skill."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tutto ciò che riguarda i tuoi schermi."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← I miei schermi"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Schermi"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi uno schermo, oppure compila e reinstalla il firmware di uno che hai già."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Compila e installa via USB o Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Lingua e regione"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Lingua degli schermi"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Lingua di Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Lingua di Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Gli schermi usano l'inglese finché la lingua di Home Assistant non è disponibile."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · non ancora verificato, aiuto benvenuto"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" non è ancora verificato, ogni aiuto è benvenuto: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"come tradurre"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Dopo una modifica ogni schermo ha bisogno di un aggiornamento del firmware, una compilazione per schermo: con il suo pulsante Aggiorna, o con gli aggiornamenti notturni."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Formato orario"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatico, segue la lingua ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 ore"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 ore"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Formato numerico"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatico, segue la lingua ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Il tuo profilo Home Assistant: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Usa questi"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"L'editor segue la lingua del tuo profilo Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Salvato."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. Ogni schermo passa alla nuova lingua con il suo prossimo aggiornamento."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Una scheda a tutto schermo da un'automazione, su uno schermo o su tutti. La guida rapida contiene i nomi delle azioni, i campi, le icone e i colori, e un modulo per provarne uno."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Notifiche a schermo intero, da un'automazione"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Compila e installa il firmware degli schermi"}},intro:{t:0,b:{t:2,i:[{t:3,v:"La CLI di ESPHome integrata usa il tuo profilo (YAML con le chiavi) e i tuoi segreti. Scegli il profilo dello schermo, poi una porta USB (schermo collegato alla macchina di Home Assistant), "},{t:4,k:"ota"},{t:3,v:" con il nome host, oppure "},{t:4,k:"download"},{t:3,v:" per mettere il firmware sullo schermo dal tuo computer. "},{t:4,k:"check"},{t:3,v:" verifica soltanto, "},{t:4,k:"build"},{t:3,v:" compila, "},{t:4,k:"install"},{t:3,v:" mette il firmware sullo schermo. I tuoi riquadri restano come sono in ESP Screens. La prima compilazione richiede qualche minuto."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Scarica"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Verifica"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Solo compilazione"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Compila e installa"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Compila e scarica"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Manca la CLI di ESPHome. Aggiorna l'app alla versione 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Scegli il profilo giusto, poi una porta USB, un indirizzo IP o Scarica."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Profilo ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Installa su"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · nessuno schermo rilevato finora sulla macchina di Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Scarica · installa dal tuo computer"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Indirizzo IP o nome host"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Scarica "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Mettilo sullo schermo con "},{t:4,k:"esphome_web"},{t:3,v:" in Chrome o Edge: Connect, scegli la porta USB dello schermo, Install e seleziona questo file. Contiene la tua password Wi-Fi e le chiavi dello schermo: tienilo per te."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Collega e installa."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profilo salvato."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Un attimo…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Pronto da scaricare."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Fatto."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Non ha funzionato."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens crea il profilo dello schermo con chiavi uniche e compila il firmware. Collega lo schermo con un cavo USB dati alla macchina su cui gira Home Assistant, oppure scarica il firmware e mettilo sullo schermo dal tuo computer."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Quale schermo hai?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 pollici"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 pollici"}},board_elecrow:{t:0,b:{t:2,i:[{t:3}],s:"Elecrow CrowPanel · 7 pollici"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nome"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Schermo del soggiorno"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nome dispositivo"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"personalizza"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Ogni schermo ha il suo profilo con le sue chiavi. Quattro schermi? Ripeti questi passaggi quattro volte con un nome diverso."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Lettere minuscole, cifre e trattini. Un nome diverso per ogni schermo."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nome Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Password Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Da compilare una sola volta: ESP Screens lo salva nel secrets.yaml di ESPHome e gli schermi successivi lo usano automaticamente."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Nel tuo secrets.yaml di ESPHome mancano ancora i dati Wi-Fi. ESP Screens compila solo le righe mancanti."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Il Wi-Fi viene dal tuo secrets.yaml di ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Il secrets.yaml nella cartella di ESPHome non è YAML valido. Correggi prima il file; non verrà sovrascritto."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Installa tramite"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Più tardi · salva solo il profilo"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Collega lo schermo con un cavo USB dati alla macchina di Home Assistant; l'elenco si aggiorna da solo. Oppure scegli Scarica per usare il tuo computer."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Scarica il firmware e mettilo sullo schermo dal tuo computer, in Chrome o Edge. Dopo, gli aggiornamenti arrivano via Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Il profilo va nella cartella di ESPHome. Puoi installarlo più tardi da Firmware e USB, o da ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Più schermi collegati: scegli la porta di questo schermo."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Una sola volta via USB; dopo, tutto senza fili."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installa"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Salva profilo"}},busy:{t:0,b:{t:2,i:[{t:3,v:"È già in corso una compilazione o un'installazione ("},{t:4,k:"file"},{t:3,v:"). Attendi che finisca."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"In questa installazione manca la CLI di ESPHome; puoi solo salvare il profilo."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" è nella cartella di ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Scrittura del firmware su "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Compilazione del firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Il firmware per "},{t:4,k:"name"},{t:3,v:" è pronto"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Il firmware è su "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Compilazione non riuscita"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Installazione non riuscita"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Installalo più tardi da Firmware e USB: scegli questo profilo, poi la porta USB della macchina di Home Assistant, oppure Scarica per mettere il firmware sullo schermo dal tuo computer. Conserva la chiave API per l'associazione:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Non scollegare ancora il cavo USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Una prima compilazione richiede qualche minuto su un Raspberry Pi. Puoi lasciare questa pagina: l'installazione continua e la ritrovi in Nuovo schermo."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Una prima compilazione richiede qualche minuto su un Raspberry Pi. Puoi lasciare questa pagina: la compilazione continua e la ritrovi in Nuovo schermo."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Mettilo sullo schermo dal tuo computer, poi associa lo schermo a Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo si avvia e si collega al tuo Wi-Fi. Ora associalo a Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"Lo schermo si avvia e si collega al tuo Wi-Fi. Il CYD chiede prima una calibrazione del touch: tocca le croci. Ora associalo a Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Vedi il registro qui sotto."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" con un cavo USB dati."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Collega lo schermo al tuo computer"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" in Chrome o Edge, fai clic su Connect e scegli la porta USB dello schermo."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Apri "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" e seleziona "},{t:4,k:"file"},{t:3,v:". Lo schermo si riavvia e si collega al tuo Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" e seleziona "},{t:4,k:"file"},{t:3,v:". Lo schermo si riavvia e si collega al tuo Wi-Fi. Il CYD chiede prima una calibrazione del touch: tocca le croci."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fai clic su Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Il file contiene la tua password Wi-Fi e le chiavi dello schermo: tienilo per te."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Chiave API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Questo avviene fuori da ESP Screens. Home Assistant rileva "},{t:4,k:"name"},{t:3,v:" come dispositivo ESPHome; fai clic su Aggiungi. Non rilevato? Aggiungi ESPHome manualmente con l'indirizzo IP dello schermo."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Vai in Home Assistant → Impostazioni → Dispositivi e servizi."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" qui sopra quando Home Assistant chiede una chiave di cifratura."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Incolla la chiave API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" integrazione ESPHome → Configura → «Allow the device to perform Home Assistant actions». Senza questo, lo schermo vede tutto ma non controlla nulla."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Consenti le azioni di HA:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" In ESP Screens lo schermo compare nell'elenco a sinistra entro una trentina di secondi; fino ad allora è indicato lì come «non ancora in Home Assistant»."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Scegli i tuoi riquadri."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Registro ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Riprova"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Installa un altro schermo"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Ricomincia"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Fatto"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avvisi · guida rapida"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Una notifica a schermo intero, da un'automazione."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Ogni schermo ha l'azione "},{t:4,k:"action"},{t:3,v:". Mette una scheda sopra tutto, riattiva lo schermo e mantiene la retroilluminazione a luminosità normale finché qualcuno non tocca il pulsante o non scade il timeout. Home Assistant da solo non mostra spiegazioni né menu a tendina per le azioni ESPHome; qui trovi tutto quello che puoi compilare."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"La guida rapida si sta ancora caricando; un attimo."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"C'è qualcuno alla porta"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Porta 3, retro"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Arrivo"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Sezioni"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Prova"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"I tuoi schermi"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"In un'automazione"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Tutti gli schermi"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"I campi"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Icone"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Colori"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Comportamento"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Eventi"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Suggerimenti"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Invia subito un avviso, con gli stessi campi che invia un'automazione. Lo schermo mostra la scheda e, con il lampeggio attivo, fa lampeggiare la retroilluminazione."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Schermo"}},all:{t:0,b:{t:2,i:[{t:3,v:"Tutti gli schermi (pronti: "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · non pronto"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Titolo"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Sottotitolo"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icona"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Colore"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Testo del pulsante"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Timeout (secondi, 0 aspetta il pulsante)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Fai lampeggiare la retroilluminazione"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Quattro volte all'arrivo dell'avviso."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Invio…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Invia avviso"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Inviato a "},{t:4,k:"n"},{t:3,v:" schermo."}]},{t:2,i:[{t:3,v:"Inviato a "},{t:4,k:"n"},{t:3,v:" schermi."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Inviato a "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Inviato allo schermo."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 schermo saltato (offline o firmware troppo vecchio)."},{t:2,i:[{t:4,k:"n"},{t:3,v:" schermi saltati (offline o firmware troppo vecchio)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Campi lasciati vuoti: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Nessuno schermo ha potuto mostrarlo: verifica che uno schermo sia online con il firmware "},{t:4,k:"version"},{t:3,v:" o più recente."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Bianco (predefinito)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Ogni schermo ha la sua azione, con il nome del dispositivo. A partire dal firmware "},{t:4,k:"version"},{t:3,v:"; aggiorna uno schermo più vecchio con il suo pulsante Aggiorna in Schermi."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nessuno schermo associato finora. Installane uno da Nuovo schermo; l'azione compare appena Home Assistant vede lo schermo."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Aggiornamento necessario · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nome dispositivo sconosciuto · aggiorna lo schermo"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Mostra avviso"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Chiudi avviso"}}},howto:{add:{t:0,b:{t:2,i:[{t:4,k:"add"},{t:3,v:" e cerca "},{t:4,k:"esphome"},{t:3,v:". Scegli l'azione del tuo schermo: Home Assistant la chiama «Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"»."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aggiungi azione"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nome dispositivo"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant li chiede tutti e sette; lascia vuoto ciò che non usi ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", disattivo)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Compila i campi."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Preferisci lo YAML? Scegli "},{t:4,k:"edit"},{t:3,v:" sull'azione e incolla l'esempio qui sotto."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Esempio per"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"uno schermo (non ancora associato)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Modifica in YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copia YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Tutti gli schermi insieme"}},text:{t:0,b:{t:2,i:[{t:3,v:"Attiva l'evento "},{t:4,k:"show"},{t:3,v:" con gli stessi campi ed ESP Screens inoltra l'avviso a ogni schermo online, compresi quelli che aggiungerai in seguito. "},{t:4,k:"dismiss"},{t:3,v:" lo rimuove ovunque. In un'automazione, aggiungi l'azione "},{t:4,k:"event"},{t:3,v:" o incolla l'esempio in "},{t:4,k:"edit"},{t:3,v:". Tralascia i campi che non usi. Perché funzioni, ESP Screens deve essere in esecuzione."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Attiva manualmente evento"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Il testo è libero; il limite è in byte e una lettera accentata conta per due. Ciò che non ci sta finisce con i puntini di sospensione (titolo) o viene tagliato (sottotitolo)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Campo"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Tipo"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Cosa fa"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Esempio"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limite"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"testo"}},int:{t:0,b:{t:2,i:[{t:3}],s:"numero"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"attivo / disattivo"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entità"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" byte"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"da 0 a 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Inserisci il nome in "},{t:4,k:"field"},{t:3,v:", per esempio "},{t:4,k:"example"},{t:3,v:". Funzionano anche "},{t:4,k:"mdi"},{t:3,v:" e il codice esadecimale ("},{t:4,k:"hex"},{t:3,v:"). Nel firmware ci sono solo queste icone; qualsiasi altro nome mostra il triangolo di avvertimento. Tocca un'icona per copiarne il nome."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Utili per le notifiche"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Cerca un'icona"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Cerca per nome o descrizione…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Disponibili anche: icone di controllo e meteo"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copia "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Nessuna icona per «"},{t:4,k:"query"},{t:3,v:"». I nomi sconosciuti mostrano il triangolo di avvertimento ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Inserisci il nome in "},{t:4,k:"field"},{t:3,v:". Sono le tonalità pastello dei riquadri, con testo scuro. Un nome vuoto o sconosciuto dà la scheda bianca. Tocca per copiare."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Un avviso riattiva subito uno schermo attenuato o spento e compare sopra ogni pagina, ogni scheda luce aperta e il livello di standby."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Riattiva lo schermo."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Finché la scheda è visibile, la retroilluminazione resta a luminosità normale. Standby e ore notturne aspettano. Dopo il pulsante, riparte il normale tempo di standby."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Acceso fino al pulsante."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" aspetta il pulsante, per tutto il tempo necessario. Con "},{t:4,k:"minute"},{t:3,v:" la scheda sparisce dopo un minuto, ma il pulsante la chiude prima."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Timeout."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" fa lampeggiare la retroilluminazione quattro volte all'arrivo dell'avviso (circa un secondo) e poi lascia lo schermo acceso."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Lampeggio."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Un nuovo avviso sostituisce quello attuale; gli avvisi non si accumulano. L'avviso sostituito si segnala come "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Sostituzione."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" rimuove la scheda, per esempio se la porta è già aperta. Senza un avviso, quell'azione non fa nulla."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Chiusura a distanza."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" non fa nulla; solo il pulsante la chiude. Così un tocco per riattivare lo schermo non chiude mai l'avviso per sbaglio."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Toccare accanto alla scheda"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Ogni volta che un avviso termina, parte l'evento "},{t:4,k:"event"},{t:3,v:" con "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (il nome del dispositivo) e il "},{t:4,k:"device_id"},{t:3,v:" che aggiunge Home Assistant. Visibile in Impostazioni → Strumenti → Eventi."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Quando"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Aspettare che qualcuno prema il pulsante"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Usa un "},{t:4,k:"bold"},{t:3,v:": arancione per la porta, rosso per fumo o acqua, verde per «fatto». Il testo resta sempre scuro e leggibile."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"colore per ogni tipo di notifica"}},short:{t:0,b:{t:2,i:[{t:3,v:"Tieni il titolo "},{t:4,k:"bold"},{t:3,v:": uno schermo mostra circa venti caratteri su una riga e chiude un titolo più lungo con i puntini di sospensione. Metti i dettagli nel sottotitolo."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"breve"}},button:{t:0,b:{t:2,i:[{t:3,v:"Un "},{t:4,k:"bold"},{t:3,v:" trasforma la notifica in una domanda: «Arrivo», «Visto», «Spegni». L'evento poi ti dice chi ha risposto."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"testo del pulsante personalizzato"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Per un avviso che si risolve da solo (la porta si apre, il bucato viene ritirato), chiudilo nella stessa automazione con "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Tutti gli schermi? Attiva "},{t:4,k:"event"},{t:3,v:" una sola volta (vedi Tutti gli schermi insieme). Gli schermi restano indipendenti e ognuno risponde con il proprio "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Preferisci "},{t:4,k:"bold"},{t:3,v:" l'automazione? Installa la skill di ESP Screens in Impostazioni → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"chiedere a Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Campanello: mostra l’avviso e aspetta che qualcuno prema il pulsante."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Qualcuno sta arrivando alla porta."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avanzate · personalizzazione locale"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizzato"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML personalizzato · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Questo piccolo file è tuo. Viene caricato dopo il pacchetto condiviso degli schermi e resta al suo posto quando ESP Screens si aggiorna. Cambia qui i dettagli specifici dell'hardware, come il modello del display."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Cosa si può cambiare senza rischi?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Display, touchscreen, substitutions, pin e altri dettagli del dispositivo. Nome, Wi-Fi, API, OTA e collegamenti ai package restano gestiti automaticamente."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Attivo"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Pronto da collegare"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizzato locale"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Usa l'esempio"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Cancella"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 carattere"},{t:2,i:[{t:4,k:"n"},{t:3,v:" caratteri"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 riga"},{t:2,i:[{t:4,k:"n"},{t:3,v:" righe"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Salva e verifica"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Salva YAML personalizzato"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Non è stato trovato nessun profilo ESPHome per questo schermo."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Le modifiche fatte qui valgono dalla prossima compilazione."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Salva una volta per collegare questo file al profilo."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Verifica e salvataggio…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. Lo YAML personalizzato viene mantenuto negli aggiornamenti del firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizzato salvato."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Salvato. ESPHome sta verificando il profilo completo…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome sta verificando il profilo…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome sta verificando il profilo… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Il profilo completo è valido. Puoi compilare e installare senza rischi."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome ha rifiutato il profilo completo. Vedi Firmware e USB per il registro completo."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Sostituire il testo attuale con l'esempio?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Esempio caricato. Salvalo quando vuoi."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Cancellare lo YAML personalizzato locale?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Lo YAML personalizzato sarà vuoto dopo il salvataggio."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Casa"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Sconosciuto"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Non disponibile"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Riscaldamento"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Freddo"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Caldo/Freddo"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatico"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Deumidificazione"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Ventilazione"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Riscaldamento"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Raffreddando"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inattivo"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"In deumidificazione"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatore"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Preriscaldamento"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Defrosting"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"In apertura"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"In chiusura"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"In esecuzione"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"In pausa"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inattivo"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"In attesa"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"In casa"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Fuori casa"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Sopra l'orizzonte"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Sotto l'orizzonte"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Alla base"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"In pulizia"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"In pausa"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Ritornando alla base"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inattivo"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Soleggiato"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Sereno, notte"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Nuvoloso"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Parzialmente nuvoloso"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Piovoso"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Rovescio"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Nevoso"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Nevoso, piovoso"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Nebbia"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Grandine"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Temporale"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Temporale, piovoso"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Ventoso"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Eccezionale"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Basso/a"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"In carica"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Non in carica"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Freddo"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Connesso"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Disconnesso"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Caldo"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normale"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Luce rilevata"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Nessuna luce"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Sbloccato/a"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Bloccato/a"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Bagnato"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Asciutto"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"In movimento"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Non si muove"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Collegato"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Scollegato"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"In casa"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Fuori casa"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problema"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"In esecuzione"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Non in esecuzione"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Non Sicuro"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Sicuro"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevata manomissione"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornamento disponibile"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Aggiornato"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Rilevato"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Assente"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Aperto"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Chiuso"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Attiva"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Esegui"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Premi"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatico"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Basso/a"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Medio/a"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Alto/a"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Mezzo"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Focalizzato"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffuso"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Superiore"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Acceso"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Spento"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Entrambi"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Verticale"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Orizzontale"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Proprio ora"}},minutes_ago:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min fa"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 ora fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" ore fa"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Ieri"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 giorno fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" giorni fa"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 settimana fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" settimane fa"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 mese fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" mesi fa"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 anno fa"},{t:2,i:[{t:4,k:"n"},{t:3,v:" anni fa"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Tra "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Tra 1 ora"},{t:2,i:[{t:3,v:"Tra "},{t:4,k:"n"},{t:3,v:" ore"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Domani"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Tra 1 giorno"},{t:2,i:[{t:3,v:"Tra "},{t:4,k:"n"},{t:3,v:" giorni"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"domenica"}},{t:0,b:{t:2,i:[{t:3}],s:"lunedì"}},{t:0,b:{t:2,i:[{t:3}],s:"martedì"}},{t:0,b:{t:2,i:[{t:3}],s:"mercoledì"}},{t:0,b:{t:2,i:[{t:3}],s:"giovedì"}},{t:0,b:{t:2,i:[{t:3}],s:"venerdì"}},{t:0,b:{t:2,i:[{t:3}],s:"sabato"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"dom"}},{t:0,b:{t:2,i:[{t:3}],s:"lun"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"mer"}},{t:0,b:{t:2,i:[{t:3}],s:"gio"}},{t:0,b:{t:2,i:[{t:3}],s:"ven"}},{t:0,b:{t:2,i:[{t:3}],s:"sab"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"lu"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"me"}},{t:0,b:{t:2,i:[{t:3}],s:"gi"}},{t:0,b:{t:2,i:[{t:3}],s:"ve"}},{t:0,b:{t:2,i:[{t:3}],s:"sa"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"gennaio"}},{t:0,b:{t:2,i:[{t:3}],s:"febbraio"}},{t:0,b:{t:2,i:[{t:3}],s:"marzo"}},{t:0,b:{t:2,i:[{t:3}],s:"aprile"}},{t:0,b:{t:2,i:[{t:3}],s:"maggio"}},{t:0,b:{t:2,i:[{t:3}],s:"giugno"}},{t:0,b:{t:2,i:[{t:3}],s:"luglio"}},{t:0,b:{t:2,i:[{t:3}],s:"agosto"}},{t:0,b:{t:2,i:[{t:3}],s:"settembre"}},{t:0,b:{t:2,i:[{t:3}],s:"ottobre"}},{t:0,b:{t:2,i:[{t:3}],s:"novembre"}},{t:0,b:{t:2,i:[{t:3}],s:"dicembre"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"gen"}},{t:0,b:{t:2,i:[{t:3}],s:"feb"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"apr"}},{t:0,b:{t:2,i:[{t:3}],s:"mag"}},{t:0,b:{t:2,i:[{t:3}],s:"giu"}},{t:0,b:{t:2,i:[{t:3}],s:"lug"}},{t:0,b:{t:2,i:[{t:3}],s:"ago"}},{t:0,b:{t:2,i:[{t:3}],s:"set"}},{t:0,b:{t:2,i:[{t:3}],s:"ott"}},{t:0,b:{t:2,i:[{t:3}],s:"nov"}},{t:0,b:{t:2,i:[{t:3}],s:"dic"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:"."}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"2"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Pagina "},{t:4,k:"n"}]}}}}};export{t as default}; diff --git a/screen_manager/app/static/assets/nl-BhHjNiTy.js b/screen_manager/app/static/assets/nl-BvCFf3cV.js similarity index 56% rename from screen_manager/app/static/assets/nl-BhHjNiTy.js rename to screen_manager/app/static/assets/nl-BvCFf3cV.js index 5695b39..b5996c5 100644 --- a/screen_manager/app/static/assets/nl-BhHjNiTy.js +++ b/screen_manager/app/static/assets/nl-BvCFf3cV.js @@ -1 +1 @@ -const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Ongedaan maken"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"onbekend"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Niet-opgeslagen wijzigingen"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Annuleren"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Apparaten & diensten openen"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Opslaan & versturen"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Opslaan…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Actuele gegevens lezen"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 resultaat. Typ verder om te verfijnen."},{t:2,i:[{t:4,k:"n"},{t:3,v:" resultaten. Typ verder om te verfijnen."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Sluiten"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Verwijderen"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Wijzigen"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Laden…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Terug"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Kopiëren"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nieuw scherm"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware & USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alerts"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Instellingen"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Aansluiten en installeren"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Dat lukte niet. Vernieuw de pagina en probeer het opnieuw."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"API-sleutel gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"API-sleutel is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON van de indeling gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"JSON van de indeling is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Actienaam gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Actienaam is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"YAML is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Icoonnaam gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Icoonnaam is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Lege kleur gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Lege kleur is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Kleurnaam gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Kleurnaam is geselecteerd. Kopieer met Ctrl+C of Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Beheerpagina niet bereikbaar · opnieuw proberen…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant verbonden"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Verbinding met Home Assistant herstellen…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoeken"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Schermen"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Meer"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Vernieuwen"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Update"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Bijwerken"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"In de wachtrij voor de update"}},available:{t:0,b:{t:2,i:[{t:3,v:"Update "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Geen ESPHome-profiel met deze apparaatnaam gevonden."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Wat is er nieuw"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Volledig log"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"Eenmalig het IP-adres; nieuwe firmware meldt het zelf."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"IP-adres, bijv. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"IP-adres"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Starten"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Geïnstalleerd, maar nog niet in Home Assistant. Voeg het ontdekte ESPHome-apparaat toe onder Instellingen → Apparaten & diensten, plak daar de API-sleutel en zet bij Configureren “Allow the device to perform Home Assistant actions” aan."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware gedownload, nog niet in Home Assistant. Zet die met ESPHome Web op het scherm, voeg daarna het ontdekte ESPHome-apparaat toe onder Instellingen → Apparaten & diensten, plak daar de API-sleutel en sta bij Configureren de Home Assistant-acties toe."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Nog niet in Home Assistant. Al geflasht? Voeg het ESPHome-apparaat toe onder Instellingen → Apparaten & diensten en sta daarna bij Configureren de Home Assistant-acties toe. Nog niet geflasht? Firmware & USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"API-sleutel kopiëren"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Schermen"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Acties"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Toevoegen aan dit scherm"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Cheatsheet en een testalert"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Updates, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Niets om op te slaan"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Dit scherm identificeren"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Laat de backlight knipperen en toont een kaart"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Nieuwere firmware nodig"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Indeling exporteren"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Als JSON downloaden en kopiëren"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Zoek schermen, entiteiten, acties…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Niets gevonden. Typ een deel van een scherm, entiteit of actie."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Kies een scherm"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Kies links een van je schermen om de tegels, de bovenbalk en de instellingen aan te passen."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Begin met een scherm"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Sluit een CYD of Guition via USB aan op je Home Assistant-machine. Profiel, firmware en de eerste flash gebeuren in één keer."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Nieuw scherm installeren"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Je hebt niet-opgeslagen wijzigingen. Toch een ander scherm openen?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"De niet-opgeslagen indeling vervangen door een kopie van die van het andere scherm?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"De niet-opgeslagen indeling vervangen door de geïmporteerde?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. Je scherm wordt bijgewerkt."}},other:{t:0,b:{t:2,i:[{t:3,v:"Opgeslagen. "},{t:4,k:"name"},{t:3,v:" wordt bijgewerkt."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. Het scherm wordt bijgewerkt."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. Je laatste wijziging is nog niet verstuurd: druk nog eens op Opslaan & versturen."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" knippert en toont een paar seconden een kaart."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · wijzigingen worden bewaard"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Indeling"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Scherminstellingen"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen · naar scherm verstuurd"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Alles opgeslagen"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Meer"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificeren"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"scherm laten knipperen"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Firmware 0.2.31 of nieuwer nodig"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"uit Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Indeling kopiëren van…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" scherm"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" schermen"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"geen ander scherm"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" tegel"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" tegels"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Indeling exporteren"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Indeling importeren…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML-override"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"geavanceerd"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Geen ESPHome-profiel gevonden voor dit scherm"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Firmware bijwerken"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verwijderd"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Er is geen plek voor deze tegel op pagina "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Er is geen lege pagina voor een paginavullende tegel. Maak eerst een pagina vrij."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Dit scherm heeft al een tegel die naar pagina "},{t:4,k:"page"},{t:3,v:" gaat."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Indeling van "},{t:4,k:"name"},{t:3,v:" gekopieerd. Druk op Opslaan & versturen als alles klopt."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Indeling van "},{t:4,k:"name"},{t:3,v:" gekopieerd: "},{t:4,k:"kept"},{t:3,v:" van de "},{t:4,k:"total"},{t:3,v:" tegels passen bij de firmware van dit scherm. Druk op Opslaan & versturen als alles klopt."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Indeling geïmporteerd. Druk op Opslaan & versturen als alles klopt."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Indeling geïmporteerd: "},{t:4,k:"kept"},{t:3,v:" van de "},{t:4,k:"total"},{t:3,v:" tegels passen bij de firmware van dit scherm. Druk op Opslaan & versturen als alles klopt."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Dat is geen JSON. Exporteer eerst een indeling, of plak er een uit een andere ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Dit bestand heeft geen tegels. Gebruik een indeling die uit ESP Screens is geëxporteerd."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" pagina · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tegels"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pagina's · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tegels"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Voeg je eerste lamp, scène of apparaat toe uit de bibliotheek."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Tik op de bovenbalk of een tegel om die aan te passen. Sleep om te verplaatsen, of naar de volgende pagina voor een nieuwe pagina."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Lege plekken en vaste posities werken vanaf firmware 0.2.26. Tot die update schuift dit scherm (firmware "},{t:4,k:"firmware"},{t:3,v:") de tegels op naar de eerste vrije plek."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Schermindeling"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Pagina toevoegen"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maximaal 1 pagina"},{t:2,i:[{t:3,v:"Maximaal "},{t:4,k:"n"},{t:3,v:" pagina's"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Pagina "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Pagina weghalen"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"De pagina's erna schuiven een plek op"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Bovenbalk aanpassen"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Lege plek. Klik om hier een tegel toe te voegen, of sleep er een naartoe."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Lege plek "},{t:4,k:"slot"},{t:3,v:" op pagina "},{t:4,k:"page"},{t:3,v:": hier de volgende tegel toevoegen"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Volgende tegel komt hier"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Leeg"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bibliotheek"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entiteit"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entiteiten"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek op naam, apparaat of ruimte…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Voeg een entiteit toe"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Alles"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Lampen"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klimaat"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Schakelaars"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Acties"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatoren"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Raambekleding"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scènes"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Stofzuigers"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensoren"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Weer"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Waarden"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Keuzelijsten"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personen"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timers"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Scherm"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Ruimte"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Alle ruimtes"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Geplaatste verbergen"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Verberg wat al op dit scherm staat"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Alles hier staat al op dit scherm."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Geen entiteiten gevonden. Probeer een andere naam, ruimte of filter."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Op dit scherm past 1 tegel."},{t:2,i:[{t:3,v:"Op dit scherm passen "},{t:4,k:"n"},{t:3,v:" tegels."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Op dit scherm past 1 tegel; werk de firmware bij voor 48."},{t:2,i:[{t:3,v:"Op dit scherm passen "},{t:4,k:"n"},{t:3,v:" tegels; werk de firmware bij voor 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Sleep naar een pagina, of tik op + voor de eerste vrije plek. ⌘K doorzoekt alles."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Licht"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klimaat"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Stofzuiger"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilator"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Raambekleding"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Schakelaar"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Schakelaar"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scène"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Weer"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Waarde"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Waarde"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Keuzelijst"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Keuzelijst"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Actie"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Actie"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Scherm"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Zon"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Persoon"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Camera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Afbeelding"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entiteit"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standaard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"grote waarde"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"weersverwachting"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"grafiek"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"digitale klok"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"analoge klok"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"zonnebaan"}},live:{t:0,b:{t:2,i:[{t:3}],s:"livebeeld"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"albumhoes"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normaal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"dubbel"}},full:{t:0,b:{t:2,i:[{t:3}],s:"hele pagina"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Naam op het scherm"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (uit Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (standaard)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm toont een gekozen icoon vanaf firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Gaat naar pagina"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (leeg)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Navigatietegels hebben firmware 0.2.62 nodig: druk eerst bij het scherm op Bijwerken."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Dit scherm heeft geen pagina "},{t:4,k:"page"},{t:3,v:", dus een tik opent de laatste pagina. Kies een andere pagina."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Een tik op de tegel opent die pagina."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Weergave"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Digitale klok"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Analoge klok"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Naam en status"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Grote waarde"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Weersverwachting"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Grafiek"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Zonnebaan"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Livebeeld"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Een klein beeld van de camera op de plek van het icoon, ververst in het tempo hieronder zolang de pagina in beeld is. Een tik opent hem nog steeds schermvullend."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Een livebeeld heeft firmware 0.2.77 of nieuwer nodig: druk na het opslaan op Bijwerken bij het scherm."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Albumhoes"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"De albumhoes van wat er speelt op de plek van het icoon, zoals de eigen tile van Home Assistant; een speler zonder afbeelding houdt zijn icoon. Een tik opent nog steeds de kaart."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"De albumhoes op de tile heeft firmware 0.2.78 of nieuwer nodig: druk na het opslaan op Bijwerken bij het scherm."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant heeft geen getallen voor deze entiteit, dus de grafiek blijft leeg. Kies een andere weergave."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Deze weerdienst heeft geen dagverwachting in Home Assistant. Kies een andere weergave."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Verversen"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Elke "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Grootte"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normaal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Dubbelbreed"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Hele pagina"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Hele pagina: één grote knop in de eigen kleur van de tile; onderaan staat een slider, bediening of grafiek."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Een paginavullende tegel heeft firmware 0.2.62 nodig: druk eerst bij het scherm op Bijwerken."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pagina"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe pagina"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Directe bediening op de tegel"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant biedt deze bediening niet voor deze entiteit, dus die blijft leeg op het scherm. Kies een andere."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Onderaan de paginavullende tegel; een tik ergens anders werkt zoals hieronder ingesteld."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"Rechts op de dubbelbrede tegel, zoals de rijen in Home Assistant. Tikken op de naam werkt zoals hieronder ingesteld."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm toont directe bediening vanaf firmware 0.2.19; tot die tijd blijft de tegel zoals hij was."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Bij aantikken"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Bediening openen"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Alleen bekijken"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Aan / uit"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Actie uitvoeren"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant kan dit niet aan- en uitzetten, dus een tik doet niets. Kies een andere optie."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm schakelt dit vanaf firmware 0.2.58: druk bij het scherm op Bijwerken. Tot dan opent een tik de kaart."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Houd de tegel vast om de kaart te openen."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Kleine slider op de tegel"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Nee"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Ja, direct bedienen"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant heeft niets wat een slider bij deze entiteit kan aanpassen. Kies Nee."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Geschiedenis"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" uur"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" uur"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pastelachtergrond"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Achtergrond: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", plek "},{t:4,k:"slot"},{t:3,v:" op pagina "},{t:4,k:"page"},{t:3,v:". Enter: instellen, pijltjestoetsen: verplaatsen"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Tegel verwijderen"}},remove_named:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verwijderen"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Actie"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant vragen welke acties deze entiteit heeft…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant reageert nu niet. Probeer het zo nog eens."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Kies een actie"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek, bijvoorbeeld schakelen, positie of afspelen"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Zoek een actie"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Geen actie gevonden."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant biedt deze actie niet meer voor deze entiteit, dus een tik doet niets. Kies een andere."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (optioneel)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Niet ingesteld"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant heeft "},{t:4,k:"fields"},{t:3,v:" nodig."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm voert een actie uit vanaf firmware 0.2.58: druk bij het scherm op Bijwerken. Tot dan werkt een tik als Automatisch."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icoon"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Geen icoon"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek, bijvoorbeeld lamp, muziek of deur"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Zoek een icoon"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Geen icoon, alleen tekst"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icoon: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Geen icoon gevonden."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Actuele gegevens"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Verbinding, status en ondersteunde eigenschappen"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Lezen…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Actuele HA-status ophalen…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Status: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Kleine slider: "},{t:4,k:"slider"},{t:3,v:" · Weergave: "},{t:4,k:"display"},{t:3,v:" · Grootte: "},{t:4,k:"size"},{t:3,v:" · Bediening: "},{t:4,k:"control"},{t:3,v:" · Achtergrond: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"ja"}},no:{t:0,b:{t:2,i:[{t:3}],s:"nee"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"geen"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Standaard"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Opnieuw lezen"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" uit de bovenbalk gehaald"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"De bovenbalk heeft plaats voor 1 onderdeel."},{t:2,i:[{t:3,v:"De bovenbalk heeft plaats voor "},{t:4,k:"n"},{t:3,v:" onderdelen."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"Dit staat al in de bovenbalk."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Bovenbalk"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Bovenbalk: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Van het scherm zelf, werkt ook zonder Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" van "},{t:4,k:"n"},{t:3,v:" onderdeel"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" van "},{t:4,k:"n"},{t:3,v:" onderdelen"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Links: naam"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Bijvoorbeeld: Woonkamer"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Rechts: tijd, sensoren of een klok"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", plek "},{t:4,k:"slot"},{t:3,v:". Enter: instellen, pijltjes: verplaatsen"}]}},remove_named:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" uit de bovenbalk halen"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maximaal 1 onderdeel"},{t:2,i:[{t:3,v:"Maximaal "},{t:4,k:"n"},{t:3,v:" onderdelen"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Tijd, datum, analoge klok of een entiteit toevoegen"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Tijd, datum of entiteit toevoegen"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Niet alles past naast de naam: het scherm laat de gestreepte onderdelen weg. Haal er een weg of kies een kortere naam."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Sleep om de volgorde te wijzigen; tik op een onderdeel om het in te stellen."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensoren, de datum en de analoge klok verschijnen vanaf firmware "},{t:4,k:"version"},{t:3,v:"; tot die update toont dit scherm de naam en, als de tijd in de balk staat, de klok."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Verborgen: nu niet actief"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Past niet naast de naam"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Wijzerplaat"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Nu verborgen: niet actief"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Past nu niet naast de naam"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Zo staat het op het scherm"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Kleine wijzerplaat met de tijd"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Wat laten zien"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"“Laatst gewijzigd” telt op het scherm zelf door: “Zojuist”, “5 min geleden”, “Gisteren”."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (zoals Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Tonen"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"“Alleen als actief” verbergt het onderdeel zolang het uit, dicht, afwezig of 0 is. Handig voor een open deur, een draaiende wasmachine of wie er thuis is."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"24-uursklok · wijzigen onder "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"12-uursklok · wijzigen onder "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Instellingen → Taal & regio"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Vandaag is het "},{t:4,k:"date"},{t:3,v:". De datum volgt de eigen klok van het scherm."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Omhoog"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Omlaag"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Toevoegen aan de bovenbalk"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" van "},{t:4,k:"n"},{t:3,v:" plek gebruikt"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" van "},{t:4,k:"n"},{t:3,v:" plekken gebruikt"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Van het scherm zelf"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Staat er al in"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Suggesties uit Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Een entiteit"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek op naam, ruimte of entiteit, bijv. temperatuur of deur"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Zoek een entiteit voor de bovenbalk"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Geen entiteiten gevonden."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helderheid"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Nacht"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Scherm"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helderheid"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Donkere modus"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch stand-by"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Stand-by na"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helderheid stand-by"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Nachtmodus"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Begint"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Eindigt"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helderheid nacht"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Terug naar pagina 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Na"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Ook bij stand-by"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Vegen tussen pagina's"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Paginaknoppen"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotatie"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" sec"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" u"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" u "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" a.m."}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" p.m."}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"De instellingen van het andere scherm worden nog opgeslagen. Probeer het zo nog eens."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Paginaknoppen en vegen staan uit, dus alleen “Ga naar pagina”-tegels wisselen van pagina."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"pagina "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"pagina's "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegel, naar "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegels, naar "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegel, naar "},{t:4,k:"targets"},{t:3,v:", maar geen naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]},{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegels, naar "},{t:4,k:"targets"},{t:3,v:", maar geen naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegel, naar "},{t:4,k:"targets"},{t:3,v:", maar geen naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]},{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegels, naar "},{t:4,k:"targets"},{t:3,v:", maar geen naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Je hebt geen “Ga naar pagina”-tegels."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Je hebt geen “Ga naar pagina”-tegels naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Je hebt geen “Ga naar pagina”-tegels naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"De tegels naar "},{t:4,k:"pages"},{t:3,v:" staan alleen op pagina's die je niet kunt bereiken."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Vanaf "},{t:4,k:"pages"},{t:3,v:" leidt geen tegel terug naar pagina 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Dit scherm is offline. Je kunt de instellingen wijzigen zodra het terug is."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Wijzigingen gelden meteen op het scherm en verschijnen hier als ze daar veranderen."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Wijzigingen gelden meteen. Met firmware 0.2.49 bewaart het scherm ze zelf."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Deze entiteit is uitgeschakeld in Home Assistant, of het scherm herstart."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verlagen"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verhogen"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Update starten…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Firmware bouwen…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Firmware via Wi-Fi schrijven…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen en installeren…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Wachten tot het scherm terug is…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Controleren of het stabiel blijft…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Nieuwe taal: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Schermen worden voortaan 's nachts automatisch bijgewerkt."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch bijwerken staat uit."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Firmware-updates"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Bezig met bijwerken naar firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Nog geen scherm gekoppeld. Nieuwe schermen krijgen firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" is beschikbaar voor "},{t:4,k:"n"},{t:3,v:" scherm."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" is beschikbaar voor "},{t:4,k:"n"},{t:3,v:" schermen."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Alle schermen hebben firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 scherm bijwerken"},{t:2,i:[{t:3,v:"Alle "},{t:4,k:"n"},{t:3,v:" schermen bijwerken"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Nieuw in firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Elke nacht automatisch bijwerken"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Tussen 03:00 en 06:00, één scherm tegelijk. Stopt bij een fout en meldt die in Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Skill geïnstalleerd. Claude Code vindt hem meteen."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Skill geïnstalleerd. Start Claude Code één keer opnieuw, zodat het de nieuwe skills-map vindt."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Leer Claude ESP Screens kennen en vraag dan: “Laat een melding zien op al mijn schermen als de brievenbus vol is.” Claude kent de gebeurtenissen van alerts en elk veld, elke kleur en elk icoon."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installeren voor Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Opnieuw installeren"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Skill bijwerken"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Niet geïnstalleerd"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Geïnstalleerd"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Geïnstalleerd · er is een nieuwere versie"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Voor Claude Code in Home Assistant. Schrijft één bestand naar "},{t:4,k:"path"},{t:3,v:"; opnieuw installeren vervangt het."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Downloaden voor claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Upload de zip in Claude onder Customize → Skills."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Alles rond je schermen."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Mijn schermen"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Schermen"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Voeg een scherm toe, of bouw en installeer de firmware van een bestaand scherm opnieuw."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen en installeren via USB of Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Taal & regio"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Taal van de schermen"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Taal van Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Taal van Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"De schermen gebruiken Engels tot de taal van Home Assistant beschikbaar is."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · nog niet nagekeken, hulp welkom"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" is nog niet nagekeken, hulp welkom: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"zo vertaal je mee"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Na een wijziging heeft elk scherm een firmware-update nodig, één build per scherm: met de knop Bijwerken, of via de nachtelijke updates."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Tijdnotatie"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatisch, volgt de taal ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 uur"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 uur"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Getalnotatie"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatisch, volgt de taal ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Je Home Assistant-profiel: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Deze gebruiken"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"De editor zelf volgt de taal van je Home Assistant-profiel."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. Elk scherm krijgt de nieuwe taal bij zijn volgende update."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Een kaart over het hele scherm vanuit een automatisering, op één scherm of op allemaal. De cheatsheet heeft de actienamen, velden, iconen en kleuren, en een formulier om er een te proberen."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Meldingen over het hele scherm, vanuit een automatisering"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Schermfirmware bouwen en installeren"}},intro:{t:0,b:{t:2,i:[{t:3,v:"De ingebouwde ESPHome CLI gebruikt je eigen profiel (YAML met sleutels) en secrets. Kies het profiel van het scherm, dan een USB-poort (scherm aan de Home Assistant-machine), "},{t:4,k:"ota"},{t:3,v:" met de hostnaam, of "},{t:4,k:"download"},{t:3,v:" om de firmware vanaf je eigen computer op het scherm te zetten. "},{t:4,k:"check"},{t:3,v:" valideert alleen, "},{t:4,k:"build"},{t:3,v:" compileert, "},{t:4,k:"install"},{t:3,v:" zet de firmware op het scherm. Je tegels blijven zoals ze in ESP Screens staan. De eerste build duurt enkele minuten."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Downloaden"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Controleren"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Alleen bouwen"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen & installeren"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen & downloaden"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"De ESPHome CLI ontbreekt. Werk de app bij naar 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Kies het bedoelde profiel, dan een USB-poort, een IP-adres of Downloaden."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome-profiel"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Installeren naar"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · nog geen bord gevonden op de Home Assistant-machine"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Downloaden · flashen vanaf je eigen computer"}},host:{t:0,b:{t:2,i:[{t:3}],s:"IP-adres of hostnaam"}},download_file:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" downloaden"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Zet het met "},{t:4,k:"esphome_web"},{t:3,v:" op het scherm, in Chrome of Edge: klik op Connect, kies de USB-poort van het scherm, klik op Install en selecteer dit bestand. Het bevat je Wi-Fi-wachtwoord en de sleutels van het scherm: houd het voor jezelf."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Aansluiten en installeren."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profiel bewaard."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Even geduld…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Klaar om te downloaden."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Klaar."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Dat lukte niet."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens maakt een eigen profiel voor het scherm, met unieke sleutels, en bouwt de firmware. Sluit het scherm met een USB-datakabel aan op de machine waarop Home Assistant draait, of download de firmware en zet die vanaf je eigen computer op het scherm."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Welk scherm heb je?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 inch"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 inch"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Naam"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Scherm woonkamer"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Apparaatnaam"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"aanpassen"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Elk scherm krijgt een eigen profiel met eigen sleutels. Vier schermen? Doorloop dit vier keer met een andere naam."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Kleine letters, cijfers en streepjes. Elk scherm een andere naam."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi-naam (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi-wachtwoord"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Eén keer invullen: ESP Screens bewaart dit in ESPHome secrets.yaml, volgende schermen gebruiken het automatisch."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Je ESPHome secrets.yaml mist nog Wi-Fi-gegevens. ESP Screens vult alleen de ontbrekende regels aan."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi komt uit je ESPHome secrets.yaml."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"secrets.yaml in de ESPHome-map is geen geldige YAML. Herstel het bestand eerst; het wordt niet overschreven."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Installeren via"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Later · alleen het profiel bewaren"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Sluit het scherm met een USB-datakabel aan op de Home Assistant-machine; de lijst ververst vanzelf. Of kies Downloaden om je eigen computer te gebruiken."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download de firmware en zet die vanaf je eigen computer op het scherm, in Chrome of Edge. Daarna gaan updates via Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Het profiel komt in de ESPHome-map. Installeren kan later via Firmware & USB, of vanuit ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Meer dan één bord aangesloten: kies de poort van dit scherm."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Eén keer via USB; daarna gaat alles draadloos."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installeren"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Profiel bewaren"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Er loopt al een build of installatie ("},{t:4,k:"file"},{t:3,v:"). Wacht tot die klaar is."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"De ESPHome CLI ontbreekt in deze installatie; alleen het profiel bewaren kan."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" staat in de ESPHome-map"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Firmware naar "},{t:4,k:"name"},{t:3,v:" schrijven…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Firmware bouwen…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Firmware voor "},{t:4,k:"name"},{t:3,v:" is klaar"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Firmware staat op "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen mislukt"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Installeren mislukt"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Installeren kan later via Firmware & USB: kies dit profiel, dan de USB-poort van de Home Assistant-machine, of Downloaden om de firmware vanaf je eigen computer op het scherm te zetten. Bewaar de API-sleutel voor de koppeling:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Haal de USB-kabel nog niet los."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Een eerste build duurt op een Raspberry Pi enkele minuten. Je kunt deze pagina verlaten: de installatie loopt door en je vindt hem terug onder Nieuw scherm."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Een eerste build duurt op een Raspberry Pi enkele minuten. Je kunt deze pagina verlaten: de build loopt door en je vindt hem terug onder Nieuw scherm."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Zet de firmware vanaf je eigen computer op het scherm en koppel het scherm daarna aan Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm start op en verbindt met je Wi-Fi. Koppel het nu aan Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm start op en verbindt met je Wi-Fi. De CYD vraagt eerst om een touch-kalibratie: tik op de kruisjes. Koppel het nu aan Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Bekijk het log hieronder."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" met een USB-datakabel."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Sluit het scherm aan op je computer"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" in Chrome of Edge, klik op Connect en kies de USB-poort van het scherm."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Open "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" en selecteer "},{t:4,k:"file"},{t:3,v:". Het scherm herstart en verbindt met je Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" en selecteer "},{t:4,k:"file"},{t:3,v:". Het scherm herstart en verbindt met je Wi-Fi. De CYD vraagt eerst om een touch-kalibratie: tik op de kruisjes."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Klik op Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Het bestand bevat je Wi-Fi-wachtwoord en de sleutels van het scherm: houd het voor jezelf."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"API-sleutel"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Dit gebeurt buiten ESP Screens. Home Assistant ontdekt "},{t:4,k:"name"},{t:3,v:" als ESPHome-apparaat; klik op Toevoegen. Niet ontdekt? Voeg ESPHome handmatig toe met het IP-adres van het scherm."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ga naar Home Assistant → Instellingen → Apparaten & diensten."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" van hierboven zodra Home Assistant om een encryptiesleutel vraagt."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Plak de API-sleutel"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ESPHome-integratie → Configureren → “Allow the device to perform Home Assistant actions”. Zonder dit ziet het scherm alles, maar bedient het niets."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Sta HA-acties toe:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Terug in ESP Screens verschijnt het scherm binnen een halve minuut in de lijst links; tot die tijd staat het daar als “nog niet in Home Assistant”."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Kies je tegels."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Log van ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Opnieuw proberen"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Nog een scherm installeren"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Opnieuw beginnen"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Klaar"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alerts · cheatsheet"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Een melding over het hele scherm, vanuit een automatisering."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Elk scherm heeft de actie "},{t:4,k:"action"},{t:3,v:". Die legt een kaart over alles heen, wekt het scherm en houdt de backlight op de normale helderheid tot iemand op de knop tikt of de timeout verstrijkt. Home Assistant toont bij ESPHome-acties zelf geen uitleg of keuzelijsten; alles wat je kunt invullen staat hier."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"De cheatsheet laadt nog; even geduld."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Iemand belt aan"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Deur 3, achterkant"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Ik kom"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Onderdelen"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Uitproberen"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Jouw schermen"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"In een automatisering"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Alle schermen"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"De velden"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Iconen"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Kleuren"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Gedrag"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Gebeurtenissen"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Tips"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Stuur nu één alert, met dezelfde velden die een automatisering stuurt. Het scherm toont de kaart en laat, met knipperen aan, de backlight knipperen."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Scherm"}},all:{t:0,b:{t:2,i:[{t:3,v:"Alle schermen ("},{t:4,k:"ready"},{t:3,v:" klaar)"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · niet klaar"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Titel"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Ondertitel"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icoon"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Kleur"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Knoptekst"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Timeout (seconden, 0 wacht op de knop)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Backlight laten knipperen"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Vier keer als de alert binnenkomt."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Versturen…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Alert versturen"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Verstuurd naar "},{t:4,k:"n"},{t:3,v:" scherm."}]},{t:2,i:[{t:3,v:"Verstuurd naar "},{t:4,k:"n"},{t:3,v:" schermen."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Verstuurd naar "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Verstuurd naar het scherm."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 overgeslagen (offline of oude firmware)."},{t:2,i:[{t:4,k:"n"},{t:3,v:" overgeslagen (offline of oude firmware)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Leeg gelaten: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Geen enkel scherm kon hem tonen: controleer of er een scherm online is met firmware "},{t:4,k:"version"},{t:3,v:" of nieuwer."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Wit (standaard)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Elk scherm heeft zijn eigen actie, met de apparaatnaam erin. Vanaf firmware "},{t:4,k:"version"},{t:3,v:"; een ouder scherm werk je bij met de knop Bijwerken onder Schermen."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nog geen scherm gekoppeld. Installeer er een via Nieuw scherm; de actie verschijnt zodra Home Assistant het scherm ziet."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Update nodig · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Apparaatnaam onbekend · werk het scherm bij"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Alert tonen"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Alert sluiten"}}},howto:{add:{t:0,b:{t:2,i:[{t:3,v:"Klik op "},{t:4,k:"add"},{t:3,v:" en zoek op "},{t:4,k:"esphome"},{t:3,v:". Kies de actie van je scherm: Home Assistant noemt die “Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"”."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Actie toevoegen"}},device:{t:0,b:{t:2,i:[{t:3}],s:"apparaatnaam"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant vraagt om alle zeven; laat wat je niet gebruikt leeg ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", uit)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Vul de velden in."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Liever YAML? Kies "},{t:4,k:"edit"},{t:3,v:" bij de actie en plak het voorbeeld hieronder."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Voorbeeld voor"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"een scherm (nog niet gekoppeld)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Bewerken in YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"YAML kopiëren"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Alle schermen tegelijk"}},text:{t:0,b:{t:2,i:[{t:3,v:"Vuur de gebeurtenis "},{t:4,k:"show"},{t:3,v:" af met dezelfde velden, en ESP Screens geeft de alert door aan elk scherm dat online is, ook aan schermen die je later toevoegt. "},{t:4,k:"dismiss"},{t:3,v:" haalt hem overal weg. Voeg in een automatisering de actie "},{t:4,k:"event"},{t:3,v:" toe, of plak het voorbeeld onder "},{t:4,k:"edit"},{t:3,v:". Laat de velden die je niet gebruikt weg. ESP Screens moet hiervoor draaien."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Handmatige gebeurtenis activeren"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Tekst is vrij in te vullen; de limiet is in bytes en een letter met accent telt voor twee. Wat niet past krijgt puntjes (titel) of valt weg (ondertitel)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Veld"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Type"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Wat het doet"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Voorbeeld"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limiet"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"tekst"}},int:{t:0,b:{t:2,i:[{t:3}],s:"getal"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"aan / uit"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entiteit"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"0 tot 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Vul de naam in bij "},{t:4,k:"field"},{t:3,v:", bijvoorbeeld "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" en de hex-codepoint ("},{t:4,k:"hex"},{t:3,v:") werken ook. Alleen deze iconen zitten in de firmware; elke andere naam toont de waarschuwingsdriehoek. Tik op een icoon om de naam te kopiëren."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Handig voor meldingen"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Zoek een icoon"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek op naam of omschrijving…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Ook beschikbaar: bedienings- en weericonen"}},copy:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" kopiëren"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Geen icoon voor “"},{t:4,k:"query"},{t:3,v:"”. Onbekende namen tonen de waarschuwingsdriehoek ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Vul de naam in bij "},{t:4,k:"field"},{t:3,v:". Dit zijn de pasteltinten van de tegels, met donkere tekst. Leeg of onbekend geeft de witte kaart. Tik om te kopiëren."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Een alert maakt een gedimd of donker scherm meteen wakker en verschijnt boven elke pagina, elke open lichtkaart en de stand-bylaag."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wekt het scherm."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Zolang de kaart in beeld is, blijft de backlight op de normale helderheid. Stand-by en de nachturen wachten. Na de knop begint de gewone stand-bytijd opnieuw."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aan tot de knop."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" wacht op de knop, hoe lang dat ook duurt. Met "},{t:4,k:"minute"},{t:3,v:" verdwijnt de kaart na een minuut, maar de knop sluit hem eerder."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Timeout."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" laat de backlight vier keer knipperen als de alert binnenkomt (ongeveer een seconde) en laat het scherm daarna aan."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Knipperen."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Een nieuwe alert vervangt de huidige; er is geen stapel. De vervangen alert meldt zich als "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Vervangen."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" haalt de kaart weg, bijvoorbeeld als de deur al open is. Zonder alert doet die actie niets."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Op afstand sluiten."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" doet niets; alleen de knop sluit hem. Zo drukt een tik om het scherm te wekken de alert nooit per ongeluk weg."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tikken naast de kaart"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Elk einde vuurt de gebeurtenis "},{t:4,k:"event"},{t:3,v:" af, met "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (de apparaatnaam) en het "},{t:4,k:"device_id"},{t:3,v:" dat Home Assistant toevoegt. Te zien onder Instellingen → Hulpmiddelen → Gebeurtenissen."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Wanneer"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Wachten tot iemand op de knop drukt"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Gebruik een "},{t:4,k:"bold"},{t:3,v:": oranje voor de deur, rood voor rook of water, groen voor “klaar”. De tekst blijft altijd donker en leesbaar."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"kleur per soort melding"}},short:{t:0,b:{t:2,i:[{t:3,v:"Houd de titel "},{t:4,k:"bold"},{t:3,v:"; een scherm toont zo'n twintig tekens op één regel en kort een langere titel af met puntjes. Zet details in de ondertitel."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"kort"}},button:{t:0,b:{t:2,i:[{t:3,v:"Een "},{t:4,k:"bold"},{t:3,v:" maakt van de melding een vraag: “Ik kom”, “Gezien”, “Uitzetten”. De gebeurtenis vertelt je dan wie reageerde."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"eigen knoptekst"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Een alert die zichzelf oplost (de deur gaat open, de was is eruit gehaald) sluit je in dezelfde automatisering met "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Alle schermen? Vuur "},{t:4,k:"event"},{t:3,v:" één keer af (zie Alle schermen tegelijk). De schermen werken nog steeds los van elkaar en melden zich elk met hun eigen "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Liever "},{t:4,k:"bold"},{t:3,v:" om de automatisering te schrijven? Installeer de ESP Screens-skill onder Instellingen → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"Claude vragen"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Deurbel: toon de alert en wacht tot iemand op de knop drukt."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Er komt iemand naar de deur."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Geavanceerd · lokale override"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML-override"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML-override · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Dit kleine bestand is van jou. Het wordt na het gedeelde schermpakket geladen en blijft staan als ESP Screens wordt bijgewerkt. Pas hier hardwaredetails aan, zoals een displaymodel."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Wat kun je veilig aanpassen?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Display, touchscreen, substitutions, pinnen en andere apparaatdetails. Naam, Wi-Fi, API, OTA en de koppelingen naar de packages beheert ESP Screens zelf."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Actief"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Klaar om te koppelen"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"Lokale YAML-override"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Voorbeeld gebruiken"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Wissen"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 teken"},{t:2,i:[{t:4,k:"n"},{t:3,v:" tekens"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 regel"},{t:2,i:[{t:4,k:"n"},{t:3,v:" regels"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Opslaan & controleren"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Override opslaan"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Er is geen ESPHome-profiel gevonden voor dit scherm."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Wijzigingen hier gelden bij de volgende build."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Sla één keer op om dit bestand aan het profiel te koppelen."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Controleren en opslaan…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. De override blijft bewaard bij firmware-updates."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML-override opgeslagen."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. ESPHome controleert het complete profiel…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome controleert het profiel…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome controleert het profiel… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Het complete profiel is geldig. Je kunt veilig bouwen en installeren."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome heeft het complete profiel afgekeurd. Zie Firmware & USB voor het volledige log."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"De huidige tekst vervangen door het voorbeeld?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Voorbeeld geladen. Sla het op zodra je klaar bent."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"De lokale override wissen?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Na opslaan is de override leeg."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Thuis"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Onbekend"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Verwarmen"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Koelen"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Verwarmen/koelen"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Droog"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Alleen ventilator"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Verwarmen"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Koelen"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactief"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Drogen"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilator"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Voorverwarmen"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Ontdooien"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Openen"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Sluiten"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Speelt"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Gepauzeerd"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactief"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"Stand-by"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Thuis"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Afwezig"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Boven de horizon"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Onder de horizon"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Gedockt"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Schoonmaken"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Gepauzeerd"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Terugkeren naar dock"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactief"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Zonnig"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Helder, nacht"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Bewolkt"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Half bewolkt"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Regenachtig"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Regen"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Sneeuwachtig"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Sneeuw-, regenachtig"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Mist"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Hagel"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Bliksem"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Bliksem, regenachtig"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Winderig"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Uitzonderlijk"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Laag"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normaal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Opladen"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet aan het opladen"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Koud"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Verbonden"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Verbroken"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Heet"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Licht gedetecteerd"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Geen licht"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Ontgrendeld"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Vergrendeld"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Nat"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Droog"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"Beweging"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Geen beweging"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Ingeplugd"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Losgekoppeld"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Thuis"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Afwezig"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Probleem"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"Actief"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet actief"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Onveilig"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Veilig"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Sabotage ontdekt"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Update beschikbaar"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Up-to-date"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Niet beschikbaar"}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Inschakelen"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Uitvoeren"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Klik"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Laag"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Gemiddeld"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Hoog"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Midden"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Concentratie"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffuus"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Boven"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Beide"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Verticaal"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontaal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Zojuist"}},minutes_ago:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min geleden"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 uur geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" uur geleden"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Gisteren"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 dag geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" dagen geleden"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 week geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" weken geleden"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 maand geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" maanden geleden"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 jaar geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" jaar geleden"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Over "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Over 1 uur"},{t:2,i:[{t:3,v:"Over "},{t:4,k:"n"},{t:3,v:" uur"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Morgen"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Over 1 dag"},{t:2,i:[{t:3,v:"Over "},{t:4,k:"n"},{t:3,v:" dagen"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"a.m."}},pm:{t:0,b:{t:2,i:[{t:3}],s:"p.m."}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"zondag"}},{t:0,b:{t:2,i:[{t:3}],s:"maandag"}},{t:0,b:{t:2,i:[{t:3}],s:"dinsdag"}},{t:0,b:{t:2,i:[{t:3}],s:"woensdag"}},{t:0,b:{t:2,i:[{t:3}],s:"donderdag"}},{t:0,b:{t:2,i:[{t:3}],s:"vrijdag"}},{t:0,b:{t:2,i:[{t:3}],s:"zaterdag"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"zo"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"di"}},{t:0,b:{t:2,i:[{t:3}],s:"wo"}},{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"vr"}},{t:0,b:{t:2,i:[{t:3}],s:"za"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"zo"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"di"}},{t:0,b:{t:2,i:[{t:3}],s:"wo"}},{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"vr"}},{t:0,b:{t:2,i:[{t:3}],s:"za"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"januari"}},{t:0,b:{t:2,i:[{t:3}],s:"februari"}},{t:0,b:{t:2,i:[{t:3}],s:"maart"}},{t:0,b:{t:2,i:[{t:3}],s:"april"}},{t:0,b:{t:2,i:[{t:3}],s:"mei"}},{t:0,b:{t:2,i:[{t:3}],s:"juni"}},{t:0,b:{t:2,i:[{t:3}],s:"juli"}},{t:0,b:{t:2,i:[{t:3}],s:"augustus"}},{t:0,b:{t:2,i:[{t:3}],s:"september"}},{t:0,b:{t:2,i:[{t:3}],s:"oktober"}},{t:0,b:{t:2,i:[{t:3}],s:"november"}},{t:0,b:{t:2,i:[{t:3}],s:"december"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"jan"}},{t:0,b:{t:2,i:[{t:3}],s:"feb"}},{t:0,b:{t:2,i:[{t:3}],s:"mrt"}},{t:0,b:{t:2,i:[{t:3}],s:"apr"}},{t:0,b:{t:2,i:[{t:3}],s:"mei"}},{t:0,b:{t:2,i:[{t:3}],s:"jun"}},{t:0,b:{t:2,i:[{t:3}],s:"jul"}},{t:0,b:{t:2,i:[{t:3}],s:"aug"}},{t:0,b:{t:2,i:[{t:3}],s:"sep"}},{t:0,b:{t:2,i:[{t:3}],s:"okt"}},{t:0,b:{t:2,i:[{t:3}],s:"nov"}},{t:0,b:{t:2,i:[{t:3}],s:"dec"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:"."}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"1"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Pagina "},{t:4,k:"n"}]}}}}};export{t as default}; +const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Ongedaan maken"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"onbekend"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Niet-opgeslagen wijzigingen"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Annuleren"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Apparaten & diensten openen"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Opslaan & versturen"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Opslaan…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Actuele gegevens lezen"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 resultaat. Typ verder om te verfijnen."},{t:2,i:[{t:4,k:"n"},{t:3,v:" resultaten. Typ verder om te verfijnen."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Sluiten"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Verwijderen"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Wijzigen"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Laden…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Terug"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Kopiëren"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nieuw scherm"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware & USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alerts"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Instellingen"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Aansluiten en installeren"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Dat lukte niet. Vernieuw de pagina en probeer het opnieuw."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"API-sleutel gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"API-sleutel is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON van de indeling gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"JSON van de indeling is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Actienaam gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Actienaam is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"YAML is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Icoonnaam gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Icoonnaam is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Lege kleur gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Lege kleur is geselecteerd. Kopieer met Ctrl+C of Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Kleurnaam gekopieerd."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Kleurnaam is geselecteerd. Kopieer met Ctrl+C of Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Beheerpagina niet bereikbaar · opnieuw proberen…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant verbonden"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Verbinding met Home Assistant herstellen…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoeken"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Schermen"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Meer"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Vernieuwen"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Update"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Bijwerken"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"In de wachtrij voor de update"}},available:{t:0,b:{t:2,i:[{t:3,v:"Update "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Geen ESPHome-profiel met deze apparaatnaam gevonden."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Wat is er nieuw"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Volledig log"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"Eenmalig het IP-adres; nieuwe firmware meldt het zelf."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"IP-adres, bijv. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"IP-adres"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Starten"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Geïnstalleerd, maar nog niet in Home Assistant. Voeg het ontdekte ESPHome-apparaat toe onder Instellingen → Apparaten & diensten, plak daar de API-sleutel en zet bij Configureren “Allow the device to perform Home Assistant actions” aan."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware gedownload, nog niet in Home Assistant. Zet die met ESPHome Web op het scherm, voeg daarna het ontdekte ESPHome-apparaat toe onder Instellingen → Apparaten & diensten, plak daar de API-sleutel en sta bij Configureren de Home Assistant-acties toe."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Nog niet in Home Assistant. Al geflasht? Voeg het ESPHome-apparaat toe onder Instellingen → Apparaten & diensten en sta daarna bij Configureren de Home Assistant-acties toe. Nog niet geflasht? Firmware & USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"API-sleutel kopiëren"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Schermen"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Acties"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Toevoegen aan dit scherm"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Cheatsheet en een testalert"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Updates, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Niets om op te slaan"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Dit scherm identificeren"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Laat de backlight knipperen en toont een kaart"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Nieuwere firmware nodig"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Indeling exporteren"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Als JSON downloaden en kopiëren"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Zoek schermen, entiteiten, acties…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Niets gevonden. Typ een deel van een scherm, entiteit of actie."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Kies een scherm"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Kies links een van je schermen om de tegels, de bovenbalk en de instellingen aan te passen."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Begin met een scherm"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Sluit een CYD of Guition via USB aan op je Home Assistant-machine. Profiel, firmware en de eerste flash gebeuren in één keer."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Nieuw scherm installeren"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Je hebt niet-opgeslagen wijzigingen. Toch een ander scherm openen?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"De niet-opgeslagen indeling vervangen door een kopie van die van het andere scherm?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"De niet-opgeslagen indeling vervangen door de geïmporteerde?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. Je scherm wordt bijgewerkt."}},other:{t:0,b:{t:2,i:[{t:3,v:"Opgeslagen. "},{t:4,k:"name"},{t:3,v:" wordt bijgewerkt."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. Het scherm wordt bijgewerkt."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. Je laatste wijziging is nog niet verstuurd: druk nog eens op Opslaan & versturen."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" knippert en toont een paar seconden een kaart."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · wijzigingen worden bewaard"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Indeling"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Scherminstellingen"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen · naar scherm verstuurd"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Alles opgeslagen"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Meer"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificeren"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"scherm laten knipperen"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Firmware 0.2.31 of nieuwer nodig"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"uit Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Indeling kopiëren van…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" scherm"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" schermen"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"geen ander scherm"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" tegel"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" tegels"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Indeling exporteren"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Indeling importeren…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML-override"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"geavanceerd"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Geen ESPHome-profiel gevonden voor dit scherm"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Firmware bijwerken"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verwijderd"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Er is geen plek voor deze tegel op pagina "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Er is geen lege pagina voor een paginavullende tegel. Maak eerst een pagina vrij."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Dit scherm heeft al een tegel die naar pagina "},{t:4,k:"page"},{t:3,v:" gaat."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Indeling van "},{t:4,k:"name"},{t:3,v:" gekopieerd. Druk op Opslaan & versturen als alles klopt."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Indeling van "},{t:4,k:"name"},{t:3,v:" gekopieerd: "},{t:4,k:"kept"},{t:3,v:" van de "},{t:4,k:"total"},{t:3,v:" tegels passen bij de firmware van dit scherm. Druk op Opslaan & versturen als alles klopt."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Indeling geïmporteerd. Druk op Opslaan & versturen als alles klopt."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Indeling geïmporteerd: "},{t:4,k:"kept"},{t:3,v:" van de "},{t:4,k:"total"},{t:3,v:" tegels passen bij de firmware van dit scherm. Druk op Opslaan & versturen als alles klopt."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Dat is geen JSON. Exporteer eerst een indeling, of plak er een uit een andere ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Dit bestand heeft geen tegels. Gebruik een indeling die uit ESP Screens is geëxporteerd."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" pagina · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tegels"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" pagina's · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" tegels"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Voeg je eerste lamp, scène of apparaat toe uit de bibliotheek."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Tik op de bovenbalk of een tegel om die aan te passen. Sleep om te verplaatsen, of naar de volgende pagina voor een nieuwe pagina."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Lege plekken en vaste posities werken vanaf firmware 0.2.26. Tot die update schuift dit scherm (firmware "},{t:4,k:"firmware"},{t:3,v:") de tegels op naar de eerste vrije plek."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Schermindeling"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Pagina toevoegen"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maximaal 1 pagina"},{t:2,i:[{t:3,v:"Maximaal "},{t:4,k:"n"},{t:3,v:" pagina's"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Pagina "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Pagina weghalen"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"De pagina's erna schuiven een plek op"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Bovenbalk aanpassen"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Lege plek. Klik om hier een tegel toe te voegen, of sleep er een naartoe."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Lege plek "},{t:4,k:"slot"},{t:3,v:" op pagina "},{t:4,k:"page"},{t:3,v:": hier de volgende tegel toevoegen"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Volgende tegel komt hier"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Leeg"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bibliotheek"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entiteit"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entiteiten"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek op naam, apparaat of ruimte…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Voeg een entiteit toe"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Alles"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Lampen"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klimaat"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Schakelaars"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Acties"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilatoren"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Raambekleding"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scènes"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Stofzuigers"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensoren"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Weer"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Waarden"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Keuzelijsten"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Personen"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timers"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Scherm"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Ruimte"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Alle ruimtes"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Geplaatste verbergen"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Verberg wat al op dit scherm staat"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Alles hier staat al op dit scherm."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Geen entiteiten gevonden. Probeer een andere naam, ruimte of filter."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Op dit scherm past 1 tegel."},{t:2,i:[{t:3,v:"Op dit scherm passen "},{t:4,k:"n"},{t:3,v:" tegels."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Op dit scherm past 1 tegel; werk de firmware bij voor 48."},{t:2,i:[{t:3,v:"Op dit scherm passen "},{t:4,k:"n"},{t:3,v:" tegels; werk de firmware bij voor 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Sleep naar een pagina, of tik op + voor de eerste vrije plek. ⌘K doorzoekt alles."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Licht"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klimaat"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Stofzuiger"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilator"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Raambekleding"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Status"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Schakelaar"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Schakelaar"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scène"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Weer"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Waarde"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Waarde"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Keuzelijst"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Keuzelijst"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Actie"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Actie"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Scherm"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Zon"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Timer"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Persoon"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Camera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Afbeelding"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entiteit"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standaard"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"grote waarde"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"weersverwachting"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"grafiek"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"digitale klok"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"analoge klok"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"zonnebaan"}},live:{t:0,b:{t:2,i:[{t:3}],s:"livebeeld"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"albumhoes"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normaal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"dubbel"}},full:{t:0,b:{t:2,i:[{t:3}],s:"hele pagina"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Naam op het scherm"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (uit Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (standaard)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm toont een gekozen icoon vanaf firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Gaat naar pagina"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (leeg)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Navigatietegels hebben firmware 0.2.62 nodig: druk eerst bij het scherm op Bijwerken."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Dit scherm heeft geen pagina "},{t:4,k:"page"},{t:3,v:", dus een tik opent de laatste pagina. Kies een andere pagina."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Een tik op de tegel opent die pagina."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Weergave"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Digitale klok"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Analoge klok"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Naam en status"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Grote waarde"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Weersverwachting"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Grafiek"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Zonnebaan"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Livebeeld"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Een klein beeld van de camera op de plek van het icoon, ververst in het tempo hieronder zolang de pagina in beeld is. Een tik opent hem nog steeds schermvullend."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Een livebeeld heeft firmware 0.2.77 of nieuwer nodig: druk na het opslaan op Bijwerken bij het scherm."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Albumhoes"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"De albumhoes van wat er speelt op de plek van het icoon, zoals de eigen tile van Home Assistant; een speler zonder afbeelding houdt zijn icoon. Een tik opent nog steeds de kaart."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"De albumhoes op de tile heeft firmware 0.2.78 of nieuwer nodig: druk na het opslaan op Bijwerken bij het scherm."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant heeft geen getallen voor deze entiteit, dus de grafiek blijft leeg. Kies een andere weergave."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Deze weerdienst heeft geen dagverwachting in Home Assistant. Kies een andere weergave."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Verversen"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Elke "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Grootte"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normaal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Dubbelbreed"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Hele pagina"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Hele pagina: één grote knop in de eigen kleur van de tile; onderaan staat een slider, bediening of grafiek."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Een paginavullende tegel heeft firmware 0.2.62 nodig: druk eerst bij het scherm op Bijwerken."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pagina"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nieuwe pagina"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Directe bediening op de tegel"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant biedt deze bediening niet voor deze entiteit, dus die blijft leeg op het scherm. Kies een andere."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Onderaan de paginavullende tegel; een tik ergens anders werkt zoals hieronder ingesteld."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"Rechts op de dubbelbrede tegel, zoals de rijen in Home Assistant. Tikken op de naam werkt zoals hieronder ingesteld."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm toont directe bediening vanaf firmware 0.2.19; tot die tijd blijft de tegel zoals hij was."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Bij aantikken"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Bediening openen"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Alleen bekijken"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Aan / uit"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Actie uitvoeren"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant kan dit niet aan- en uitzetten, dus een tik doet niets. Kies een andere optie."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm schakelt dit vanaf firmware 0.2.58: druk bij het scherm op Bijwerken. Tot dan opent een tik de kaart."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Houd de tegel vast om de kaart te openen."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Kleine slider op de tegel"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Nee"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Ja, direct bedienen"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant heeft niets wat een slider bij deze entiteit kan aanpassen. Kies Nee."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Geschiedenis"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" uur"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" uur"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pastelachtergrond"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Achtergrond: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", plek "},{t:4,k:"slot"},{t:3,v:" op pagina "},{t:4,k:"page"},{t:3,v:". Enter: instellen, pijltjestoetsen: verplaatsen"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Tegel verwijderen"}},remove_named:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verwijderen"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Actie"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant vragen welke acties deze entiteit heeft…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant reageert nu niet. Probeer het zo nog eens."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Kies een actie"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek, bijvoorbeeld schakelen, positie of afspelen"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Zoek een actie"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Geen actie gevonden."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant biedt deze actie niet meer voor deze entiteit, dus een tik doet niets. Kies een andere."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (optioneel)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Niet ingesteld"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant heeft "},{t:4,k:"fields"},{t:3,v:" nodig."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm voert een actie uit vanaf firmware 0.2.58: druk bij het scherm op Bijwerken. Tot dan werkt een tik als Automatisch."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Icoon"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Geen icoon"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek, bijvoorbeeld lamp, muziek of deur"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Zoek een icoon"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Geen icoon, alleen tekst"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Icoon: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Geen icoon gevonden."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Actuele gegevens"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Verbinding, status en ondersteunde eigenschappen"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Lezen…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Actuele HA-status ophalen…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Status: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Kleine slider: "},{t:4,k:"slider"},{t:3,v:" · Weergave: "},{t:4,k:"display"},{t:3,v:" · Grootte: "},{t:4,k:"size"},{t:3,v:" · Bediening: "},{t:4,k:"control"},{t:3,v:" · Achtergrond: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"ja"}},no:{t:0,b:{t:2,i:[{t:3}],s:"nee"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"geen"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Standaard"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Opnieuw lezen"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" uit de bovenbalk gehaald"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"De bovenbalk heeft plaats voor 1 onderdeel."},{t:2,i:[{t:3,v:"De bovenbalk heeft plaats voor "},{t:4,k:"n"},{t:3,v:" onderdelen."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"Dit staat al in de bovenbalk."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Bovenbalk"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Bovenbalk: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Van het scherm zelf, werkt ook zonder Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" van "},{t:4,k:"n"},{t:3,v:" onderdeel"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" van "},{t:4,k:"n"},{t:3,v:" onderdelen"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Links: naam"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Bijvoorbeeld: Woonkamer"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Rechts: tijd, sensoren of een klok"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", plek "},{t:4,k:"slot"},{t:3,v:". Enter: instellen, pijltjes: verplaatsen"}]}},remove_named:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" uit de bovenbalk halen"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maximaal 1 onderdeel"},{t:2,i:[{t:3,v:"Maximaal "},{t:4,k:"n"},{t:3,v:" onderdelen"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Tijd, datum, analoge klok of een entiteit toevoegen"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Tijd, datum of entiteit toevoegen"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Niet alles past naast de naam: het scherm laat de gestreepte onderdelen weg. Haal er een weg of kies een kortere naam."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Sleep om de volgorde te wijzigen; tik op een onderdeel om het in te stellen."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensoren, de datum en de analoge klok verschijnen vanaf firmware "},{t:4,k:"version"},{t:3,v:"; tot die update toont dit scherm de naam en, als de tijd in de balk staat, de klok."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Verborgen: nu niet actief"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Past niet naast de naam"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Wijzerplaat"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Nu verborgen: niet actief"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Past nu niet naast de naam"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Zo staat het op het scherm"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Kleine wijzerplaat met de tijd"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Wat laten zien"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"“Laatst gewijzigd” telt op het scherm zelf door: “Zojuist”, “5 min geleden”, “Gisteren”."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch (zoals Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Tonen"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"“Alleen als actief” verbergt het onderdeel zolang het uit, dicht, afwezig of 0 is. Handig voor een open deur, een draaiende wasmachine of wie er thuis is."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"24-uursklok · wijzigen onder "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"12-uursklok · wijzigen onder "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Instellingen → Taal & regio"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Vandaag is het "},{t:4,k:"date"},{t:3,v:". De datum volgt de eigen klok van het scherm."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Omhoog"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Omlaag"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Toevoegen aan de bovenbalk"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" van "},{t:4,k:"n"},{t:3,v:" plek gebruikt"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" van "},{t:4,k:"n"},{t:3,v:" plekken gebruikt"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Van het scherm zelf"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Staat er al in"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Suggesties uit Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Een entiteit"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek op naam, ruimte of entiteit, bijv. temperatuur of deur"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Zoek een entiteit voor de bovenbalk"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Geen entiteiten gevonden."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helderheid"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Nacht"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Scherm"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helderheid"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Donkere modus"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch stand-by"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Stand-by na"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helderheid stand-by"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Nachtmodus"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Begint"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Eindigt"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Helderheid nacht"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Terug naar pagina 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Na"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Ook bij stand-by"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Vegen tussen pagina's"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Paginaknoppen"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotatie"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" sec"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" u"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" u "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" a.m."}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" p.m."}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"De instellingen van het andere scherm worden nog opgeslagen. Probeer het zo nog eens."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Paginaknoppen en vegen staan uit, dus alleen “Ga naar pagina”-tegels wisselen van pagina."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"pagina "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"pagina's "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegel, naar "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegels, naar "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegel, naar "},{t:4,k:"targets"},{t:3,v:", maar geen naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]},{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegels, naar "},{t:4,k:"targets"},{t:3,v:", maar geen naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegel, naar "},{t:4,k:"targets"},{t:3,v:", maar geen naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]},{t:2,i:[{t:3,v:"Je hebt "},{t:4,k:"n"},{t:3,v:" “Ga naar pagina”-tegels, naar "},{t:4,k:"targets"},{t:3,v:", maar geen naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Je hebt geen “Ga naar pagina”-tegels."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Je hebt geen “Ga naar pagina”-tegels naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Je hebt geen “Ga naar pagina”-tegels naar "},{t:4,k:"missing"},{t:3,v:", dus die kun je niet bereiken."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"De tegels naar "},{t:4,k:"pages"},{t:3,v:" staan alleen op pagina's die je niet kunt bereiken."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Vanaf "},{t:4,k:"pages"},{t:3,v:" leidt geen tegel terug naar pagina 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Dit scherm is offline. Je kunt de instellingen wijzigen zodra het terug is."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Wijzigingen gelden meteen op het scherm en verschijnen hier als ze daar veranderen."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Wijzigingen gelden meteen. Met firmware 0.2.49 bewaart het scherm ze zelf."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Deze entiteit is uitgeschakeld in Home Assistant, of het scherm herstart."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verlagen"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" verhogen"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Update starten…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Firmware bouwen…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Firmware via Wi-Fi schrijven…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen en installeren…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Wachten tot het scherm terug is…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Controleren of het stabiel blijft…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Nieuwe taal: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Schermen worden voortaan 's nachts automatisch bijgewerkt."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch bijwerken staat uit."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Firmware-updates"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Bezig met bijwerken naar firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Nog geen scherm gekoppeld. Nieuwe schermen krijgen firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" is beschikbaar voor "},{t:4,k:"n"},{t:3,v:" scherm."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" is beschikbaar voor "},{t:4,k:"n"},{t:3,v:" schermen."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Alle schermen hebben firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 scherm bijwerken"},{t:2,i:[{t:3,v:"Alle "},{t:4,k:"n"},{t:3,v:" schermen bijwerken"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Nieuw in firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Elke nacht automatisch bijwerken"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Tussen 03:00 en 06:00, één scherm tegelijk. Stopt bij een fout en meldt die in Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Skill geïnstalleerd. Claude Code vindt hem meteen."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Skill geïnstalleerd. Start Claude Code één keer opnieuw, zodat het de nieuwe skills-map vindt."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Leer Claude ESP Screens kennen en vraag dan: “Laat een melding zien op al mijn schermen als de brievenbus vol is.” Claude kent de gebeurtenissen van alerts en elk veld, elke kleur en elk icoon."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installeren voor Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Opnieuw installeren"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Skill bijwerken"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Niet geïnstalleerd"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Geïnstalleerd"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Geïnstalleerd · er is een nieuwere versie"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Voor Claude Code in Home Assistant. Schrijft één bestand naar "},{t:4,k:"path"},{t:3,v:"; opnieuw installeren vervangt het."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Downloaden voor claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Upload de zip in Claude onder Customize → Skills."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Alles rond je schermen."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Mijn schermen"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Schermen"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Voeg een scherm toe, of bouw en installeer de firmware van een bestaand scherm opnieuw."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen en installeren via USB of Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Taal & regio"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Taal van de schermen"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Taal van Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Taal van Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"De schermen gebruiken Engels tot de taal van Home Assistant beschikbaar is."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · nog niet nagekeken, hulp welkom"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" is nog niet nagekeken, hulp welkom: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"zo vertaal je mee"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Na een wijziging heeft elk scherm een firmware-update nodig, één build per scherm: met de knop Bijwerken, of via de nachtelijke updates."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Tijdnotatie"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatisch, volgt de taal ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 uur"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 uur"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Getalnotatie"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatisch, volgt de taal ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Je Home Assistant-profiel: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Deze gebruiken"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"De editor zelf volgt de taal van je Home Assistant-profiel."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. Elk scherm krijgt de nieuwe taal bij zijn volgende update."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Een kaart over het hele scherm vanuit een automatisering, op één scherm of op allemaal. De cheatsheet heeft de actienamen, velden, iconen en kleuren, en een formulier om er een te proberen."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Meldingen over het hele scherm, vanuit een automatisering"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Schermfirmware bouwen en installeren"}},intro:{t:0,b:{t:2,i:[{t:3,v:"De ingebouwde ESPHome CLI gebruikt je eigen profiel (YAML met sleutels) en secrets. Kies het profiel van het scherm, dan een USB-poort (scherm aan de Home Assistant-machine), "},{t:4,k:"ota"},{t:3,v:" met de hostnaam, of "},{t:4,k:"download"},{t:3,v:" om de firmware vanaf je eigen computer op het scherm te zetten. "},{t:4,k:"check"},{t:3,v:" valideert alleen, "},{t:4,k:"build"},{t:3,v:" compileert, "},{t:4,k:"install"},{t:3,v:" zet de firmware op het scherm. Je tegels blijven zoals ze in ESP Screens staan. De eerste build duurt enkele minuten."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Downloaden"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Controleren"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Alleen bouwen"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen & installeren"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen & downloaden"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"De ESPHome CLI ontbreekt. Werk de app bij naar 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Kies het bedoelde profiel, dan een USB-poort, een IP-adres of Downloaden."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome-profiel"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Installeren naar"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · nog geen bord gevonden op de Home Assistant-machine"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Downloaden · flashen vanaf je eigen computer"}},host:{t:0,b:{t:2,i:[{t:3}],s:"IP-adres of hostnaam"}},download_file:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" downloaden"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Zet het met "},{t:4,k:"esphome_web"},{t:3,v:" op het scherm, in Chrome of Edge: klik op Connect, kies de USB-poort van het scherm, klik op Install en selecteer dit bestand. Het bevat je Wi-Fi-wachtwoord en de sleutels van het scherm: houd het voor jezelf."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Aansluiten en installeren."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profiel bewaard."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Even geduld…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Klaar om te downloaden."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Klaar."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Dat lukte niet."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens maakt een eigen profiel voor het scherm, met unieke sleutels, en bouwt de firmware. Sluit het scherm met een USB-datakabel aan op de machine waarop Home Assistant draait, of download de firmware en zet die vanaf je eigen computer op het scherm."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Welk scherm heb je?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 inch"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 inch"}},board_elecrow:{t:0,b:{t:2,i:[{t:3}],s:"Elecrow CrowPanel · 7 inch"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Naam"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Scherm woonkamer"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Apparaatnaam"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"aanpassen"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Elk scherm krijgt een eigen profiel met eigen sleutels. Vier schermen? Doorloop dit vier keer met een andere naam."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Kleine letters, cijfers en streepjes. Elk scherm een andere naam."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi-naam (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi-wachtwoord"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Eén keer invullen: ESP Screens bewaart dit in ESPHome secrets.yaml, volgende schermen gebruiken het automatisch."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Je ESPHome secrets.yaml mist nog Wi-Fi-gegevens. ESP Screens vult alleen de ontbrekende regels aan."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi komt uit je ESPHome secrets.yaml."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"secrets.yaml in de ESPHome-map is geen geldige YAML. Herstel het bestand eerst; het wordt niet overschreven."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Installeren via"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Later · alleen het profiel bewaren"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Sluit het scherm met een USB-datakabel aan op de Home Assistant-machine; de lijst ververst vanzelf. Of kies Downloaden om je eigen computer te gebruiken."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Download de firmware en zet die vanaf je eigen computer op het scherm, in Chrome of Edge. Daarna gaan updates via Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Het profiel komt in de ESPHome-map. Installeren kan later via Firmware & USB, of vanuit ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Meer dan één bord aangesloten: kies de poort van dit scherm."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Eén keer via USB; daarna gaat alles draadloos."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Installeren"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Profiel bewaren"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Er loopt al een build of installatie ("},{t:4,k:"file"},{t:3,v:"). Wacht tot die klaar is."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"De ESPHome CLI ontbreekt in deze installatie; alleen het profiel bewaren kan."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" staat in de ESPHome-map"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Firmware naar "},{t:4,k:"name"},{t:3,v:" schrijven…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Firmware bouwen…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Firmware voor "},{t:4,k:"name"},{t:3,v:" is klaar"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Firmware staat op "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Bouwen mislukt"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Installeren mislukt"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Installeren kan later via Firmware & USB: kies dit profiel, dan de USB-poort van de Home Assistant-machine, of Downloaden om de firmware vanaf je eigen computer op het scherm te zetten. Bewaar de API-sleutel voor de koppeling:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Haal de USB-kabel nog niet los."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Een eerste build duurt op een Raspberry Pi enkele minuten. Je kunt deze pagina verlaten: de installatie loopt door en je vindt hem terug onder Nieuw scherm."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Een eerste build duurt op een Raspberry Pi enkele minuten. Je kunt deze pagina verlaten: de build loopt door en je vindt hem terug onder Nieuw scherm."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Zet de firmware vanaf je eigen computer op het scherm en koppel het scherm daarna aan Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm start op en verbindt met je Wi-Fi. Koppel het nu aan Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"Het scherm start op en verbindt met je Wi-Fi. De CYD vraagt eerst om een touch-kalibratie: tik op de kruisjes. Koppel het nu aan Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Bekijk het log hieronder."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" met een USB-datakabel."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Sluit het scherm aan op je computer"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" in Chrome of Edge, klik op Connect en kies de USB-poort van het scherm."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Open "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" en selecteer "},{t:4,k:"file"},{t:3,v:". Het scherm herstart en verbindt met je Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" en selecteer "},{t:4,k:"file"},{t:3,v:". Het scherm herstart en verbindt met je Wi-Fi. De CYD vraagt eerst om een touch-kalibratie: tik op de kruisjes."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Klik op Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Het bestand bevat je Wi-Fi-wachtwoord en de sleutels van het scherm: houd het voor jezelf."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"API-sleutel"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Dit gebeurt buiten ESP Screens. Home Assistant ontdekt "},{t:4,k:"name"},{t:3,v:" als ESPHome-apparaat; klik op Toevoegen. Niet ontdekt? Voeg ESPHome handmatig toe met het IP-adres van het scherm."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ga naar Home Assistant → Instellingen → Apparaten & diensten."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" van hierboven zodra Home Assistant om een encryptiesleutel vraagt."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Plak de API-sleutel"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" ESPHome-integratie → Configureren → “Allow the device to perform Home Assistant actions”. Zonder dit ziet het scherm alles, maar bedient het niets."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Sta HA-acties toe:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Terug in ESP Screens verschijnt het scherm binnen een halve minuut in de lijst links; tot die tijd staat het daar als “nog niet in Home Assistant”."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Kies je tegels."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Log van ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Opnieuw proberen"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Nog een scherm installeren"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Opnieuw beginnen"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Klaar"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alerts · cheatsheet"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Een melding over het hele scherm, vanuit een automatisering."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Elk scherm heeft de actie "},{t:4,k:"action"},{t:3,v:". Die legt een kaart over alles heen, wekt het scherm en houdt de backlight op de normale helderheid tot iemand op de knop tikt of de timeout verstrijkt. Home Assistant toont bij ESPHome-acties zelf geen uitleg of keuzelijsten; alles wat je kunt invullen staat hier."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"De cheatsheet laadt nog; even geduld."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Iemand belt aan"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Deur 3, achterkant"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Ik kom"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Onderdelen"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Uitproberen"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Jouw schermen"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"In een automatisering"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Alle schermen"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"De velden"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Iconen"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Kleuren"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Gedrag"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Gebeurtenissen"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Tips"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Stuur nu één alert, met dezelfde velden die een automatisering stuurt. Het scherm toont de kaart en laat, met knipperen aan, de backlight knipperen."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Scherm"}},all:{t:0,b:{t:2,i:[{t:3,v:"Alle schermen ("},{t:4,k:"ready"},{t:3,v:" klaar)"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · niet klaar"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Titel"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Ondertitel"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Icoon"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Kleur"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Knoptekst"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Timeout (seconden, 0 wacht op de knop)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Backlight laten knipperen"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Vier keer als de alert binnenkomt."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Versturen…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Alert versturen"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Verstuurd naar "},{t:4,k:"n"},{t:3,v:" scherm."}]},{t:2,i:[{t:3,v:"Verstuurd naar "},{t:4,k:"n"},{t:3,v:" schermen."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Verstuurd naar "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Verstuurd naar het scherm."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 overgeslagen (offline of oude firmware)."},{t:2,i:[{t:4,k:"n"},{t:3,v:" overgeslagen (offline of oude firmware)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Leeg gelaten: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Geen enkel scherm kon hem tonen: controleer of er een scherm online is met firmware "},{t:4,k:"version"},{t:3,v:" of nieuwer."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Wit (standaard)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Elk scherm heeft zijn eigen actie, met de apparaatnaam erin. Vanaf firmware "},{t:4,k:"version"},{t:3,v:"; een ouder scherm werk je bij met de knop Bijwerken onder Schermen."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nog geen scherm gekoppeld. Installeer er een via Nieuw scherm; de actie verschijnt zodra Home Assistant het scherm ziet."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Update nodig · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Apparaatnaam onbekend · werk het scherm bij"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Alert tonen"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Alert sluiten"}}},howto:{add:{t:0,b:{t:2,i:[{t:3,v:"Klik op "},{t:4,k:"add"},{t:3,v:" en zoek op "},{t:4,k:"esphome"},{t:3,v:". Kies de actie van je scherm: Home Assistant noemt die “Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"”."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Actie toevoegen"}},device:{t:0,b:{t:2,i:[{t:3}],s:"apparaatnaam"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant vraagt om alle zeven; laat wat je niet gebruikt leeg ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", uit)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Vul de velden in."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Liever YAML? Kies "},{t:4,k:"edit"},{t:3,v:" bij de actie en plak het voorbeeld hieronder."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Voorbeeld voor"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"een scherm (nog niet gekoppeld)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Bewerken in YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"YAML kopiëren"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Alle schermen tegelijk"}},text:{t:0,b:{t:2,i:[{t:3,v:"Vuur de gebeurtenis "},{t:4,k:"show"},{t:3,v:" af met dezelfde velden, en ESP Screens geeft de alert door aan elk scherm dat online is, ook aan schermen die je later toevoegt. "},{t:4,k:"dismiss"},{t:3,v:" haalt hem overal weg. Voeg in een automatisering de actie "},{t:4,k:"event"},{t:3,v:" toe, of plak het voorbeeld onder "},{t:4,k:"edit"},{t:3,v:". Laat de velden die je niet gebruikt weg. ESP Screens moet hiervoor draaien."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Handmatige gebeurtenis activeren"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Tekst is vrij in te vullen; de limiet is in bytes en een letter met accent telt voor twee. Wat niet past krijgt puntjes (titel) of valt weg (ondertitel)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Veld"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Type"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Wat het doet"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Voorbeeld"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limiet"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"tekst"}},int:{t:0,b:{t:2,i:[{t:3}],s:"getal"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"aan / uit"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entiteit"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"0 tot 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Vul de naam in bij "},{t:4,k:"field"},{t:3,v:", bijvoorbeeld "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" en de hex-codepoint ("},{t:4,k:"hex"},{t:3,v:") werken ook. Alleen deze iconen zitten in de firmware; elke andere naam toont de waarschuwingsdriehoek. Tik op een icoon om de naam te kopiëren."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Handig voor meldingen"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Zoek een icoon"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Zoek op naam of omschrijving…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Ook beschikbaar: bedienings- en weericonen"}},copy:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" kopiëren"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Geen icoon voor “"},{t:4,k:"query"},{t:3,v:"”. Onbekende namen tonen de waarschuwingsdriehoek ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Vul de naam in bij "},{t:4,k:"field"},{t:3,v:". Dit zijn de pasteltinten van de tegels, met donkere tekst. Leeg of onbekend geeft de witte kaart. Tik om te kopiëren."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Een alert maakt een gedimd of donker scherm meteen wakker en verschijnt boven elke pagina, elke open lichtkaart en de stand-bylaag."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wekt het scherm."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Zolang de kaart in beeld is, blijft de backlight op de normale helderheid. Stand-by en de nachturen wachten. Na de knop begint de gewone stand-bytijd opnieuw."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aan tot de knop."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" wacht op de knop, hoe lang dat ook duurt. Met "},{t:4,k:"minute"},{t:3,v:" verdwijnt de kaart na een minuut, maar de knop sluit hem eerder."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Timeout."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" laat de backlight vier keer knipperen als de alert binnenkomt (ongeveer een seconde) en laat het scherm daarna aan."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Knipperen."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Een nieuwe alert vervangt de huidige; er is geen stapel. De vervangen alert meldt zich als "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Vervangen."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" haalt de kaart weg, bijvoorbeeld als de deur al open is. Zonder alert doet die actie niets."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Op afstand sluiten."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" doet niets; alleen de knop sluit hem. Zo drukt een tik om het scherm te wekken de alert nooit per ongeluk weg."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tikken naast de kaart"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Elk einde vuurt de gebeurtenis "},{t:4,k:"event"},{t:3,v:" af, met "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (de apparaatnaam) en het "},{t:4,k:"device_id"},{t:3,v:" dat Home Assistant toevoegt. Te zien onder Instellingen → Hulpmiddelen → Gebeurtenissen."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Wanneer"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Wachten tot iemand op de knop drukt"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Gebruik een "},{t:4,k:"bold"},{t:3,v:": oranje voor de deur, rood voor rook of water, groen voor “klaar”. De tekst blijft altijd donker en leesbaar."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"kleur per soort melding"}},short:{t:0,b:{t:2,i:[{t:3,v:"Houd de titel "},{t:4,k:"bold"},{t:3,v:"; een scherm toont zo'n twintig tekens op één regel en kort een langere titel af met puntjes. Zet details in de ondertitel."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"kort"}},button:{t:0,b:{t:2,i:[{t:3,v:"Een "},{t:4,k:"bold"},{t:3,v:" maakt van de melding een vraag: “Ik kom”, “Gezien”, “Uitzetten”. De gebeurtenis vertelt je dan wie reageerde."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"eigen knoptekst"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Een alert die zichzelf oplost (de deur gaat open, de was is eruit gehaald) sluit je in dezelfde automatisering met "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Alle schermen? Vuur "},{t:4,k:"event"},{t:3,v:" één keer af (zie Alle schermen tegelijk). De schermen werken nog steeds los van elkaar en melden zich elk met hun eigen "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Liever "},{t:4,k:"bold"},{t:3,v:" om de automatisering te schrijven? Installeer de ESP Screens-skill onder Instellingen → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"Claude vragen"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Deurbel: toon de alert en wacht tot iemand op de knop drukt."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Er komt iemand naar de deur."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Geavanceerd · lokale override"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML-override"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML-override · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Dit kleine bestand is van jou. Het wordt na het gedeelde schermpakket geladen en blijft staan als ESP Screens wordt bijgewerkt. Pas hier hardwaredetails aan, zoals een displaymodel."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Wat kun je veilig aanpassen?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Display, touchscreen, substitutions, pinnen en andere apparaatdetails. Naam, Wi-Fi, API, OTA en de koppelingen naar de packages beheert ESP Screens zelf."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Actief"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Klaar om te koppelen"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"Lokale YAML-override"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Voorbeeld gebruiken"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Wissen"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 teken"},{t:2,i:[{t:4,k:"n"},{t:3,v:" tekens"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 regel"},{t:2,i:[{t:4,k:"n"},{t:3,v:" regels"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Opslaan & controleren"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Override opslaan"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Er is geen ESPHome-profiel gevonden voor dit scherm."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Wijzigingen hier gelden bij de volgende build."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Sla één keer op om dit bestand aan het profiel te koppelen."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Controleren en opslaan…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. De override blijft bewaard bij firmware-updates."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML-override opgeslagen."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Opgeslagen. ESPHome controleert het complete profiel…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome controleert het profiel…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome controleert het profiel… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Het complete profiel is geldig. Je kunt veilig bouwen en installeren."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome heeft het complete profiel afgekeurd. Zie Firmware & USB voor het volledige log."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"De huidige tekst vervangen door het voorbeeld?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Voorbeeld geladen. Sla het op zodra je klaar bent."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"De lokale override wissen?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Na opslaan is de override leeg."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Thuis"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Onbekend"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Verwarmen"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Koelen"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Verwarmen/koelen"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Droog"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Alleen ventilator"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"Verwarmen"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"Koelen"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactief"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Drogen"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilator"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Voorverwarmen"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Ontdooien"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"Openen"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"Sluiten"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"Speelt"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Gepauzeerd"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactief"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"Stand-by"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Thuis"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Afwezig"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Boven de horizon"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Onder de horizon"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Gedockt"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"Schoonmaken"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Gepauzeerd"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"Terugkeren naar dock"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inactief"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Zonnig"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Helder, nacht"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Bewolkt"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Half bewolkt"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Regenachtig"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Regen"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Sneeuwachtig"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Sneeuw-, regenachtig"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Mist"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Hagel"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Bliksem"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Bliksem, regenachtig"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Winderig"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Uitzonderlijk"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Laag"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normaal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Opladen"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet aan het opladen"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Koud"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Verbonden"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Verbroken"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Heet"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Licht gedetecteerd"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Geen licht"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Ontgrendeld"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Vergrendeld"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Nat"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Droog"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"Beweging"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Geen beweging"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Ingeplugd"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Losgekoppeld"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Thuis"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Afwezig"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Probleem"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"Actief"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet actief"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Onveilig"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Veilig"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Sabotage ontdekt"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Update beschikbaar"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Up-to-date"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Gedetecteerd"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Niet gedetecteerd"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Open"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Dicht"}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Niet beschikbaar"}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Inschakelen"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Uitvoeren"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Klik"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatisch"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Laag"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Gemiddeld"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Hoog"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Midden"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Concentratie"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Diffuus"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Boven"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Aan"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Uit"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Beide"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Verticaal"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontaal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Zojuist"}},minutes_ago:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min geleden"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 uur geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" uur geleden"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Gisteren"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 dag geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" dagen geleden"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 week geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" weken geleden"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 maand geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" maanden geleden"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 jaar geleden"},{t:2,i:[{t:4,k:"n"},{t:3,v:" jaar geleden"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Over "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Over 1 uur"},{t:2,i:[{t:3,v:"Over "},{t:4,k:"n"},{t:3,v:" uur"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Morgen"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Over 1 dag"},{t:2,i:[{t:3,v:"Over "},{t:4,k:"n"},{t:3,v:" dagen"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"a.m."}},pm:{t:0,b:{t:2,i:[{t:3}],s:"p.m."}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"zondag"}},{t:0,b:{t:2,i:[{t:3}],s:"maandag"}},{t:0,b:{t:2,i:[{t:3}],s:"dinsdag"}},{t:0,b:{t:2,i:[{t:3}],s:"woensdag"}},{t:0,b:{t:2,i:[{t:3}],s:"donderdag"}},{t:0,b:{t:2,i:[{t:3}],s:"vrijdag"}},{t:0,b:{t:2,i:[{t:3}],s:"zaterdag"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"zo"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"di"}},{t:0,b:{t:2,i:[{t:3}],s:"wo"}},{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"vr"}},{t:0,b:{t:2,i:[{t:3}],s:"za"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"zo"}},{t:0,b:{t:2,i:[{t:3}],s:"ma"}},{t:0,b:{t:2,i:[{t:3}],s:"di"}},{t:0,b:{t:2,i:[{t:3}],s:"wo"}},{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"vr"}},{t:0,b:{t:2,i:[{t:3}],s:"za"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"januari"}},{t:0,b:{t:2,i:[{t:3}],s:"februari"}},{t:0,b:{t:2,i:[{t:3}],s:"maart"}},{t:0,b:{t:2,i:[{t:3}],s:"april"}},{t:0,b:{t:2,i:[{t:3}],s:"mei"}},{t:0,b:{t:2,i:[{t:3}],s:"juni"}},{t:0,b:{t:2,i:[{t:3}],s:"juli"}},{t:0,b:{t:2,i:[{t:3}],s:"augustus"}},{t:0,b:{t:2,i:[{t:3}],s:"september"}},{t:0,b:{t:2,i:[{t:3}],s:"oktober"}},{t:0,b:{t:2,i:[{t:3}],s:"november"}},{t:0,b:{t:2,i:[{t:3}],s:"december"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"jan"}},{t:0,b:{t:2,i:[{t:3}],s:"feb"}},{t:0,b:{t:2,i:[{t:3}],s:"mrt"}},{t:0,b:{t:2,i:[{t:3}],s:"apr"}},{t:0,b:{t:2,i:[{t:3}],s:"mei"}},{t:0,b:{t:2,i:[{t:3}],s:"jun"}},{t:0,b:{t:2,i:[{t:3}],s:"jul"}},{t:0,b:{t:2,i:[{t:3}],s:"aug"}},{t:0,b:{t:2,i:[{t:3}],s:"sep"}},{t:0,b:{t:2,i:[{t:3}],s:"okt"}},{t:0,b:{t:2,i:[{t:3}],s:"nov"}},{t:0,b:{t:2,i:[{t:3}],s:"dec"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:" "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:"."}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"1"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Pagina "},{t:4,k:"n"}]}}}}};export{t as default}; diff --git a/screen_manager/app/static/assets/pl-DSfDGiw6.js b/screen_manager/app/static/assets/pl-B4qhbPaP.js similarity index 57% rename from screen_manager/app/static/assets/pl-DSfDGiw6.js rename to screen_manager/app/static/assets/pl-B4qhbPaP.js index 42305fc..1199ec1 100644 --- a/screen_manager/app/static/assets/pl-DSfDGiw6.js +++ b/screen_manager/app/static/assets/pl-B4qhbPaP.js @@ -1 +1 @@ -const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Cofnij"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"nieznany"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Niezapisane zmiany"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Anuluj"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Otwórz Urządzenia oraz usługi"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz i wyślij"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Zapisywanie…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Odczytaj bieżące dane"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 wynik. Pisz dalej, aby zawęzić."},{t:2,i:[{t:4,k:"n"},{t:3,v:" wyniki. Pisz dalej, aby zawęzić."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" wyników. Pisz dalej, aby zawęzić."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Zamknij"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Usuń"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Zmień"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Ładowanie…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Wstecz"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Kopiuj"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nowy ekran"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware i USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alerty"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz i zainstaluj"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się. Odśwież stronę i spróbuj ponownie."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano klucz API."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Klucz API jest zaznaczony. Skopiuj skrótem Ctrl+C lub Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano JSON układu."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"JSON układu jest zaznaczony. Skopiuj skrótem Ctrl+C lub Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano nazwę akcji."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa akcji jest zaznaczona. Skopiuj skrótem Ctrl+C lub Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano YAML."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"YAML jest zaznaczony. Skopiuj skrótem Ctrl+C lub Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano nazwę ikony."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa ikony jest zaznaczona. Skopiuj skrótem Ctrl+C lub Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano pusty kolor."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Pusty kolor jest zaznaczony. Skopiuj skrótem Ctrl+C lub Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano nazwę koloru."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa koloru jest zaznaczona. Skopiuj skrótem Ctrl+C lub Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Strona zarządzania nieosiągalna · ponawianie…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Połączono z Home Assistant"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Ponowne łączenie z Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Więcej"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Odśwież"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizacja"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizuj"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"W kolejce do aktualizacji"}},available:{t:0,b:{t:2,i:[{t:3,v:"Aktualizacja "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono profilu ESPHome o tej nazwie urządzenia."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Co nowego"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Pełny log"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"Adres IP, tylko ten jeden raz; nowy firmware sam go zgłasza."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Adres IP, np. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Adres IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Rozpocznij"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Zainstalowany, ale jeszcze nie w Home Assistant. Dodaj wykryte urządzenie ESPHome w sekcji Ustawienia → Urządzenia oraz usługi, wklej tam klucz API, a potem kliknij „Konfiguruj” i włącz „Zezwól urządzeniu na wykonywanie akcji Home Assistant”."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware pobrany, jeszcze nie w Home Assistant. Wgraj go na ekran przez ESPHome Web, potem dodaj wykryte urządzenie ESPHome w sekcji Ustawienia → Urządzenia oraz usługi, wklej tam klucz API, kliknij „Konfiguruj” i zezwól na akcje Home Assistant."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Jeszcze nie w Home Assistant. Firmware już wgrany? Dodaj urządzenie ESPHome w sekcji Ustawienia → Urządzenia oraz usługi, potem kliknij „Konfiguruj” i zezwól na akcje Home Assistant. Jeszcze nie wgrany? Firmware i USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Kopiuj klucz API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Polecenia"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj do tego ekranu"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Ściąga i alert testowy"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizacje, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nic do zapisania"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Zidentyfikuj ten ekran"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Miga podświetleniem i pokazuje kartę"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Wymaga nowszej wersji firmware"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Eksportuj układ"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz i skopiuj jako JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj ekranów, encji, poleceń…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Brak wyników. Wpisz część nazwy ekranu, encji lub polecenia."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz ekran"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz jeden ze swoich ekranów po lewej, aby zmienić jego kafelki, górny pasek i ustawienia."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Zacznij od ekranu"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz CYD lub Guition przez USB do komputera z Home Assistant. Profil, firmware i pierwsze wgranie za jednym razem."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj nowy ekran"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Masz niezapisane zmiany. Mimo to otworzyć inny ekran?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Zastąpić niezapisany układ kopią układu innego ekranu?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Zastąpić niezapisany układ zaimportowanym?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Twój ekran jest aktualizowany."}},other:{t:0,b:{t:2,i:[{t:3,v:"Zapisano. Trwa aktualizacja: "},{t:4,k:"name"},{t:3,v:"."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Ekran jest aktualizowany."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Twoja najnowsza zmiana nie została jeszcze wysłana: naciśnij ponownie „Zapisz i wyślij”."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" miga i przez kilka sekund pokazuje kartę."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · zmiany są zapisywane"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Układ"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia ekranu"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano · wysłano na ekran"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Wszystko zapisane"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Więcej"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identyfikuj"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"mignij ekranem"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Wymaga wersji firmware 0.2.31 lub nowszej"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"z Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Kopiuj układ z…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ekran"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ekrany"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ekranów"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"brak innych ekranów"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" kafelek"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" kafelki"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" kafelków"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Eksportuj układ"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importuj układ…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"Nadpisanie YAML"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"zaawansowane"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono profilu ESPHome dla tego ekranu"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizuj firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Usunięto: "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Na stronie "},{t:4,k:"page"},{t:3,v:" nie ma miejsca na ten kafelek."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Brak wolnej strony dla kafelka na całą stronę. Najpierw zwolnij stronę."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Ten ekran ma już kafelek, który prowadzi do strony "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Skopiowano układ ekranu "},{t:4,k:"name"},{t:3,v:". Gdy wygląda dobrze, naciśnij „Zapisz i wyślij”."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Skopiowano układ ekranu "},{t:4,k:"name"},{t:3,v:". Kafelki zgodne z firmware tego ekranu: "},{t:4,k:"kept"},{t:3,v:" z "},{t:4,k:"total"},{t:3,v:". Gdy wygląda dobrze, naciśnij „Zapisz i wyślij”."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Zaimportowano układ. Gdy wygląda dobrze, naciśnij „Zapisz i wyślij”."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Zaimportowano układ. Kafelki zgodne z firmware tego ekranu: "},{t:4,k:"kept"},{t:3,v:" z "},{t:4,k:"total"},{t:3,v:". Gdy wygląda dobrze, naciśnij „Zapisz i wyślij”."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"To nie jest JSON. Najpierw wyeksportuj układ albo wklej układ z innej instalacji ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Brak kafelków w tym pliku. Oczekiwano układu wyeksportowanego z ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" strona · kafelki: "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" strony · kafelki: "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" stron · kafelki: "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj pierwsze światło, scenę lub urządzenie z biblioteki."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Kliknij górny pasek lub kafelek, aby go zmienić. Przeciągnij, aby przenieść; upuść na następnej stronie, aby utworzyć nową."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Puste miejsca i stałe pozycje działają od wersji firmware 0.2.26. Do czasu tej aktualizacji ten ekran (firmware "},{t:4,k:"firmware"},{t:3,v:") przesuwa kafelki w górę, na pierwsze wolne miejsce."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Układ ekranu"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Dodaj stronę"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maksymalnie 1 strona"},{t:2,i:[{t:3,v:"Maksymalnie "},{t:4,k:"n"},{t:3,v:" strony"}]},{t:2,i:[{t:3,v:"Maksymalnie "},{t:4,k:"n"},{t:3,v:" stron"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Strona "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Usuń stronę"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Strony po tej przesuną się o jedno miejsce w górę"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Edytuj górny pasek"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Puste miejsce. Kliknij, aby dodać tu kafelek, albo przeciągnij go tutaj."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Puste miejsce "},{t:4,k:"slot"},{t:3,v:" na stronie "},{t:4,k:"page"},{t:3,v:": dodaj tu następny kafelek"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Tu trafi następny kafelek"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Puste"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Biblioteka"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" encja"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" encje"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" encji"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj po nazwie, urządzeniu lub obszarze…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj encję"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Wszystkie"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Światła"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klimat"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Przełączniki"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Stan"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Akcje"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Skrypty"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Wentylatory"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Osłony"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Sceny"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Odkurzacze"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensory"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Pogoda"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Wartości"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selektory"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Osoby"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Minutniki"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ekran"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Obszar"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Wszystkie obszary"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Ukryj dodane"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Ukryj to, co już jest na tym ekranie"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Wszystko z tej listy jest już na tym ekranie."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono encji. Spróbuj innej nazwy, obszaru lub filtra."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Ten ekran mieści 1 kafelek."},{t:2,i:[{t:3,v:"Ten ekran mieści "},{t:4,k:"n"},{t:3,v:" kafelki."}]},{t:2,i:[{t:3,v:"Ten ekran mieści "},{t:4,k:"n"},{t:3,v:" kafelków."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Ten ekran mieści 1 kafelek; zaktualizuj jego firmware, aby zmieścić 48."},{t:2,i:[{t:3,v:"Ten ekran mieści "},{t:4,k:"n"},{t:3,v:" kafelki; zaktualizuj jego firmware, aby zmieścić 48."}]},{t:2,i:[{t:3,v:"Ten ekran mieści "},{t:4,k:"n"},{t:3,v:" kafelków; zaktualizuj jego firmware, aby zmieścić 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Przeciągnij na stronę albo kliknij +, aby dodać w pierwszym wolnym miejscu. ⌘K przeszukuje wszystko."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Światło"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klimat"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Odkurzacz"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Wentylator"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Osłona"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Stan"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Przełącznik"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Przełącznik"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scena"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Skrypt"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Pogoda"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Wartość"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Wartość"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selektor"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Selektor"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Akcja"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Akcja"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ekran"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Słońce"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Minutnik"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Osoba"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Kamera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Obraz"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Encja"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standardowy"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"duża wartość"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"prognoza pogody"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"wykres"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"zegar cyfrowy"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"zegar analogowy"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"tor słońca"}},live:{t:0,b:{t:2,i:[{t:3}],s:"obraz na żywo"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"okładka albumu"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normalny"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"podwójny"}},full:{t:0,b:{t:2,i:[{t:3}],s:"cała strona"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa na ekranie"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatycznie (z Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatycznie (domyślna)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ekran pokazuje wybraną ikonę od wersji firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Przechodzi do strony"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (pusta)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Kafelki nawigacji wymagają wersji firmware 0.2.62: najpierw naciśnij „Aktualizuj” przy tym ekranie."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Ten ekran nie ma strony "},{t:4,k:"page"},{t:3,v:", więc dotknięcie otwiera jego ostatnią stronę. Wybierz inną stronę."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Dotknięcie kafelka otwiera tę stronę."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Widok"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Zegar cyfrowy"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Zegar analogowy"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa i stan"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Duża wartość"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Prognoza pogody"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Wykres"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Tor słońca"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Obraz na żywo"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Mały obraz z kamery w miejscu ikony, odświeżany w tempie poniżej, dopóki strona jest na ekranie. Dotknięcie nadal otwiera go na pełnym ekranie."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Obraz na żywo wymaga firmware 0.2.77 lub nowszego: po zapisaniu naciśnij Aktualizuj przy ekranie."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Okładka albumu"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"Okładka albumu tego, co gra, w miejscu ikony, jak na kafelku Home Assistant; odtwarzacz bez obrazu zachowuje ikonę. Dotknięcie nadal otwiera kartę."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Okładka albumu na kafelku wymaga firmware 0.2.78 lub nowszego: po zapisaniu naciśnij Aktualizuj przy ekranie."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie ma wartości liczbowych dla tej encji, więc wykres pozostanie pusty. Wybierz inny widok."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Ta usługa pogodowa nie ma prognozy dziennej w Home Assistant. Wybierz inny widok."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Odświeżanie"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Co "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Rozmiar"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normalny"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Podwójna szerokość"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Cała strona"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cała strona: jeden duży przycisk w kolorze kafelka; suwak, przyciski lub wykres są na jego dole."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Kafelek na całą stronę wymaga wersji firmware 0.2.62: najpierw naciśnij „Aktualizuj” przy tym ekranie."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Strona"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nowa strona"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Bezpośrednie sterowanie na kafelku"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie oferuje tego sterowania dla tej encji, więc na ekranie to miejsce pozostanie puste. Wybierz inne."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Na dole kafelka na całą stronę; dotknięcie w innym miejscu działa zgodnie z ustawieniem poniżej."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"Po prawej stronie kafelka podwójnej szerokości, jak w wierszach encji w Home Assistant. Dotknięcie nazwy działa zgodnie z ustawieniem poniżej."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ekran pokazuje bezpośrednie sterowanie od wersji firmware 0.2.19; do tego czasu kafelek pozostaje bez zmian."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Po dotknięciu"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatycznie"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Otwórz sterowanie"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Tylko podgląd"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Włącz / wyłącz"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Wykonaj akcję"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie może tego włączać ani wyłączać, więc dotknięcie nic nie robi. Wybierz inną opcję."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Włączanie i wyłączanie dotknięciem działa od wersji firmware 0.2.58: naciśnij „Aktualizuj” przy tym ekranie. Do tego czasu dotknięcie otwiera kartę."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Przytrzymaj kafelek, aby otworzyć jego kartę."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mały suwak na kafelku"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Nie"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Tak, steruj bezpośrednio"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie ma dla tej encji niczego, co suwak mógłby zmieniać. Wybierz „Nie”."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Historia"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" godzina"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" godziny"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" godzin"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pastelowe tło"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Tło: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", miejsce "},{t:4,k:"slot"},{t:3,v:" na stronie "},{t:4,k:"page"},{t:3,v:". Enter: konfiguruj, strzałki: przenieś"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Usuń kafelek"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Usuń "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Akcja"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Pobieranie akcji tej encji z Home Assistant…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant teraz nie odpowiada. Spróbuj ponownie za chwilę."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz akcję"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj, na przykład toggle, position lub play"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj akcji"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono akcji."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie oferuje już tej akcji dla tej encji, więc dotknięcie nic nie robi. Wybierz inną."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (opcjonalnie)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Nie ustawiono"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Włączone"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Wyłączone"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant wymaga: "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ekran wykonuje akcje od wersji firmware 0.2.58: naciśnij „Aktualizuj” przy tym ekranie. Do tego czasu dotknięcie działa jak „Automatycznie”."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Ikona"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Bez ikony"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj, na przykład lampa, muzyka lub drzwi"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj ikony"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Bez ikony, tylko tekst"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Ikona: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono ikony."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bieżące dane"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Połączenie, stan i obsługiwane właściwości"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Odczytywanie…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Pobieranie bieżącego stanu z HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Stan: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Mały suwak: "},{t:4,k:"slider"},{t:3,v:" · Widok: "},{t:4,k:"display"},{t:3,v:" · Rozmiar: "},{t:4,k:"size"},{t:3,v:" · Sterowanie: "},{t:4,k:"control"},{t:3,v:" · Tło: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"tak"}},no:{t:0,b:{t:2,i:[{t:3}],s:"nie"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Domyślne"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Odczytaj ponownie"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Usunięto z górnego paska: "},{t:4,k:"name"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Górny pasek mieści 1 element."},{t:2,i:[{t:3,v:"Górny pasek mieści "},{t:4,k:"n"},{t:3,v:" elementy."}]},{t:2,i:[{t:3,v:"Górny pasek mieści "},{t:4,k:"n"},{t:3,v:" elementów."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"To już jest na górnym pasku."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Górny pasek"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Górny pasek: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Z samego ekranu, działa też bez Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" elementu"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" elementów"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" elementów"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Po lewej: nazwa"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Na przykład: Salon"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Po prawej: godzina, sensory lub zegar"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", miejsce "},{t:4,k:"slot"},{t:3,v:". Enter: konfiguruj, strzałki: przenieś"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Usuń "},{t:4,k:"name"},{t:3,v:" z górnego paska"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maksymalnie 1 element"},{t:2,i:[{t:3,v:"Maksymalnie "},{t:4,k:"n"},{t:3,v:" elementy"}]},{t:2,i:[{t:3,v:"Maksymalnie "},{t:4,k:"n"},{t:3,v:" elementów"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj godzinę, datę, zegar analogowy lub encję"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Dodaj godzinę, datę lub encję"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Nie wszystko mieści się obok nazwy: ekran pomija elementy z przerywaną ramką. Usuń jeden z nich albo wybierz krótszą nazwę."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Przeciągnij, aby zmienić kolejność; kliknij element, aby go skonfigurować."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensory, data i zegar analogowy pojawiają się od wersji firmware "},{t:4,k:"version"},{t:3,v:"; do tej aktualizacji ekran pokazuje nazwę oraz zegar, jeśli godzina jest na pasku."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Ukryty: teraz nieaktywny"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Nie mieści się obok nazwy"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Tarcza"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Teraz ukryty: nieaktywny"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Obecnie nie mieści się obok nazwy"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Tak wygląda na ekranie"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Mała tarcza z godziną"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Co pokazać"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"„Ostatnia zmiana” aktualizuje się na samym ekranie: „Przed chwilą”, „5 min temu”, „Wczoraj”."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatycznie (jak w Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pokazuj"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"„Tylko gdy aktywne” ukrywa element, dopóki jest wyłączony, zamknięty, poza domem albo równy 0. Przydatne dla otwartych drzwi, pracującej pralki albo tego, kto jest w domu."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Zegar 24-godzinny · zmiana: "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Zegar 12-godzinny · zmiana: "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia → Język i region"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Dziś: "},{t:4,k:"date"},{t:3,v:". Data pochodzi z zegara samego ekranu."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ W górę"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ W dół"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj do górnego paska"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Zajęto "},{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" miejsca"}]},{t:2,i:[{t:3,v:"Zajęto "},{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" miejsc"}]},{t:2,i:[{t:3,v:"Zajęto "},{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" miejsc"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Z samego ekranu"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Już dodano"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Propozycje z Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Encja"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj po nazwie, obszarze lub encji, np. temperatura albo drzwi"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj encji dla górnego paska"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono encji."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Jasność"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Noc"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ekran"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Jasność"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Tryb ciemny"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Auto czuwanie"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Czuwanie po"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Jasność czuwania"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Tryb nocny"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Początek"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Koniec"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Jasność nocna"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Wróć do strony 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Po"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Także w czuwaniu"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Przesuwanie stron"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Przyciski stron"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Obrót"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" godz."}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" godz. "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Trwa jeszcze zapisywanie ustawień innego ekranu. Spróbuj ponownie za chwilę."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Przyciski stron i przesuwanie są wyłączone, więc stronę zmieniają tylko kafelki „Przejdź do strony”."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"strony "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"stron "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"stron "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelek „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:")."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelki „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:")."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelków „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:")."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelek „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do niej dotrzeć."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelki „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do niej dotrzeć."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelków „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do niej dotrzeć."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelek „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do nich dotrzeć."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelki „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do nich dotrzeć."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelków „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do nich dotrzeć."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nie masz kafelków „Przejdź do strony”."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Żaden kafelek „Przejdź do strony” nie prowadzi do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do niej dotrzeć."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Żaden kafelek „Przejdź do strony” nie prowadzi do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do nich dotrzeć."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Kafelki do "},{t:4,k:"pages"},{t:3,v:" są tylko na stronach, do których nie możesz dotrzeć."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Ze "},{t:4,k:"pages"},{t:3,v:" żaden kafelek nie prowadzi z powrotem do strony 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Ten ekran jest offline. Jego ustawienia można zmienić, gdy wróci."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Zmiany działają na ekranie od razu, a gdy zmienisz coś na ekranie, zobaczysz to tutaj."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Zmiany działają od razu. Od wersji firmware 0.2.49 ekran przechowuje je sam."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Ta encja jest wyłączona w Home Assistant albo ekran uruchamia się ponownie."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": zmniejsz"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": zwiększ"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Rozpoczynanie aktualizacji…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Kompilowanie firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Wgrywanie firmware przez Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Kompilowanie i instalowanie…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Oczekiwanie na powrót ekranu…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Sprawdzanie, czy działa stabilnie…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Nowy język: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany będą teraz aktualizowane automatycznie w nocy."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Automatyczne aktualizacje są wyłączone."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizacje firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Aktualizowanie do firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Nie sparowano jeszcze żadnego ekranu. Nowe ekrany dostaną firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" jest dostępny dla "},{t:4,k:"n"},{t:3,v:" ekranu."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" jest dostępny dla "},{t:4,k:"n"},{t:3,v:" ekranów."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" jest dostępny dla "},{t:4,k:"n"},{t:3,v:" ekranów."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Wszystkie ekrany mają firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Aktualizuj 1 ekran"},{t:2,i:[{t:3,v:"Aktualizuj wszystkie ekrany ("},{t:4,k:"n"},{t:3,v:")"}]},{t:2,i:[{t:3,v:"Aktualizuj wszystkie ekrany ("},{t:4,k:"n"},{t:3,v:")"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Co nowego w firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizuj automatycznie co noc"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Między 03:00 a 06:00, po jednym ekranie naraz. Przy błędzie zatrzymuje się i zgłasza go w Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Umiejętność zainstalowana. Claude Code od razu ją wykrywa."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Umiejętność zainstalowana. Uruchom ponownie Claude Code jeden raz, aby znalazł nowy folder umiejętności."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Dzięki tej umiejętności Claude pozna ESP Screens. Potem poproś: „Pokaż alert na wszystkich moich ekranach, gdy skrzynka na listy jest pełna”. Claude zna zdarzenia alertów, każde pole, kolor i ikonę."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj dla Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj ponownie"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Zaktualizuj umiejętność"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Nie zainstalowano"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Zainstalowano"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Zainstalowano · dostępna jest nowsza wersja"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Dla Claude Code w Home Assistant. Zapisuje jeden plik w "},{t:4,k:"path"},{t:3,v:"; ponowna instalacja go zastępuje."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz dla claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Prześlij plik zip w Claude: Customize → Skills."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Wszystko wokół Twoich ekranów."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Moje ekrany"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj ekran albo skompiluj i ponownie zainstaluj firmware ekranu, który już masz."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Kompiluj i instaluj przez USB lub Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Język i region"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Język ekranów"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Język Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Język Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany używają angielskiego, dopóki język Home Assistant nie będzie dostępny."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · jeszcze niesprawdzony, pomoc mile widziana"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" nie jest jeszcze sprawdzony, pomoc mile widziana: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"jak tłumaczyć"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Po zmianie każdy ekran wymaga aktualizacji firmware, po jednej kompilacji na ekran: przyciskiem „Aktualizuj” albo w nocnych aktualizacjach."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Format czasu"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatycznie, według języka ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24-godzinny"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12-godzinny"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Format liczbowy"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatycznie, według języka ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Twój profil Home Assistant: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Użyj tych"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"Sam edytor używa języka Twojego profilu Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Każdy ekran przejdzie na nowy język przy najbliższej aktualizacji."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Karta na cały ekran uruchamiana z automatyzacji, na jednym ekranie lub na wszystkich. Ściąga zawiera nazwy akcji, pola, ikony i kolory oraz formularz do wypróbowania alertu."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Powiadomienia na cały ekran, z automatyzacji"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Kompiluj i instaluj firmware ekranu"}},intro:{t:0,b:{t:2,i:[{t:3,v:"Wbudowane narzędzie ESPHome CLI korzysta z Twojego własnego profilu (YAML z kluczami) i sekretów. Wybierz profil ekranu, a potem port USB (ekran podłączony do komputera z Home Assistant), "},{t:4,k:"ota"},{t:3,v:" z nazwą hosta albo "},{t:4,k:"download"},{t:3,v:", aby wgrać firmware na ekran z własnego komputera. "},{t:4,k:"check"},{t:3,v:" tylko sprawdza poprawność, "},{t:4,k:"build"},{t:3,v:" kompiluje, "},{t:4,k:"install"},{t:3,v:" wgrywa firmware na ekran. Twoje kafelki w ESP Screens zostają bez zmian. Pierwsza kompilacja trwa kilka minut."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Sprawdź"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Tylko kompiluj"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Kompiluj i zainstaluj"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Kompiluj i pobierz"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Brak narzędzia ESPHome CLI. Zaktualizuj aplikację do wersji 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz właściwy profil, a potem port USB, adres IP lub „Pobierz”."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Profil ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj na"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · nie znaleziono jeszcze płytki na komputerze z Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz · wgraj z własnego komputera"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Adres IP lub nazwa hosta"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Pobierz "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Wgraj go na ekran przez "},{t:4,k:"esphome_web"},{t:3,v:" w Chrome lub Edge: „Connect”, wybierz port USB ekranu, „Install” i wskaż ten plik. Zawiera Twoje hasło Wi-Fi i klucze ekranu: nie udostępniaj go nikomu."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz i zainstaluj."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profil zapisany."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Chwileczkę…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Gotowe do pobrania."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Gotowe."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens tworzy własny profil ekranu z unikalnymi kluczami i kompiluje firmware. Podłącz ekran kablem USB do transmisji danych do komputera z Home Assistant albo pobierz firmware i wgraj go na ekran z własnego komputera."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Jaki masz ekran?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 cala"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 cale"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Ekran w salonie"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa urządzenia"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"dostosuj"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Każdy ekran dostaje własny profil z własnymi kluczami. Cztery ekrany? Przejdź przez to cztery razy, za każdym razem z inną nazwą."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Małe litery, cyfry i myślniki. Inna nazwa dla każdego ekranu."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa sieci Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Hasło Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Wypełnij raz: ESP Screens zapisze to w pliku secrets.yaml ESPHome, a kolejne ekrany użyją tego automatycznie."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"W Twoim pliku secrets.yaml ESPHome wciąż brakuje danych Wi-Fi. ESP Screens uzupełni tylko brakujące wiersze."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Dane Wi-Fi pochodzą z Twojego pliku secrets.yaml ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Plik secrets.yaml w folderze ESPHome nie jest poprawnym YAML. Najpierw popraw plik; nie zostanie nadpisany."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj przez"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Później · tylko zapisz profil"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz ekran kablem USB do transmisji danych do komputera z Home Assistant; lista odświeża się sama. Albo wybierz „Pobierz”, aby użyć własnego komputera."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz firmware i wgraj go na ekran z własnego komputera, w Chrome lub Edge. Potem aktualizacje idą przez Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Profil trafi do folderu ESPHome. Zainstalujesz go później w sekcji „Firmware i USB” albo w ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Podłączono więcej niż jedną płytkę: wybierz port tego ekranu."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Raz przez USB; potem wszystko bezprzewodowo."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz profil"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Kompilacja lub instalacja już trwa ("},{t:4,k:"file"},{t:3,v:"). Poczekaj, aż się zakończy."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"W tej instalacji brakuje narzędzia ESPHome CLI; można tylko zapisać profil."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" jest w folderze ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Wgrywanie firmware: "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Kompilowanie firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Firmware gotowy: "},{t:4,k:"name"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Firmware wgrany: "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Kompilacja nieudana"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Instalacja nieudana"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj go później w sekcji „Firmware i USB”: wybierz ten profil, a potem port USB komputera z Home Assistant albo „Pobierz”, aby wgrać firmware na ekran z własnego komputera. Zachowaj klucz API do parowania:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Nie odłączaj jeszcze kabla USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Pierwsza kompilacja trwa kilka minut na Raspberry Pi. Możesz opuścić tę stronę: instalacja trwa dalej, a znajdziesz ją ponownie w sekcji „Nowy ekran”."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Pierwsza kompilacja trwa kilka minut na Raspberry Pi. Możesz opuścić tę stronę: kompilacja trwa dalej, a znajdziesz ją ponownie w sekcji „Nowy ekran”."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Wgraj go na ekran z własnego komputera, a potem sparuj ekran z Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"Ekran się uruchamia i łączy z Twoją siecią Wi-Fi. Teraz sparuj go z Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"Ekran się uruchamia i łączy z Twoją siecią Wi-Fi. CYD najpierw poprosi o kalibrację dotyku: dotykaj krzyżyków. Teraz sparuj go z Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Zobacz log poniżej."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" kablem USB do transmisji danych."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz ekran do komputera"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" w Chrome lub Edge, kliknij „Connect” i wybierz port USB ekranu."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Otwórz "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" i wskaż plik "},{t:4,k:"file"},{t:3,v:". Ekran uruchomi się ponownie i połączy z Twoją siecią Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" i wskaż plik "},{t:4,k:"file"},{t:3,v:". Ekran uruchomi się ponownie i połączy z Twoją siecią Wi-Fi. CYD najpierw poprosi o kalibrację dotyku: dotykaj krzyżyków."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Kliknij „Install”"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Plik zawiera Twoje hasło Wi-Fi i klucze ekranu: nie udostępniaj go nikomu."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Klucz API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" To dzieje się poza ESP Screens. Home Assistant wykryje "},{t:4,k:"name"},{t:3,v:" jako urządzenie ESPHome; kliknij „Dodaj”. Nie wykryto? Dodaj ESPHome ręcznie, podając adres IP ekranu."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Przejdź do Home Assistant → Ustawienia → Urządzenia oraz usługi."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" widoczny powyżej, gdy Home Assistant poprosi o klucz szyfrujący."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wklej klucz API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" integracja ESPHome → Konfiguruj → „Zezwól urządzeniu na wykonywanie akcji Home Assistant”. Bez tego ekran widzi wszystko, ale niczym nie steruje."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Zezwól na akcje HA:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Po powrocie do ESP Screens ekran pojawi się na liście po lewej w ciągu około trzydziestu sekund; do tego czasu jest tam opisany jako „jeszcze nie w Home Assistant”."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz kafelki."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Log ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Ponów"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj kolejny ekran"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Zacznij od nowa"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Gotowe"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alerty · ściąga"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Powiadomienie na cały ekran, z automatyzacji."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Każdy ekran ma akcję "},{t:4,k:"action"},{t:3,v:". Wyświetla ona kartę nad wszystkim, budzi ekran i utrzymuje normalną jasność podświetlenia, dopóki ktoś nie dotknie przycisku albo nie upłynie limit czasu. Sam Home Assistant nie pokazuje dla akcji ESPHome żadnych objaśnień ani list rozwijanych; wszystko, co możesz wypełnić, znajdziesz tutaj."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Ściąga wciąż się ładuje; chwileczkę."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Ktoś jest przy drzwiach"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Drzwi 3, tylne"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Idę"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Sekcje"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Wypróbuj"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Twoje ekrany"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"W automatyzacji"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Wszystkie ekrany"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Pola"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Ikony"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Kolory"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Działanie"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Zdarzenia"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Wskazówki"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Wyślij teraz jeden alert z tymi samymi polami, które wysyła automatyzacja. Ekran pokaże kartę, a przy włączonym miganiu mignie podświetleniem."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ekran"}},all:{t:0,b:{t:2,i:[{t:3,v:"Wszystkie ekrany (gotowe: "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · niegotowy"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tytuł"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Podtytuł"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Ikona"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Kolor"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Tekst przycisku"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Limit czasu (sekundy, 0 czeka na przycisk)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Migaj podświetleniem"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cztery razy, gdy przychodzi alert."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Wysyłanie…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Wyślij alert"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Wysłano na "},{t:4,k:"n"},{t:3,v:" ekran."}]},{t:2,i:[{t:3,v:"Wysłano na "},{t:4,k:"n"},{t:3,v:" ekrany."}]},{t:2,i:[{t:3,v:"Wysłano na "},{t:4,k:"n"},{t:3,v:" ekranów."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Wysłano na ekran "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Wysłano na ekran."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Pominięto 1 ekran (offline lub stary firmware)."},{t:2,i:[{t:3,v:"Pominięto "},{t:4,k:"n"},{t:3,v:" ekrany (offline lub stary firmware)."}]},{t:2,i:[{t:3,v:"Pominięto "},{t:4,k:"n"},{t:3,v:" ekranów (offline lub stary firmware)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Puste pola: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Żaden ekran nie mógł go pokazać: sprawdź, czy któryś ekran jest online i ma firmware "},{t:4,k:"version"},{t:3,v:" lub nowszy."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Biały (domyślny)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Każdy ekran ma własną akcję, której nazwa zawiera nazwę urządzenia. Od wersji firmware "},{t:4,k:"version"},{t:3,v:"; starszy ekran zaktualizuj przyciskiem „Aktualizuj” na liście ekranów."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nie sparowano jeszcze żadnego ekranu. Zainstaluj go w sekcji „Nowy ekran”; akcja pojawi się, gdy Home Assistant zobaczy ekran."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Potrzebna aktualizacja · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nieznana nazwa urządzenia · zaktualizuj ekran"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Pokaż alert"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Zamknij alert"}}},howto:{add:{t:0,b:{t:2,i:[{t:4,k:"add"},{t:3,v:" i wyszukaj "},{t:4,k:"esphome"},{t:3,v:". Wybierz akcję swojego ekranu: Home Assistant opisuje ją po angielsku jako „Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"”."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj akcję"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nazwa urządzenia"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant pyta o wszystkie siedem; to, czego nie używasz, zostaw puste ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", wyłączone)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wypełnij pola."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Wolisz YAML? Wybierz "},{t:4,k:"edit"},{t:3,v:" w menu akcji i wklej poniższy przykład."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Przykład dla"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"ekranu (jeszcze niesparowanego)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Edytuj w YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Kopiuj YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wszystkie ekrany naraz"}},text:{t:0,b:{t:2,i:[{t:3,v:"Wywołaj zdarzenie "},{t:4,k:"show"},{t:3,v:" z tymi samymi polami, a ESP Screens przekaże alert każdemu ekranowi, który jest online, także ekranom dodanym później. "},{t:4,k:"dismiss"},{t:3,v:" usuwa go wszędzie. W automatyzacji dodaj akcję "},{t:4,k:"event"},{t:3,v:" albo wybierz "},{t:4,k:"edit"},{t:3,v:" i wklej przykład. Pomiń pola, których nie używasz. ESP Screens musi przy tym działać."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Uruchom zdarzenie ręcznie"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Tekst jest dowolny; limit liczy się w bajtach, a litera ze znakiem diakrytycznym (np. ą, ł, ś) liczy się jako dwa. Co się nie zmieści, kończy się wielokropkiem (tytuł) lub zostaje pominięte (podtytuł)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Pole"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Typ"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Co robi"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Przykład"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limit"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"tekst"}},int:{t:0,b:{t:2,i:[{t:3}],s:"liczba"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"wł. / wył."}},entity:{t:0,b:{t:2,i:[{t:3}],s:"encja"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" B · Guition "},{t:4,k:"guition"},{t:3,v:" B"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"od 0 do 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Wpisz nazwę w polu "},{t:4,k:"field"},{t:3,v:", na przykład "},{t:4,k:"example"},{t:3,v:". Działa też "},{t:4,k:"mdi"},{t:3,v:" i kod szesnastkowy ("},{t:4,k:"hex"},{t:3,v:"). Firmware zawiera tylko te ikony; każda inna nazwa pokazuje trójkąt ostrzegawczy. Kliknij ikonę, aby skopiować jej nazwę."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Przydatne do powiadomień"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj ikony"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj po nazwie lub opisie…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Dostępne też: ikony sterowania i pogody"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Kopiuj "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Brak ikony dla „"},{t:4,k:"query"},{t:3,v:"”. Nieznane nazwy pokazują trójkąt ostrzegawczy ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Wpisz nazwę w polu "},{t:4,k:"field"},{t:3,v:". To pastelowe odcienie kafelków, z ciemnym tekstem. Pusta lub nieznana nazwa daje białą kartę. Kliknij, aby skopiować."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Alert od razu budzi przyciemniony lub wygaszony ekran i pojawia się nad każdą stroną, każdą otwartą kartą światła i warstwą czuwania."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Budzi ekran."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Dopóki karta jest widoczna, podświetlenie ma normalną jasność. Czuwanie i godziny nocne czekają. Po naciśnięciu przycisku zwykły czas do czuwania biegnie od nowa."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Świeci do naciśnięcia przycisku."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" czeka na przycisk bez względu na to, jak długo to trwa. Przy "},{t:4,k:"minute"},{t:3,v:" karta znika po minucie, ale przycisk zamyka ją wcześniej."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Limit czasu."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" miga podświetleniem cztery razy, gdy przychodzi alert (około sekundy), a potem zostawia ekran włączony."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Miganie."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Nowy alert zastępuje bieżący; alerty się nie kumulują. Zastąpiony alert zgłasza się jako "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Zastępowanie."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" usuwa kartę, na przykład gdy drzwi są już otwarte. Gdy nie ma alertu, ta akcja nic nie robi."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Zdalne zamykanie."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" nic nie robi; kartę zamyka tylko przycisk. Dzięki temu dotknięcie budzące ekran nigdy przypadkiem nie zamknie alertu."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Dotknięcie obok karty"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Każde zakończenie alertu wywołuje zdarzenie "},{t:4,k:"event"},{t:3,v:" z polami "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (nazwa urządzenia) i "},{t:4,k:"device_id"},{t:3,v:", które dodaje Home Assistant. Zobaczysz je w sekcji Ustawienia → Narzędzia → Zdarzenia."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Kiedy"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Czekanie, aż ktoś naciśnie przycisk"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Użyj "},{t:4,k:"bold"},{t:3,v:": pomarańczowy dla drzwi, czerwony dla dymu lub wody, zielony dla „gotowe”. Tekst zawsze pozostaje ciemny i czytelny."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"osobnego koloru dla każdego rodzaju powiadomienia"}},short:{t:0,b:{t:2,i:[{t:3,v:"Tytuł niech będzie "},{t:4,k:"bold"},{t:3,v:"; ekran pokazuje około dwudziestu znaków w jednym wierszu, a dłuższy tytuł kończy wielokropkiem. Szczegóły umieść w podtytule."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"krótki"}},button:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" zamienia powiadomienie w pytanie: „Idę”, „Widzę”, „Wyłącz”. Zdarzenie powie Ci potem, kto odpowiedział."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"Własny tekst przycisku"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Alert, który sam się rozwiązuje (drzwi się otwierają, ktoś wyjmuje pranie), zamknij w tej samej automatyzacji akcją "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Wszystkie ekrany? Wywołaj "},{t:4,k:"event"},{t:3,v:" raz (zobacz „Wszystkie ekrany naraz”). Ekrany nadal działają niezależnie i każdy zgłasza się z własnym polem "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Wolisz "},{t:4,k:"bold"},{t:3,v:" o automatyzację? Zainstaluj umiejętność ESP Screens w sekcji Ustawienia → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"poprosić Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Dzwonek: pokaż alert i poczekaj, aż ktoś naciśnie przycisk."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Ktoś idzie do drzwi."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Zaawansowane · lokalne nadpisanie"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Nadpisanie YAML"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"Nadpisanie YAML · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Ten mały plik należy do Ciebie. Jest wczytywany po wspólnym pakiecie ekranu i zostaje na miejscu, gdy ESP Screens się aktualizuje. Zmieniaj tu szczegóły sprzętu, na przykład model wyświetlacza."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Co można bezpiecznie zmieniać?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Wyświetlacz, ekran dotykowy, substitutions, piny i inne szczegóły urządzenia. Nazwa, Wi-Fi, API, OTA i odnośniki do pakietów pozostają zarządzane przez aplikację."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Aktywne"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Gotowe do dołączenia"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"Lokalne nadpisanie YAML"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Użyj przykładu"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Wyczyść"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 znak"},{t:2,i:[{t:4,k:"n"},{t:3,v:" znaki"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" znaków"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 wiersz"},{t:2,i:[{t:4,k:"n"},{t:3,v:" wiersze"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" wierszy"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz i sprawdź"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz nadpisanie"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono profilu ESPHome dla tego ekranu."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Zmiany tutaj zadziałają przy następnej kompilacji."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz raz, aby dołączyć ten plik do profilu."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Sprawdzanie i zapisywanie…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Nadpisanie zostaje zachowane podczas aktualizacji firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano nadpisanie YAML."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. ESPHome sprawdza cały profil…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome sprawdza profil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome sprawdza profil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Cały profil jest poprawny. Można bezpiecznie kompilować i instalować."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome odrzucił cały profil. Pełny log znajdziesz w sekcji „Firmware i USB”."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Zastąpić obecny tekst przykładem?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Wczytano przykład. Zapisz go, kiedy zechcesz."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Wyczyścić lokalne nadpisanie?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Po zapisaniu nadpisanie będzie puste."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Dom"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nieznany"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"włączono"}},off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"niedostępny"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"grzanie"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"chłodzenie"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"grzanie/chłodzenie"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"osuszanie"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"tylko wentylator"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"grzanie"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"chłodzenie"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"brak aktywności"}},off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"osuszanie"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"wentylator"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"podgrzewanie wstępne"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"rozmrażanie"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"otwieranie"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"zamykanie"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"odtwarzanie"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"wstrzymano"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"brak aktywności"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"tryb czuwania"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"w domu"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"poza domem"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"powyżej horyzontu"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"poniżej horyzontu"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"zadokowany"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"sprzątanie"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"wstrzymano"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"wraca do stacji dokującej"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"brak aktywności"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"słonecznie"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"pogodna noc"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"pochmurno"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"częściowe zachmurzenie"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"deszczowo"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"ulewa"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"opady śniegu"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"deszcz ze śniegiem"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"mgła"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"grad"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"wyładowania atmosferyczne"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"burza"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"wietrznie"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"warunki nadzwyczajne"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Low"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Charging"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"brak ładowania"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"zimno"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"połączono"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"rozłączono"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"gorąco"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"odblokowano"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"zablokowano"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"w ruchu"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"brak ruchu"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"podłączono"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"odłączono"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"włączono"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Home"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Away"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"problem"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"ok"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"działa"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"nie działa"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"zagrożenie"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"brak zagrożenia"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Tampering detected"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"dostępna aktualizacja"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"brak aktualizacji"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Aktywuj"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Uruchom"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Naciśnij"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Low"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Medium"}},high:{t:0,b:{t:2,i:[{t:3}],s:"High"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"pośredni"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"skupiony nawiew"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"rozproszony nawiew"}},top:{t:0,b:{t:2,i:[{t:3}],s:"nawiew górny"}},on:{t:0,b:{t:2,i:[{t:3}],s:"włączono"}},off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"włączono"}},off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},both:{t:0,b:{t:2,i:[{t:3}],s:"ruch w obu płaszczyznach"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"ruch pionowy"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"ruch poziomy"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Przed chwilą"}},minutes_ago:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min temu"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 godzinę temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" godziny temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" godzin temu"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Wczoraj"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 dzień temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" dni temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" dni temu"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 tydzień temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" tygodnie temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" tygodni temu"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 miesiąc temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" miesiące temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" miesięcy temu"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 rok temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" lata temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" lat temu"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Za 1 godzinę"},{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" godziny"}]},{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" godzin"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Jutro"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Za 1 dzień"},{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" dni"}]},{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" dni"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"niedziela"}},{t:0,b:{t:2,i:[{t:3}],s:"poniedziałek"}},{t:0,b:{t:2,i:[{t:3}],s:"wtorek"}},{t:0,b:{t:2,i:[{t:3}],s:"środa"}},{t:0,b:{t:2,i:[{t:3}],s:"czwartek"}},{t:0,b:{t:2,i:[{t:3}],s:"piątek"}},{t:0,b:{t:2,i:[{t:3}],s:"sobota"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"niedz."}},{t:0,b:{t:2,i:[{t:3}],s:"pon."}},{t:0,b:{t:2,i:[{t:3}],s:"wt."}},{t:0,b:{t:2,i:[{t:3}],s:"śr."}},{t:0,b:{t:2,i:[{t:3}],s:"czw."}},{t:0,b:{t:2,i:[{t:3}],s:"pt."}},{t:0,b:{t:2,i:[{t:3}],s:"sob."}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"nd"}},{t:0,b:{t:2,i:[{t:3}],s:"pn"}},{t:0,b:{t:2,i:[{t:3}],s:"wt"}},{t:0,b:{t:2,i:[{t:3}],s:"śr"}},{t:0,b:{t:2,i:[{t:3}],s:"cz"}},{t:0,b:{t:2,i:[{t:3}],s:"pt"}},{t:0,b:{t:2,i:[{t:3}],s:"sb"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"stycznia"}},{t:0,b:{t:2,i:[{t:3}],s:"lutego"}},{t:0,b:{t:2,i:[{t:3}],s:"marca"}},{t:0,b:{t:2,i:[{t:3}],s:"kwietnia"}},{t:0,b:{t:2,i:[{t:3}],s:"maja"}},{t:0,b:{t:2,i:[{t:3}],s:"czerwca"}},{t:0,b:{t:2,i:[{t:3}],s:"lipca"}},{t:0,b:{t:2,i:[{t:3}],s:"sierpnia"}},{t:0,b:{t:2,i:[{t:3}],s:"września"}},{t:0,b:{t:2,i:[{t:3}],s:"października"}},{t:0,b:{t:2,i:[{t:3}],s:"listopada"}},{t:0,b:{t:2,i:[{t:3}],s:"grudnia"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"sty"}},{t:0,b:{t:2,i:[{t:3}],s:"lut"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"kwi"}},{t:0,b:{t:2,i:[{t:3}],s:"maj"}},{t:0,b:{t:2,i:[{t:3}],s:"cze"}},{t:0,b:{t:2,i:[{t:3}],s:"lip"}},{t:0,b:{t:2,i:[{t:3}],s:"sie"}},{t:0,b:{t:2,i:[{t:3}],s:"wrz"}},{t:0,b:{t:2,i:[{t:3}],s:"paź"}},{t:0,b:{t:2,i:[{t:3}],s:"lis"}},{t:0,b:{t:2,i:[{t:3}],s:"gru"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:" "}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"2"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Strona "},{t:4,k:"n"}]}}}}};export{t as default}; +const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Cofnij"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"nieznany"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Niezapisane zmiany"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Anuluj"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Otwórz Urządzenia oraz usługi"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz i wyślij"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Zapisywanie…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Odczytaj bieżące dane"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 wynik. Pisz dalej, aby zawęzić."},{t:2,i:[{t:4,k:"n"},{t:3,v:" wyniki. Pisz dalej, aby zawęzić."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" wyników. Pisz dalej, aby zawęzić."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Zamknij"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Usuń"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Zmień"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Ładowanie…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Wstecz"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Kopiuj"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Nowy ekran"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware i USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alerty"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz i zainstaluj"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się. Odśwież stronę i spróbuj ponownie."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano klucz API."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Klucz API jest zaznaczony. Skopiuj skrótem Ctrl+C lub Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano JSON układu."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"JSON układu jest zaznaczony. Skopiuj skrótem Ctrl+C lub Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano nazwę akcji."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa akcji jest zaznaczona. Skopiuj skrótem Ctrl+C lub Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano YAML."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"YAML jest zaznaczony. Skopiuj skrótem Ctrl+C lub Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano nazwę ikony."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa ikony jest zaznaczona. Skopiuj skrótem Ctrl+C lub Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano pusty kolor."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Pusty kolor jest zaznaczony. Skopiuj skrótem Ctrl+C lub Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Skopiowano nazwę koloru."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa koloru jest zaznaczona. Skopiuj skrótem Ctrl+C lub Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Strona zarządzania nieosiągalna · ponawianie…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Połączono z Home Assistant"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"Ponowne łączenie z Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Więcej"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Odśwież"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizacja"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizuj"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"W kolejce do aktualizacji"}},available:{t:0,b:{t:2,i:[{t:3,v:"Aktualizacja "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono profilu ESPHome o tej nazwie urządzenia."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Co nowego"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Pełny log"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"Adres IP, tylko ten jeden raz; nowy firmware sam go zgłasza."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Adres IP, np. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Adres IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Rozpocznij"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Zainstalowany, ale jeszcze nie w Home Assistant. Dodaj wykryte urządzenie ESPHome w sekcji Ustawienia → Urządzenia oraz usługi, wklej tam klucz API, a potem kliknij „Konfiguruj” i włącz „Zezwól urządzeniu na wykonywanie akcji Home Assistant”."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware pobrany, jeszcze nie w Home Assistant. Wgraj go na ekran przez ESPHome Web, potem dodaj wykryte urządzenie ESPHome w sekcji Ustawienia → Urządzenia oraz usługi, wklej tam klucz API, kliknij „Konfiguruj” i zezwól na akcje Home Assistant."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Jeszcze nie w Home Assistant. Firmware już wgrany? Dodaj urządzenie ESPHome w sekcji Ustawienia → Urządzenia oraz usługi, potem kliknij „Konfiguruj” i zezwól na akcje Home Assistant. Jeszcze nie wgrany? Firmware i USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Kopiuj klucz API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Polecenia"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj do tego ekranu"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Ściąga i alert testowy"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizacje, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nic do zapisania"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Zidentyfikuj ten ekran"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Miga podświetleniem i pokazuje kartę"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Wymaga nowszej wersji firmware"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Eksportuj układ"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz i skopiuj jako JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj ekranów, encji, poleceń…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Brak wyników. Wpisz część nazwy ekranu, encji lub polecenia."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz ekran"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz jeden ze swoich ekranów po lewej, aby zmienić jego kafelki, górny pasek i ustawienia."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Zacznij od ekranu"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz CYD lub Guition przez USB do komputera z Home Assistant. Profil, firmware i pierwsze wgranie za jednym razem."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj nowy ekran"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Masz niezapisane zmiany. Mimo to otworzyć inny ekran?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Zastąpić niezapisany układ kopią układu innego ekranu?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Zastąpić niezapisany układ zaimportowanym?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Twój ekran jest aktualizowany."}},other:{t:0,b:{t:2,i:[{t:3,v:"Zapisano. Trwa aktualizacja: "},{t:4,k:"name"},{t:3,v:"."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Ekran jest aktualizowany."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Twoja najnowsza zmiana nie została jeszcze wysłana: naciśnij ponownie „Zapisz i wyślij”."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" miga i przez kilka sekund pokazuje kartę."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · zmiany są zapisywane"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Układ"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia ekranu"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano · wysłano na ekran"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Wszystko zapisane"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Więcej"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identyfikuj"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"mignij ekranem"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Wymaga wersji firmware 0.2.31 lub nowszej"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"z Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Kopiuj układ z…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ekran"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ekrany"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ekranów"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"brak innych ekranów"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" kafelek"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" kafelki"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" kafelków"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Eksportuj układ"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importuj układ…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"Nadpisanie YAML"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"zaawansowane"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono profilu ESPHome dla tego ekranu"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizuj firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Usunięto: "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Na stronie "},{t:4,k:"page"},{t:3,v:" nie ma miejsca na ten kafelek."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Brak wolnej strony dla kafelka na całą stronę. Najpierw zwolnij stronę."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Ten ekran ma już kafelek, który prowadzi do strony "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Skopiowano układ ekranu "},{t:4,k:"name"},{t:3,v:". Gdy wygląda dobrze, naciśnij „Zapisz i wyślij”."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Skopiowano układ ekranu "},{t:4,k:"name"},{t:3,v:". Kafelki zgodne z firmware tego ekranu: "},{t:4,k:"kept"},{t:3,v:" z "},{t:4,k:"total"},{t:3,v:". Gdy wygląda dobrze, naciśnij „Zapisz i wyślij”."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Zaimportowano układ. Gdy wygląda dobrze, naciśnij „Zapisz i wyślij”."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Zaimportowano układ. Kafelki zgodne z firmware tego ekranu: "},{t:4,k:"kept"},{t:3,v:" z "},{t:4,k:"total"},{t:3,v:". Gdy wygląda dobrze, naciśnij „Zapisz i wyślij”."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"To nie jest JSON. Najpierw wyeksportuj układ albo wklej układ z innej instalacji ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Brak kafelków w tym pliku. Oczekiwano układu wyeksportowanego z ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" strona · kafelki: "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" strony · kafelki: "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" stron · kafelki: "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj pierwsze światło, scenę lub urządzenie z biblioteki."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Kliknij górny pasek lub kafelek, aby go zmienić. Przeciągnij, aby przenieść; upuść na następnej stronie, aby utworzyć nową."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Puste miejsca i stałe pozycje działają od wersji firmware 0.2.26. Do czasu tej aktualizacji ten ekran (firmware "},{t:4,k:"firmware"},{t:3,v:") przesuwa kafelki w górę, na pierwsze wolne miejsce."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Układ ekranu"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Dodaj stronę"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maksymalnie 1 strona"},{t:2,i:[{t:3,v:"Maksymalnie "},{t:4,k:"n"},{t:3,v:" strony"}]},{t:2,i:[{t:3,v:"Maksymalnie "},{t:4,k:"n"},{t:3,v:" stron"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Strona "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Usuń stronę"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"Strony po tej przesuną się o jedno miejsce w górę"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Edytuj górny pasek"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Puste miejsce. Kliknij, aby dodać tu kafelek, albo przeciągnij go tutaj."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Puste miejsce "},{t:4,k:"slot"},{t:3,v:" na stronie "},{t:4,k:"page"},{t:3,v:": dodaj tu następny kafelek"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"Tu trafi następny kafelek"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Puste"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Biblioteka"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" encja"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" encje"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" encji"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj po nazwie, urządzeniu lub obszarze…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj encję"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Wszystkie"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Światła"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klimat"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Przełączniki"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Stan"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Akcje"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Skrypty"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Wentylatory"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Osłony"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Sceny"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Odkurzacze"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensory"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Pogoda"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Wartości"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selektory"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Osoby"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Minutniki"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ekran"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Obszar"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Wszystkie obszary"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Ukryj dodane"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Ukryj to, co już jest na tym ekranie"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Wszystko z tej listy jest już na tym ekranie."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono encji. Spróbuj innej nazwy, obszaru lub filtra."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Ten ekran mieści 1 kafelek."},{t:2,i:[{t:3,v:"Ten ekran mieści "},{t:4,k:"n"},{t:3,v:" kafelki."}]},{t:2,i:[{t:3,v:"Ten ekran mieści "},{t:4,k:"n"},{t:3,v:" kafelków."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Ten ekran mieści 1 kafelek; zaktualizuj jego firmware, aby zmieścić 48."},{t:2,i:[{t:3,v:"Ten ekran mieści "},{t:4,k:"n"},{t:3,v:" kafelki; zaktualizuj jego firmware, aby zmieścić 48."}]},{t:2,i:[{t:3,v:"Ten ekran mieści "},{t:4,k:"n"},{t:3,v:" kafelków; zaktualizuj jego firmware, aby zmieścić 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Przeciągnij na stronę albo kliknij +, aby dodać w pierwszym wolnym miejscu. ⌘K przeszukuje wszystko."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Światło"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Klimat"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Odkurzacz"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Wentylator"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Osłona"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Media"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Stan"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Przełącznik"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Przełącznik"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Scena"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Skrypt"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Pogoda"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Wartość"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Wartość"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Selektor"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Selektor"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Akcja"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Akcja"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ekran"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Słońce"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Minutnik"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Osoba"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Kamera"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Obraz"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Encja"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"standardowy"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"duża wartość"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"prognoza pogody"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"wykres"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"zegar cyfrowy"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"zegar analogowy"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"tor słońca"}},live:{t:0,b:{t:2,i:[{t:3}],s:"obraz na żywo"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"okładka albumu"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normalny"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"podwójny"}},full:{t:0,b:{t:2,i:[{t:3}],s:"cała strona"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa na ekranie"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automatycznie (z Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automatycznie (domyślna)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ekran pokazuje wybraną ikonę od wersji firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Przechodzi do strony"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (pusta)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Kafelki nawigacji wymagają wersji firmware 0.2.62: najpierw naciśnij „Aktualizuj” przy tym ekranie."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Ten ekran nie ma strony "},{t:4,k:"page"},{t:3,v:", więc dotknięcie otwiera jego ostatnią stronę. Wybierz inną stronę."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Dotknięcie kafelka otwiera tę stronę."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Widok"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Zegar cyfrowy"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Zegar analogowy"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa i stan"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Duża wartość"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Prognoza pogody"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Wykres"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Tor słońca"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Obraz na żywo"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Mały obraz z kamery w miejscu ikony, odświeżany w tempie poniżej, dopóki strona jest na ekranie. Dotknięcie nadal otwiera go na pełnym ekranie."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Obraz na żywo wymaga firmware 0.2.77 lub nowszego: po zapisaniu naciśnij Aktualizuj przy ekranie."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Okładka albumu"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"Okładka albumu tego, co gra, w miejscu ikony, jak na kafelku Home Assistant; odtwarzacz bez obrazu zachowuje ikonę. Dotknięcie nadal otwiera kartę."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Okładka albumu na kafelku wymaga firmware 0.2.78 lub nowszego: po zapisaniu naciśnij Aktualizuj przy ekranie."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie ma wartości liczbowych dla tej encji, więc wykres pozostanie pusty. Wybierz inny widok."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Ta usługa pogodowa nie ma prognozy dziennej w Home Assistant. Wybierz inny widok."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Odświeżanie"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"Co "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Rozmiar"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normalny"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Podwójna szerokość"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Cała strona"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cała strona: jeden duży przycisk w kolorze kafelka; suwak, przyciski lub wykres są na jego dole."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Kafelek na całą stronę wymaga wersji firmware 0.2.62: najpierw naciśnij „Aktualizuj” przy tym ekranie."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Strona"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nowa strona"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Bezpośrednie sterowanie na kafelku"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie oferuje tego sterowania dla tej encji, więc na ekranie to miejsce pozostanie puste. Wybierz inne."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Na dole kafelka na całą stronę; dotknięcie w innym miejscu działa zgodnie z ustawieniem poniżej."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"Po prawej stronie kafelka podwójnej szerokości, jak w wierszach encji w Home Assistant. Dotknięcie nazwy działa zgodnie z ustawieniem poniżej."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ekran pokazuje bezpośrednie sterowanie od wersji firmware 0.2.19; do tego czasu kafelek pozostaje bez zmian."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Po dotknięciu"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automatycznie"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Otwórz sterowanie"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Tylko podgląd"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Włącz / wyłącz"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Wykonaj akcję"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie może tego włączać ani wyłączać, więc dotknięcie nic nie robi. Wybierz inną opcję."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Włączanie i wyłączanie dotknięciem działa od wersji firmware 0.2.58: naciśnij „Aktualizuj” przy tym ekranie. Do tego czasu dotknięcie otwiera kartę."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Przytrzymaj kafelek, aby otworzyć jego kartę."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mały suwak na kafelku"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Nie"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Tak, steruj bezpośrednio"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie ma dla tej encji niczego, co suwak mógłby zmieniać. Wybierz „Nie”."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Historia"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" godzina"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" godziny"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" godzin"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pastelowe tło"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Tło: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", miejsce "},{t:4,k:"slot"},{t:3,v:" na stronie "},{t:4,k:"page"},{t:3,v:". Enter: konfiguruj, strzałki: przenieś"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Usuń kafelek"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Usuń "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Akcja"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"Pobieranie akcji tej encji z Home Assistant…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant teraz nie odpowiada. Spróbuj ponownie za chwilę."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz akcję"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj, na przykład toggle, position lub play"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj akcji"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono akcji."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"Home Assistant nie oferuje już tej akcji dla tej encji, więc dotknięcie nic nie robi. Wybierz inną."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (opcjonalnie)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Nie ustawiono"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Włączone"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Wyłączone"}},needs:{t:0,b:{t:2,i:[{t:3,v:"Home Assistant wymaga: "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Ekran wykonuje akcje od wersji firmware 0.2.58: naciśnij „Aktualizuj” przy tym ekranie. Do tego czasu dotknięcie działa jak „Automatycznie”."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Ikona"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Bez ikony"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj, na przykład lampa, muzyka lub drzwi"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj ikony"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Bez ikony, tylko tekst"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Ikona: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono ikony."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Bieżące dane"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Połączenie, stan i obsługiwane właściwości"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"Odczytywanie…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"Pobieranie bieżącego stanu z HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Stan: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Mały suwak: "},{t:4,k:"slider"},{t:3,v:" · Widok: "},{t:4,k:"display"},{t:3,v:" · Rozmiar: "},{t:4,k:"size"},{t:3,v:" · Sterowanie: "},{t:4,k:"control"},{t:3,v:" · Tło: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"tak"}},no:{t:0,b:{t:2,i:[{t:3}],s:"nie"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Domyślne"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Odczytaj ponownie"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Usunięto z górnego paska: "},{t:4,k:"name"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Górny pasek mieści 1 element."},{t:2,i:[{t:3,v:"Górny pasek mieści "},{t:4,k:"n"},{t:3,v:" elementy."}]},{t:2,i:[{t:3,v:"Górny pasek mieści "},{t:4,k:"n"},{t:3,v:" elementów."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"To już jest na górnym pasku."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Górny pasek"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Górny pasek: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Z samego ekranu, działa też bez Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" elementu"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" elementów"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" elementów"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Po lewej: nazwa"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Na przykład: Salon"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Po prawej: godzina, sensory lub zegar"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", miejsce "},{t:4,k:"slot"},{t:3,v:". Enter: konfiguruj, strzałki: przenieś"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Usuń "},{t:4,k:"name"},{t:3,v:" z górnego paska"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Maksymalnie 1 element"},{t:2,i:[{t:3,v:"Maksymalnie "},{t:4,k:"n"},{t:3,v:" elementy"}]},{t:2,i:[{t:3,v:"Maksymalnie "},{t:4,k:"n"},{t:3,v:" elementów"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj godzinę, datę, zegar analogowy lub encję"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Dodaj godzinę, datę lub encję"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Nie wszystko mieści się obok nazwy: ekran pomija elementy z przerywaną ramką. Usuń jeden z nich albo wybierz krótszą nazwę."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Przeciągnij, aby zmienić kolejność; kliknij element, aby go skonfigurować."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Sensory, data i zegar analogowy pojawiają się od wersji firmware "},{t:4,k:"version"},{t:3,v:"; do tej aktualizacji ekran pokazuje nazwę oraz zegar, jeśli godzina jest na pasku."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Ukryty: teraz nieaktywny"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Nie mieści się obok nazwy"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Tarcza"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Teraz ukryty: nieaktywny"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Obecnie nie mieści się obok nazwy"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Tak wygląda na ekranie"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Mała tarcza z godziną"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"Co pokazać"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"„Ostatnia zmiana” aktualizuje się na samym ekranie: „Przed chwilą”, „5 min temu”, „Wczoraj”."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automatycznie (jak w Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Pokazuj"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"„Tylko gdy aktywne” ukrywa element, dopóki jest wyłączony, zamknięty, poza domem albo równy 0. Przydatne dla otwartych drzwi, pracującej pralki albo tego, kto jest w domu."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Zegar 24-godzinny · zmiana: "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Zegar 12-godzinny · zmiana: "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Ustawienia → Język i region"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Dziś: "},{t:4,k:"date"},{t:3,v:". Data pochodzi z zegara samego ekranu."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ W górę"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ W dół"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj do górnego paska"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Zajęto "},{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" miejsca"}]},{t:2,i:[{t:3,v:"Zajęto "},{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" miejsc"}]},{t:2,i:[{t:3,v:"Zajęto "},{t:4,k:"used"},{t:3,v:" z "},{t:4,k:"n"},{t:3,v:" miejsc"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Z samego ekranu"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Już dodano"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Propozycje z Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Encja"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj po nazwie, obszarze lub encji, np. temperatura albo drzwi"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj encji dla górnego paska"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono encji."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Jasność"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Noc"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ekran"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Jasność"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Tryb ciemny"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Auto czuwanie"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Czuwanie po"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Jasność czuwania"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Tryb nocny"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Początek"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Koniec"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Jasność nocna"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Wróć do strony 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Po"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Także w czuwaniu"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Przesuwanie stron"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Przyciski stron"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Obrót"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" godz."}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" godz. "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" AM"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" PM"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Trwa jeszcze zapisywanie ustawień innego ekranu. Spróbuj ponownie za chwilę."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Przyciski stron i przesuwanie są wyłączone, więc stronę zmieniają tylko kafelki „Przejdź do strony”."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"strony "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"stron "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"stron "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelek „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:")."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelki „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:")."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelków „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:")."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelek „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do niej dotrzeć."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelki „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do niej dotrzeć."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelków „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do niej dotrzeć."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelek „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do nich dotrzeć."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelki „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do nich dotrzeć."}]},{t:2,i:[{t:3,v:"Masz "},{t:4,k:"n"},{t:3,v:" kafelków „Przejdź do strony” (do "},{t:4,k:"targets"},{t:3,v:"), ale żadnego do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do nich dotrzeć."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nie masz kafelków „Przejdź do strony”."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Żaden kafelek „Przejdź do strony” nie prowadzi do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do niej dotrzeć."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Żaden kafelek „Przejdź do strony” nie prowadzi do "},{t:4,k:"missing"},{t:3,v:", więc nie możesz do nich dotrzeć."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Kafelki do "},{t:4,k:"pages"},{t:3,v:" są tylko na stronach, do których nie możesz dotrzeć."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Ze "},{t:4,k:"pages"},{t:3,v:" żaden kafelek nie prowadzi z powrotem do strony 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Ten ekran jest offline. Jego ustawienia można zmienić, gdy wróci."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Zmiany działają na ekranie od razu, a gdy zmienisz coś na ekranie, zobaczysz to tutaj."}},app:{t:0,b:{t:2,i:[{t:3}],s:"Zmiany działają od razu. Od wersji firmware 0.2.49 ekran przechowuje je sam."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Ta encja jest wyłączona w Home Assistant albo ekran uruchamia się ponownie."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": zmniejsz"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": zwiększ"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"Rozpoczynanie aktualizacji…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"Kompilowanie firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"Wgrywanie firmware przez Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"Kompilowanie i instalowanie…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"Oczekiwanie na powrót ekranu…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"Sprawdzanie, czy działa stabilnie…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Nowy język: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany będą teraz aktualizowane automatycznie w nocy."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"Automatyczne aktualizacje są wyłączone."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizacje firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Aktualizowanie do firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Nie sparowano jeszcze żadnego ekranu. Nowe ekrany dostaną firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" jest dostępny dla "},{t:4,k:"n"},{t:3,v:" ekranu."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" jest dostępny dla "},{t:4,k:"n"},{t:3,v:" ekranów."}]},{t:2,i:[{t:3,v:"Firmware "},{t:4,k:"version"},{t:3,v:" jest dostępny dla "},{t:4,k:"n"},{t:3,v:" ekranów."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Wszystkie ekrany mają firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Aktualizuj 1 ekran"},{t:2,i:[{t:3,v:"Aktualizuj wszystkie ekrany ("},{t:4,k:"n"},{t:3,v:")"}]},{t:2,i:[{t:3,v:"Aktualizuj wszystkie ekrany ("},{t:4,k:"n"},{t:3,v:")"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Co nowego w firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Aktualizuj automatycznie co noc"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Między 03:00 a 06:00, po jednym ekranie naraz. Przy błędzie zatrzymuje się i zgłasza go w Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Umiejętność zainstalowana. Claude Code od razu ją wykrywa."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Umiejętność zainstalowana. Uruchom ponownie Claude Code jeden raz, aby znalazł nowy folder umiejętności."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Dzięki tej umiejętności Claude pozna ESP Screens. Potem poproś: „Pokaż alert na wszystkich moich ekranach, gdy skrzynka na listy jest pełna”. Claude zna zdarzenia alertów, każde pole, kolor i ikonę."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj dla Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj ponownie"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Zaktualizuj umiejętność"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Nie zainstalowano"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Zainstalowano"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Zainstalowano · dostępna jest nowsza wersja"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Dla Claude Code w Home Assistant. Zapisuje jeden plik w "},{t:4,k:"path"},{t:3,v:"; ponowna instalacja go zastępuje."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz dla claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Prześlij plik zip w Claude: Customize → Skills."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Wszystko wokół Twoich ekranów."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Moje ekrany"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj ekran albo skompiluj i ponownie zainstaluj firmware ekranu, który już masz."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Kompiluj i instaluj przez USB lub Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Język i region"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Język ekranów"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Język Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Język Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Ekrany używają angielskiego, dopóki język Home Assistant nie będzie dostępny."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · jeszcze niesprawdzony, pomoc mile widziana"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" nie jest jeszcze sprawdzony, pomoc mile widziana: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"jak tłumaczyć"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Po zmianie każdy ekran wymaga aktualizacji firmware, po jednej kompilacji na ekran: przyciskiem „Aktualizuj” albo w nocnych aktualizacjach."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Format czasu"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatycznie, według języka ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24-godzinny"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12-godzinny"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Format liczbowy"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automatycznie, według języka ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"Twój profil Home Assistant: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Użyj tych"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"Sam edytor używa języka Twojego profilu Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Każdy ekran przejdzie na nowy język przy najbliższej aktualizacji."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Karta na cały ekran uruchamiana z automatyzacji, na jednym ekranie lub na wszystkich. Ściąga zawiera nazwy akcji, pola, ikony i kolory oraz formularz do wypróbowania alertu."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Powiadomienia na cały ekran, z automatyzacji"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Kompiluj i instaluj firmware ekranu"}},intro:{t:0,b:{t:2,i:[{t:3,v:"Wbudowane narzędzie ESPHome CLI korzysta z Twojego własnego profilu (YAML z kluczami) i sekretów. Wybierz profil ekranu, a potem port USB (ekran podłączony do komputera z Home Assistant), "},{t:4,k:"ota"},{t:3,v:" z nazwą hosta albo "},{t:4,k:"download"},{t:3,v:", aby wgrać firmware na ekran z własnego komputera. "},{t:4,k:"check"},{t:3,v:" tylko sprawdza poprawność, "},{t:4,k:"build"},{t:3,v:" kompiluje, "},{t:4,k:"install"},{t:3,v:" wgrywa firmware na ekran. Twoje kafelki w ESP Screens zostają bez zmian. Pierwsza kompilacja trwa kilka minut."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Sprawdź"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Tylko kompiluj"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Kompiluj i zainstaluj"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Kompiluj i pobierz"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Brak narzędzia ESPHome CLI. Zaktualizuj aplikację do wersji 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz właściwy profil, a potem port USB, adres IP lub „Pobierz”."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Profil ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj na"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · nie znaleziono jeszcze płytki na komputerze z Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz · wgraj z własnego komputera"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Adres IP lub nazwa hosta"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Pobierz "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Wgraj go na ekran przez "},{t:4,k:"esphome_web"},{t:3,v:" w Chrome lub Edge: „Connect”, wybierz port USB ekranu, „Install” i wskaż ten plik. Zawiera Twoje hasło Wi-Fi i klucze ekranu: nie udostępniaj go nikomu."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz i zainstaluj."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Profil zapisany."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Chwileczkę…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Gotowe do pobrania."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Gotowe."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Nie udało się."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"ESP Screens tworzy własny profil ekranu z unikalnymi kluczami i kompiluje firmware. Podłącz ekran kablem USB do transmisji danych do komputera z Home Assistant albo pobierz firmware i wgraj go na ekran z własnego komputera."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Jaki masz ekran?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 cala"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 cale"}},board_elecrow:{t:0,b:{t:2,i:[{t:3}],s:"Elecrow CrowPanel · 7 cali"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Ekran w salonie"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa urządzenia"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"dostosuj"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Każdy ekran dostaje własny profil z własnymi kluczami. Cztery ekrany? Przejdź przez to cztery razy, za każdym razem z inną nazwą."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Małe litery, cyfry i myślniki. Inna nazwa dla każdego ekranu."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nazwa sieci Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Hasło Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Wypełnij raz: ESP Screens zapisze to w pliku secrets.yaml ESPHome, a kolejne ekrany użyją tego automatycznie."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"W Twoim pliku secrets.yaml ESPHome wciąż brakuje danych Wi-Fi. ESP Screens uzupełni tylko brakujące wiersze."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Dane Wi-Fi pochodzą z Twojego pliku secrets.yaml ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"Plik secrets.yaml w folderze ESPHome nie jest poprawnym YAML. Najpierw popraw plik; nie zostanie nadpisany."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj przez"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Później · tylko zapisz profil"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz ekran kablem USB do transmisji danych do komputera z Home Assistant; lista odświeża się sama. Albo wybierz „Pobierz”, aby użyć własnego komputera."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Pobierz firmware i wgraj go na ekran z własnego komputera, w Chrome lub Edge. Potem aktualizacje idą przez Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"Profil trafi do folderu ESPHome. Zainstalujesz go później w sekcji „Firmware i USB” albo w ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Podłączono więcej niż jedną płytkę: wybierz port tego ekranu."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Raz przez USB; potem wszystko bezprzewodowo."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz profil"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Kompilacja lub instalacja już trwa ("},{t:4,k:"file"},{t:3,v:"). Poczekaj, aż się zakończy."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"W tej instalacji brakuje narzędzia ESPHome CLI; można tylko zapisać profil."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" jest w folderze ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"Wgrywanie firmware: "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"Kompilowanie firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"Firmware gotowy: "},{t:4,k:"name"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"Firmware wgrany: "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"Kompilacja nieudana"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"Instalacja nieudana"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj go później w sekcji „Firmware i USB”: wybierz ten profil, a potem port USB komputera z Home Assistant albo „Pobierz”, aby wgrać firmware na ekran z własnego komputera. Zachowaj klucz API do parowania:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Nie odłączaj jeszcze kabla USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"Pierwsza kompilacja trwa kilka minut na Raspberry Pi. Możesz opuścić tę stronę: instalacja trwa dalej, a znajdziesz ją ponownie w sekcji „Nowy ekran”."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"Pierwsza kompilacja trwa kilka minut na Raspberry Pi. Możesz opuścić tę stronę: kompilacja trwa dalej, a znajdziesz ją ponownie w sekcji „Nowy ekran”."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Wgraj go na ekran z własnego komputera, a potem sparuj ekran z Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"Ekran się uruchamia i łączy z Twoją siecią Wi-Fi. Teraz sparuj go z Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"Ekran się uruchamia i łączy z Twoją siecią Wi-Fi. CYD najpierw poprosi o kalibrację dotyku: dotykaj krzyżyków. Teraz sparuj go z Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Zobacz log poniżej."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" kablem USB do transmisji danych."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Podłącz ekran do komputera"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" w Chrome lub Edge, kliknij „Connect” i wybierz port USB ekranu."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Otwórz "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" i wskaż plik "},{t:4,k:"file"},{t:3,v:". Ekran uruchomi się ponownie i połączy z Twoją siecią Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" i wskaż plik "},{t:4,k:"file"},{t:3,v:". Ekran uruchomi się ponownie i połączy z Twoją siecią Wi-Fi. CYD najpierw poprosi o kalibrację dotyku: dotykaj krzyżyków."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Kliknij „Install”"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"Plik zawiera Twoje hasło Wi-Fi i klucze ekranu: nie udostępniaj go nikomu."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Klucz API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" To dzieje się poza ESP Screens. Home Assistant wykryje "},{t:4,k:"name"},{t:3,v:" jako urządzenie ESPHome; kliknij „Dodaj”. Nie wykryto? Dodaj ESPHome ręcznie, podając adres IP ekranu."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Przejdź do Home Assistant → Ustawienia → Urządzenia oraz usługi."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" widoczny powyżej, gdy Home Assistant poprosi o klucz szyfrujący."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wklej klucz API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" integracja ESPHome → Konfiguruj → „Zezwól urządzeniu na wykonywanie akcji Home Assistant”. Bez tego ekran widzi wszystko, ale niczym nie steruje."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Zezwól na akcje HA:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Po powrocie do ESP Screens ekran pojawi się na liście po lewej w ciągu około trzydziestu sekund; do tego czasu jest tam opisany jako „jeszcze nie w Home Assistant”."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wybierz kafelki."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Log ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Ponów"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Zainstaluj kolejny ekran"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Zacznij od nowa"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Gotowe"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alerty · ściąga"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Powiadomienie na cały ekran, z automatyzacji."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Każdy ekran ma akcję "},{t:4,k:"action"},{t:3,v:". Wyświetla ona kartę nad wszystkim, budzi ekran i utrzymuje normalną jasność podświetlenia, dopóki ktoś nie dotknie przycisku albo nie upłynie limit czasu. Sam Home Assistant nie pokazuje dla akcji ESPHome żadnych objaśnień ani list rozwijanych; wszystko, co możesz wypełnić, znajdziesz tutaj."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"Ściąga wciąż się ładuje; chwileczkę."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Ktoś jest przy drzwiach"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Drzwi 3, tylne"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Idę"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Sekcje"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Wypróbuj"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Twoje ekrany"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"W automatyzacji"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Wszystkie ekrany"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Pola"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Ikony"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Kolory"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Działanie"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Zdarzenia"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Wskazówki"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Wyślij teraz jeden alert z tymi samymi polami, które wysyła automatyzacja. Ekran pokaże kartę, a przy włączonym miganiu mignie podświetleniem."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ekran"}},all:{t:0,b:{t:2,i:[{t:3,v:"Wszystkie ekrany (gotowe: "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · niegotowy"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tytuł"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Podtytuł"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Ikona"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Kolor"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Tekst przycisku"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Limit czasu (sekundy, 0 czeka na przycisk)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Migaj podświetleniem"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cztery razy, gdy przychodzi alert."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"Wysyłanie…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Wyślij alert"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Wysłano na "},{t:4,k:"n"},{t:3,v:" ekran."}]},{t:2,i:[{t:3,v:"Wysłano na "},{t:4,k:"n"},{t:3,v:" ekrany."}]},{t:2,i:[{t:3,v:"Wysłano na "},{t:4,k:"n"},{t:3,v:" ekranów."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Wysłano na ekran "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Wysłano na ekran."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Pominięto 1 ekran (offline lub stary firmware)."},{t:2,i:[{t:3,v:"Pominięto "},{t:4,k:"n"},{t:3,v:" ekrany (offline lub stary firmware)."}]},{t:2,i:[{t:3,v:"Pominięto "},{t:4,k:"n"},{t:3,v:" ekranów (offline lub stary firmware)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Puste pola: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Żaden ekran nie mógł go pokazać: sprawdź, czy któryś ekran jest online i ma firmware "},{t:4,k:"version"},{t:3,v:" lub nowszy."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Biały (domyślny)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Każdy ekran ma własną akcję, której nazwa zawiera nazwę urządzenia. Od wersji firmware "},{t:4,k:"version"},{t:3,v:"; starszy ekran zaktualizuj przyciskiem „Aktualizuj” na liście ekranów."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Nie sparowano jeszcze żadnego ekranu. Zainstaluj go w sekcji „Nowy ekran”; akcja pojawi się, gdy Home Assistant zobaczy ekran."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Potrzebna aktualizacja · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nieznana nazwa urządzenia · zaktualizuj ekran"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Pokaż alert"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Zamknij alert"}}},howto:{add:{t:0,b:{t:2,i:[{t:4,k:"add"},{t:3,v:" i wyszukaj "},{t:4,k:"esphome"},{t:3,v:". Wybierz akcję swojego ekranu: Home Assistant opisuje ją po angielsku jako „Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"”."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Dodaj akcję"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nazwa urządzenia"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Home Assistant pyta o wszystkie siedem; to, czego nie używasz, zostaw puste ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", wyłączone)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Wypełnij pola."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Wolisz YAML? Wybierz "},{t:4,k:"edit"},{t:3,v:" w menu akcji i wklej poniższy przykład."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Przykład dla"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"ekranu (jeszcze niesparowanego)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Edytuj w YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Kopiuj YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wszystkie ekrany naraz"}},text:{t:0,b:{t:2,i:[{t:3,v:"Wywołaj zdarzenie "},{t:4,k:"show"},{t:3,v:" z tymi samymi polami, a ESP Screens przekaże alert każdemu ekranowi, który jest online, także ekranom dodanym później. "},{t:4,k:"dismiss"},{t:3,v:" usuwa go wszędzie. W automatyzacji dodaj akcję "},{t:4,k:"event"},{t:3,v:" albo wybierz "},{t:4,k:"edit"},{t:3,v:" i wklej przykład. Pomiń pola, których nie używasz. ESP Screens musi przy tym działać."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Uruchom zdarzenie ręcznie"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"Tekst jest dowolny; limit liczy się w bajtach, a litera ze znakiem diakrytycznym (np. ą, ł, ś) liczy się jako dwa. Co się nie zmieści, kończy się wielokropkiem (tytuł) lub zostaje pominięte (podtytuł)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Pole"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Typ"}},what:{t:0,b:{t:2,i:[{t:3}],s:"Co robi"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Przykład"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limit"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"tekst"}},int:{t:0,b:{t:2,i:[{t:3}],s:"liczba"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"wł. / wył."}},entity:{t:0,b:{t:2,i:[{t:3}],s:"encja"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" B · Guition "},{t:4,k:"guition"},{t:3,v:" B"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"od 0 do 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Wpisz nazwę w polu "},{t:4,k:"field"},{t:3,v:", na przykład "},{t:4,k:"example"},{t:3,v:". Działa też "},{t:4,k:"mdi"},{t:3,v:" i kod szesnastkowy ("},{t:4,k:"hex"},{t:3,v:"). Firmware zawiera tylko te ikony; każda inna nazwa pokazuje trójkąt ostrzegawczy. Kliknij ikonę, aby skopiować jej nazwę."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Przydatne do powiadomień"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj ikony"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Szukaj po nazwie lub opisie…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Dostępne też: ikony sterowania i pogody"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Kopiuj "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Brak ikony dla „"},{t:4,k:"query"},{t:3,v:"”. Nieznane nazwy pokazują trójkąt ostrzegawczy ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Wpisz nazwę w polu "},{t:4,k:"field"},{t:3,v:". To pastelowe odcienie kafelków, z ciemnym tekstem. Pusta lub nieznana nazwa daje białą kartę. Kliknij, aby skopiować."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Alert od razu budzi przyciemniony lub wygaszony ekran i pojawia się nad każdą stroną, każdą otwartą kartą światła i warstwą czuwania."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Budzi ekran."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Dopóki karta jest widoczna, podświetlenie ma normalną jasność. Czuwanie i godziny nocne czekają. Po naciśnięciu przycisku zwykły czas do czuwania biegnie od nowa."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Świeci do naciśnięcia przycisku."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" czeka na przycisk bez względu na to, jak długo to trwa. Przy "},{t:4,k:"minute"},{t:3,v:" karta znika po minucie, ale przycisk zamyka ją wcześniej."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Limit czasu."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" miga podświetleniem cztery razy, gdy przychodzi alert (około sekundy), a potem zostawia ekran włączony."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Miganie."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Nowy alert zastępuje bieżący; alerty się nie kumulują. Zastąpiony alert zgłasza się jako "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Zastępowanie."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" usuwa kartę, na przykład gdy drzwi są już otwarte. Gdy nie ma alertu, ta akcja nic nie robi."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Zdalne zamykanie."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" nic nie robi; kartę zamyka tylko przycisk. Dzięki temu dotknięcie budzące ekran nigdy przypadkiem nie zamknie alertu."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Dotknięcie obok karty"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Każde zakończenie alertu wywołuje zdarzenie "},{t:4,k:"event"},{t:3,v:" z polami "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (nazwa urządzenia) i "},{t:4,k:"device_id"},{t:3,v:", które dodaje Home Assistant. Zobaczysz je w sekcji Ustawienia → Narzędzia → Zdarzenia."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Kiedy"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Czekanie, aż ktoś naciśnie przycisk"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Użyj "},{t:4,k:"bold"},{t:3,v:": pomarańczowy dla drzwi, czerwony dla dymu lub wody, zielony dla „gotowe”. Tekst zawsze pozostaje ciemny i czytelny."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"osobnego koloru dla każdego rodzaju powiadomienia"}},short:{t:0,b:{t:2,i:[{t:3,v:"Tytuł niech będzie "},{t:4,k:"bold"},{t:3,v:"; ekran pokazuje około dwudziestu znaków w jednym wierszu, a dłuższy tytuł kończy wielokropkiem. Szczegóły umieść w podtytule."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"krótki"}},button:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" zamienia powiadomienie w pytanie: „Idę”, „Widzę”, „Wyłącz”. Zdarzenie powie Ci potem, kto odpowiedział."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"Własny tekst przycisku"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Alert, który sam się rozwiązuje (drzwi się otwierają, ktoś wyjmuje pranie), zamknij w tej samej automatyzacji akcją "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Wszystkie ekrany? Wywołaj "},{t:4,k:"event"},{t:3,v:" raz (zobacz „Wszystkie ekrany naraz”). Ekrany nadal działają niezależnie i każdy zgłasza się z własnym polem "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Wolisz "},{t:4,k:"bold"},{t:3,v:" o automatyzację? Zainstaluj umiejętność ESP Screens w sekcji Ustawienia → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"poprosić Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Dzwonek: pokaż alert i poczekaj, aż ktoś naciśnie przycisk."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Ktoś idzie do drzwi."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Zaawansowane · lokalne nadpisanie"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Nadpisanie YAML"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"Nadpisanie YAML · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Ten mały plik należy do Ciebie. Jest wczytywany po wspólnym pakiecie ekranu i zostaje na miejscu, gdy ESP Screens się aktualizuje. Zmieniaj tu szczegóły sprzętu, na przykład model wyświetlacza."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"Co można bezpiecznie zmieniać?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"Wyświetlacz, ekran dotykowy, substitutions, piny i inne szczegóły urządzenia. Nazwa, Wi-Fi, API, OTA i odnośniki do pakietów pozostają zarządzane przez aplikację."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Aktywne"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Gotowe do dołączenia"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"Lokalne nadpisanie YAML"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Użyj przykładu"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Wyczyść"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 znak"},{t:2,i:[{t:4,k:"n"},{t:3,v:" znaki"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" znaków"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 wiersz"},{t:2,i:[{t:4,k:"n"},{t:3,v:" wiersze"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" wierszy"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz i sprawdź"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz nadpisanie"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Nie znaleziono profilu ESPHome dla tego ekranu."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"Zmiany tutaj zadziałają przy następnej kompilacji."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Zapisz raz, aby dołączyć ten plik do profilu."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"Sprawdzanie i zapisywanie…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. Nadpisanie zostaje zachowane podczas aktualizacji firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano nadpisanie YAML."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Zapisano. ESPHome sprawdza cały profil…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome sprawdza profil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"ESPHome sprawdza profil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"Cały profil jest poprawny. Można bezpiecznie kompilować i instalować."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"ESPHome odrzucił cały profil. Pełny log znajdziesz w sekcji „Firmware i USB”."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Zastąpić obecny tekst przykładem?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Wczytano przykład. Zapisz go, kiedy zechcesz."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Wyczyścić lokalne nadpisanie?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"Po zapisaniu nadpisanie będzie puste."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Dom"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nieznany"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"włączono"}},off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"niedostępny"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"grzanie"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"chłodzenie"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"grzanie/chłodzenie"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"osuszanie"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"tylko wentylator"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"grzanie"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"chłodzenie"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"brak aktywności"}},off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"osuszanie"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"wentylator"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"podgrzewanie wstępne"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"rozmrażanie"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"otwieranie"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"zamykanie"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"odtwarzanie"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"wstrzymano"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"brak aktywności"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"tryb czuwania"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"w domu"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"poza domem"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"powyżej horyzontu"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"poniżej horyzontu"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"zadokowany"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"sprzątanie"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"wstrzymano"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"wraca do stacji dokującej"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"brak aktywności"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"słonecznie"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"pogodna noc"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"pochmurno"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"częściowe zachmurzenie"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"deszczowo"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"ulewa"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"opady śniegu"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"deszcz ze śniegiem"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"mgła"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"grad"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"wyładowania atmosferyczne"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"burza"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"wietrznie"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"warunki nadzwyczajne"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Low"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"Charging"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"brak ładowania"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"zimno"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"połączono"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"rozłączono"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"gorąco"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"odblokowano"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"zablokowano"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"w ruchu"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"brak ruchu"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"podłączono"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"odłączono"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"włączono"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Home"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Away"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"problem"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"ok"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"działa"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"nie działa"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"zagrożenie"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"brak zagrożenia"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Tampering detected"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"dostępna aktualizacja"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"brak aktualizacji"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"wykryto"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"brak"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"otwarto"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"zamknięto"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Aktywuj"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Uruchom"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Naciśnij"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Low"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Medium"}},high:{t:0,b:{t:2,i:[{t:3}],s:"High"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"pośredni"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"skupiony nawiew"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"rozproszony nawiew"}},top:{t:0,b:{t:2,i:[{t:3}],s:"nawiew górny"}},on:{t:0,b:{t:2,i:[{t:3}],s:"włączono"}},off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"włączono"}},off:{t:0,b:{t:2,i:[{t:3}],s:"wyłączono"}},both:{t:0,b:{t:2,i:[{t:3}],s:"ruch w obu płaszczyznach"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"ruch pionowy"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"ruch poziomy"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Przed chwilą"}},minutes_ago:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min temu"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 godzinę temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" godziny temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" godzin temu"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Wczoraj"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 dzień temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" dni temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" dni temu"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 tydzień temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" tygodnie temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" tygodni temu"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 miesiąc temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" miesiące temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" miesięcy temu"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"1 rok temu"},{t:2,i:[{t:4,k:"n"},{t:3,v:" lata temu"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" lat temu"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Za 1 godzinę"},{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" godziny"}]},{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" godzin"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Jutro"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3}],s:"Za 1 dzień"},{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" dni"}]},{t:2,i:[{t:3,v:"Za "},{t:4,k:"n"},{t:3,v:" dni"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"AM"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"PM"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"niedziela"}},{t:0,b:{t:2,i:[{t:3}],s:"poniedziałek"}},{t:0,b:{t:2,i:[{t:3}],s:"wtorek"}},{t:0,b:{t:2,i:[{t:3}],s:"środa"}},{t:0,b:{t:2,i:[{t:3}],s:"czwartek"}},{t:0,b:{t:2,i:[{t:3}],s:"piątek"}},{t:0,b:{t:2,i:[{t:3}],s:"sobota"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"niedz."}},{t:0,b:{t:2,i:[{t:3}],s:"pon."}},{t:0,b:{t:2,i:[{t:3}],s:"wt."}},{t:0,b:{t:2,i:[{t:3}],s:"śr."}},{t:0,b:{t:2,i:[{t:3}],s:"czw."}},{t:0,b:{t:2,i:[{t:3}],s:"pt."}},{t:0,b:{t:2,i:[{t:3}],s:"sob."}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"nd"}},{t:0,b:{t:2,i:[{t:3}],s:"pn"}},{t:0,b:{t:2,i:[{t:3}],s:"wt"}},{t:0,b:{t:2,i:[{t:3}],s:"śr"}},{t:0,b:{t:2,i:[{t:3}],s:"cz"}},{t:0,b:{t:2,i:[{t:3}],s:"pt"}},{t:0,b:{t:2,i:[{t:3}],s:"sb"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"stycznia"}},{t:0,b:{t:2,i:[{t:3}],s:"lutego"}},{t:0,b:{t:2,i:[{t:3}],s:"marca"}},{t:0,b:{t:2,i:[{t:3}],s:"kwietnia"}},{t:0,b:{t:2,i:[{t:3}],s:"maja"}},{t:0,b:{t:2,i:[{t:3}],s:"czerwca"}},{t:0,b:{t:2,i:[{t:3}],s:"lipca"}},{t:0,b:{t:2,i:[{t:3}],s:"sierpnia"}},{t:0,b:{t:2,i:[{t:3}],s:"września"}},{t:0,b:{t:2,i:[{t:3}],s:"października"}},{t:0,b:{t:2,i:[{t:3}],s:"listopada"}},{t:0,b:{t:2,i:[{t:3}],s:"grudnia"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"sty"}},{t:0,b:{t:2,i:[{t:3}],s:"lut"}},{t:0,b:{t:2,i:[{t:3}],s:"mar"}},{t:0,b:{t:2,i:[{t:3}],s:"kwi"}},{t:0,b:{t:2,i:[{t:3}],s:"maj"}},{t:0,b:{t:2,i:[{t:3}],s:"cze"}},{t:0,b:{t:2,i:[{t:3}],s:"lip"}},{t:0,b:{t:2,i:[{t:3}],s:"sie"}},{t:0,b:{t:2,i:[{t:3}],s:"wrz"}},{t:0,b:{t:2,i:[{t:3}],s:"paź"}},{t:0,b:{t:2,i:[{t:3}],s:"lis"}},{t:0,b:{t:2,i:[{t:3}],s:"gru"}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:" "}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"2"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Strona "},{t:4,k:"n"}]}}}}};export{t as default}; diff --git a/screen_manager/app/static/assets/pt-C_sKl9l8.js b/screen_manager/app/static/assets/pt-Cj4BVpRQ.js similarity index 56% rename from screen_manager/app/static/assets/pt-C_sKl9l8.js rename to screen_manager/app/static/assets/pt-Cj4BVpRQ.js index 82336e5..f3901e8 100644 --- a/screen_manager/app/static/assets/pt-C_sKl9l8.js +++ b/screen_manager/app/static/assets/pt-Cj4BVpRQ.js @@ -1 +1 @@ -const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Desfazer"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"desconhecido"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Alterações não guardadas"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Cancelar"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Abrir Dispositivos & serviços"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Guardar e enviar"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"A guardar…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Ler dados atuais"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" resultado. Continue a escrever para filtrar."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" resultados. Continue a escrever para filtrar."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Fechar"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remover"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Alterar"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"A carregar…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Voltar"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copiar"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Novo ecrã"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware e USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alertas"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Definições"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Ligar e instalar"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Não funcionou. Recarregue a página e tente novamente."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Chave API copiada."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"A chave API está selecionada. Copie-a com Ctrl+C ou Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON do layout copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O JSON do layout está selecionado. Copie-o com Ctrl+C ou Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome da ação copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O nome da ação está selecionado. Copie-o com Ctrl+C ou Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O YAML está selecionado. Copie-o com Ctrl+C ou Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome do ícone copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O nome do ícone está selecionado. Copie-o com Ctrl+C ou Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Cor vazia copiada."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"A cor vazia está selecionada. Copie-a com Ctrl+C ou Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome da cor copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O nome da cor está selecionado. Copie-o com Ctrl+C ou Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Página de gestão inacessível · a tentar novamente…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Ligado ao Home Assistant"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"A ligar novamente ao Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procurar"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Ecrãs"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Mais"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Recarregar"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"Na fila para atualizar"}},available:{t:0,b:{t:2,i:[{t:3,v:"Atualização para "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Não foi encontrado nenhum perfil ESPHome com este nome de dispositivo."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Novidades"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Registo completo"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"O endereço IP, só desta vez; o firmware novo passa a comunicá-lo sozinho."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Endereço IP, p. ex. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Endereço IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Iniciar"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Instalado, mas ainda não está no Home Assistant. Adicione o dispositivo ESPHome descoberto em Configuração → Dispositivos & serviços, cole lá a chave API e ative «Permitir que o dispositivo execute ações do Home Assistant» em Configurar."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware descarregado; ainda não está no Home Assistant. Instale-o no ecrã com o ESPHome Web e depois adicione o dispositivo ESPHome descoberto em Configuração → Dispositivos & serviços, cole lá a chave API e permita as ações do Home Assistant em Configurar."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Ainda não está no Home Assistant. Já instalou o firmware? Adicione o dispositivo ESPHome em Configuração → Dispositivos & serviços e depois permita as ações do Home Assistant em Configurar. Ainda não? Firmware e USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copiar chave API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Ecrãs"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Ações"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Adicionar a este ecrã"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Guia rápido e um alerta de teste"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Atualizações, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nada para guardar"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificar este ecrã"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Faz piscar a retroiluminação e mostra um cartão"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Precisa de um firmware mais recente"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exportar layout"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Descarregar e copiar como JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Procurar ecrãs, entidades, ações…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Sem resultados. Escreva parte do nome de um ecrã, entidade ou ação."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Escolha um ecrã"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Escolha um dos seus ecrãs à esquerda para alterar os mosaicos, a barra superior e as definições."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Comece com um ecrã"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Ligue um CYD ou um Guition por USB à máquina do Home Assistant. Perfil, firmware e primeira instalação ficam feitos de uma só vez."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Instalar novo ecrã"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Tem alterações não guardadas. Abrir outro ecrã mesmo assim?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Substituir o layout não guardado por uma cópia do layout do outro ecrã?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Substituir o layout não guardado pelo importado?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. O seu ecrã está a ser atualizado."}},other:{t:0,b:{t:2,i:[{t:3,v:"Guardado. "},{t:4,k:"name"},{t:3,v:" está a ser atualizado."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. O ecrã está a ser atualizado."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. A sua alteração mais recente ainda não foi enviada: prima Guardar e enviar outra vez."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" pisca e mostra um cartão durante alguns segundos."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · as alterações ficam guardadas"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Layout"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Definições do ecrã"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Guardado · enviado para o ecrã"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Tudo guardado"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Mais"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificar"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"faz piscar o ecrã"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Precisa do firmware 0.2.31 ou mais recente"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"do Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copiar layout de…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ecrã"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ecrãs"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"nenhum outro ecrã"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" mosaico"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" mosaicos"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exportar layout"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importar layout…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"avançado"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Não foi encontrado nenhum perfil ESPHome para este ecrã"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Removido: "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Não há espaço para este mosaico na página "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Não há nenhuma página livre para um mosaico de página inteira. Liberte primeiro uma página."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Este ecrã já tem um mosaico que leva à página "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Layout de "},{t:4,k:"name"},{t:3,v:" copiado. Prima Guardar e enviar quando estiver bem."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Layout de "},{t:4,k:"name"},{t:3,v:" copiado: "},{t:4,k:"kept"},{t:3,v:" de "},{t:4,k:"total"},{t:3,v:" mosaicos são compatíveis com o firmware deste ecrã. Prima Guardar e enviar quando estiver bem."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Layout importado. Prima Guardar e enviar quando estiver bem."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Layout importado: "},{t:4,k:"kept"},{t:3,v:" de "},{t:4,k:"total"},{t:3,v:" mosaicos são compatíveis com o firmware deste ecrã. Prima Guardar e enviar quando estiver bem."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Isso não é JSON. Exporte primeiro um layout ou cole um de outro ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Este ficheiro não tem mosaicos. Era esperado um layout exportado do ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" página · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" mosaicos"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" páginas · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" mosaicos"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Adicione a primeira luz, cena ou dispositivo a partir da biblioteca."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Toque na barra superior ou num mosaico para o alterar. Arraste para mover; largue na página seguinte para criar uma nova."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Os espaços vazios e as posições fixas funcionam a partir do firmware 0.2.26. Até essa atualização, este ecrã (firmware "},{t:4,k:"firmware"},{t:3,v:") sobe os mosaicos para o primeiro espaço livre."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Layout do ecrã"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Adicionar página"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"No máximo "},{t:4,k:"n"},{t:3,v:" página"}]},{t:2,i:[{t:3,v:"No máximo "},{t:4,k:"n"},{t:3,v:" páginas"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Página "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remover página"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"As páginas seguintes sobem uma posição"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Editar barra superior"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Espaço vazio. Clique para adicionar aqui um mosaico ou arraste um para cá."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Espaço vazio "},{t:4,k:"slot"},{t:3,v:" na página "},{t:4,k:"page"},{t:3,v:": adicione aqui o próximo mosaico"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"O próximo mosaico fica aqui"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Vazio"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Biblioteca"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entidade"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entidades"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procurar por nome, dispositivo ou divisão…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Adicionar uma entidade"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Tudo"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Luzes"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatização"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruptores"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Estado"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Ações"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventoinhas"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Coberturas"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Cenas"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirador"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensores"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Multimédia"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valores"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Seletores"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Pessoas"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Temporizadores"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Divisão"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Todas as divisões"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Ocultar adicionadas"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Ocultar o que já está neste ecrã"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Tudo o que está aqui já está neste ecrã."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma entidade encontrada. Experimente outro nome, divisão ou filtro."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Neste ecrã cabe "},{t:4,k:"n"},{t:3,v:" mosaico."}]},{t:2,i:[{t:3,v:"Neste ecrã cabem "},{t:4,k:"n"},{t:3,v:" mosaicos."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Neste ecrã cabe "},{t:4,k:"n"},{t:3,v:" mosaico; atualize o firmware para ter 48."}]},{t:2,i:[{t:3,v:"Neste ecrã cabem "},{t:4,k:"n"},{t:3,v:" mosaicos; atualize o firmware para ter 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Arraste para uma página ou toque em + para adicionar ao primeiro espaço livre. ⌘K procura em tudo."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Luz"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatização"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirador"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventoinha"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Cobertura"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Multimédia"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Estado"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruptor"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Interruptor"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Cena"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valor"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Valor"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Seletor"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Seletor"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Ação"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Ação"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sol"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Temporizador"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Pessoa"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Câmara"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Imagem"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entidade"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"padrão"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"valor grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"previsão do tempo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"gráfico"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"relógio digital"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"relógio analógico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"trajetória do sol"}},live:{t:0,b:{t:2,i:[{t:3}],s:"imagem ao vivo"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"capa do álbum"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"duplo"}},full:{t:0,b:{t:2,i:[{t:3}],s:"página inteira"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nome no ecrã"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automático (do Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automático (predefinido)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã mostra o ícone escolhido a partir do firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Leva à página"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (vazia)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Os mosaicos de navegação precisam do firmware 0.2.62: prima primeiro Atualizar na lista de ecrãs."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Este ecrã não tem página "},{t:4,k:"page"},{t:3,v:", por isso um toque abre a última página. Escolha outra página."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Um toque no mosaico abre essa página."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Apresentação"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Relógio digital"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Relógio analógico"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nome e estado"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Valor grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Previsão do tempo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Gráfico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Trajetória do sol"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Imagem ao vivo"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Uma pequena imagem da câmara no lugar do ícone, atualizada ao ritmo abaixo enquanto a página está no ecrã. Um toque continua a abri-la em ecrã inteiro."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Uma imagem ao vivo precisa do firmware 0.2.77 ou mais recente: prima Atualizar no ecrã depois de guardar."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Capa do álbum"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"A capa do álbum do que está a tocar no lugar do ícone, como no próprio mosaico do Home Assistant; um leitor sem imagem mantém o seu ícone. Um toque continua a abrir o cartão."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"A capa do álbum no mosaico precisa do firmware 0.2.78 ou mais recente: prima Atualizar no ecrã depois de guardar."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não tem valores numéricos para esta entidade, por isso o gráfico fica vazio. Escolha outra apresentação."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Este serviço meteorológico não tem previsão diária no Home Assistant. Escolha outra apresentação."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"A cada "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Tamanho"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Largura dupla"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Página inteira"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Página inteira: um botão grande na cor do próprio mosaico; em baixo ficam um deslizador, controlos ou um gráfico."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Um mosaico de página inteira precisa do firmware 0.2.62: prima primeiro Atualizar na lista de ecrãs."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Página"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nova página"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Controlo direto no mosaico"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não oferece este controlo para esta entidade, por isso fica vazio no ecrã. Escolha outro."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Na parte de baixo do mosaico de página inteira; um toque em qualquer outro sítio funciona como definido abaixo."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"À direita do mosaico de largura dupla, como as linhas no Home Assistant. Tocar no nome funciona como definido abaixo."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã mostra o controlo direto a partir do firmware 0.2.19; até lá, o mosaico fica como estava."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Ao tocar"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automático"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Abrir controlo"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Só ver"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Ligar / desligar"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Executar ação"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não consegue ligar e desligar isto, por isso um toque não faz nada. Escolha outra opção."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã liga e desliga isto a partir do firmware 0.2.58: prima Atualizar na lista de ecrãs. Até lá, um toque abre o respetivo cartão."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Mantenha o mosaico premido para abrir o respetivo cartão."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Controlo deslizante pequeno no mosaico"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Não"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Sim, controlo direto"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não tem nada que um controlo deslizante possa alterar nesta entidade. Escolha Não."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Histórico"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" hora"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" horas"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Fundo pastel"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Fundo: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", espaço "},{t:4,k:"slot"},{t:3,v:" da página "},{t:4,k:"page"},{t:3,v:". Enter: configurar; teclas de seta: mover"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remover mosaico"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Remover "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Ação"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"A perguntar ao Home Assistant que ações tem esta entidade…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não está a responder neste momento. Tente novamente daqui a pouco."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Escolha uma ação"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procure, por exemplo alternar, posição ou reproduzir"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Procurar uma ação"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma ação encontrada."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant já não oferece esta ação para esta entidade, por isso um toque não faz nada. Escolha outra."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (opcional)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Não definido"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Ativado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desativado"}},needs:{t:0,b:{t:2,i:[{t:3,v:"O Home Assistant precisa de "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã executa ações a partir do firmware 0.2.58: prima Atualizar na lista de ecrãs. Até lá, um toque funciona como Automático."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Ícone"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Sem ícone"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procure, por exemplo candeeiro, música ou porta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Procurar um ícone"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Sem ícone, só texto"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Ícone: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nenhum ícone encontrado."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Dados atuais"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Ligação, estado e propriedades suportadas"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"A ler…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"A obter o estado atual do HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Estado: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Controlo deslizante pequeno: "},{t:4,k:"slider"},{t:3,v:" · Apresentação: "},{t:4,k:"display"},{t:3,v:" · Tamanho: "},{t:4,k:"size"},{t:3,v:" · Controlo: "},{t:4,k:"control"},{t:3,v:" · Fundo: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"sim"}},no:{t:0,b:{t:2,i:[{t:3}],s:"não"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"nenhum"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Predefinido"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Ler novamente"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Removido da barra superior: "},{t:4,k:"name"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Na barra superior cabe "},{t:4,k:"n"},{t:3,v:" elemento."}]},{t:2,i:[{t:3,v:"Na barra superior cabem "},{t:4,k:"n"},{t:3,v:" elementos."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"Isto já está na barra superior."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Barra superior"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Barra superior: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Do próprio ecrã; também funciona sem o Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" elemento"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" elementos"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Esquerda: nome"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Por exemplo: Sala de estar"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Direita: hora, sensores ou um relógio"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", espaço "},{t:4,k:"slot"},{t:3,v:". Enter: configurar; setas: mover"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Remover "},{t:4,k:"name"},{t:3,v:" da barra superior"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"No máximo "},{t:4,k:"n"},{t:3,v:" elemento"}]},{t:2,i:[{t:3,v:"No máximo "},{t:4,k:"n"},{t:3,v:" elementos"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Adicione a hora, a data, o relógio analógico ou uma entidade"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Adicionar hora, data ou uma entidade"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Nem tudo cabe ao lado do nome: o ecrã omite os elementos tracejados. Remova um ou escolha um nome mais curto."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Arraste para reordenar; toque num elemento para o configurar."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Os sensores, a data e o relógio analógico aparecem a partir do firmware "},{t:4,k:"version"},{t:3,v:"; até essa atualização, este ecrã mostra o nome e, se a hora estiver na barra, o relógio."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Oculto: agora não está ativo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Não cabe ao lado do nome"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Mostrador"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Oculto neste momento: não está ativo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"De momento não cabe ao lado do nome"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Assim fica no ecrã"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Mostrador pequeno com a hora"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"O que mostrar"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Última alteração» continua a contar no próprio ecrã: «Agora mesmo», «Há 5 min», «Ontem»."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automático (como no Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mostrar"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Apenas quando ativo» oculta o elemento enquanto estiver desligado, fechado, ausente ou a 0. Útil para uma porta aberta, uma máquina de lavar a funcionar ou quem está em casa."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Relógio de 24 horas · altere em "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Relógio de 12 horas · altere em "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Definições → Idioma e região"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Hoje: "},{t:4,k:"date"},{t:3,v:". A data segue o relógio do próprio ecrã."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Subir"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Descer"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Adicionar à barra superior"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" espaço usado"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" espaços usados"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Do próprio ecrã"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Já adicionado"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Sugestões do Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Uma entidade"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procure por nome, divisão ou entidade, p. ex. temperatura ou porta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Procurar uma entidade para a barra superior"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma entidade encontrada."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brilho"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Noite"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brilho"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Modo escuro"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Espera automática"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Espera após"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brilho em espera"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Modo noturno"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Início"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Fim"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brilho noturno"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Voltar à página 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Após"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Também em espera"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Deslizar entre páginas"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Botões de página"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotação"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" da manhã"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" da tarde"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Ainda se estão a guardar as definições do outro ecrã. Tente novamente daqui a pouco."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Os botões de página e o deslizar estão desativados, por isso só os mosaicos «Ir para a página» mudam de página."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"a página "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"as páginas "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaico «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaico «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:", mas nenhum para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]},{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:", mas nenhum para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaico «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:", mas nenhum para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]},{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:", mas nenhum para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Não tem mosaicos «Ir para a página»."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Não tem mosaicos «Ir para a página» para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Não tem mosaicos «Ir para a página» para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Os mosaicos para "},{t:4,k:"pages"},{t:3,v:" só estão em páginas a que não consegue chegar."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Desde "},{t:4,k:"pages"},{t:3,v:", nenhum mosaico leva de volta à página 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Este ecrã está offline. Poderá alterar as definições quando voltar."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"As alterações aplicam-se de imediato no ecrã e aparecem aqui quando são feitas lá."}},app:{t:0,b:{t:2,i:[{t:3}],s:"As alterações aplicam-se de imediato. Com o firmware 0.2.49, o próprio ecrã guarda-as."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Esta entidade está desativada no Home Assistant ou o ecrã está a reiniciar."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": menos"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": mais"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"A iniciar a atualização…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"A compilar o firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"A gravar o firmware por Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"A compilar e a instalar…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"À espera que o ecrã volte…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"A verificar se se mantém estável…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Novo idioma: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Os ecrãs vão passar a atualizar-se automaticamente à noite."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"As atualizações automáticas estão desativadas."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Atualizações de firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"A atualizar para o firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Ainda não há nenhum ecrã emparelhado. Os novos ecrãs recebem o firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"O firmware "},{t:4,k:"version"},{t:3,v:" está disponível para "},{t:4,k:"n"},{t:3,v:" ecrã."}]},{t:2,i:[{t:3,v:"O firmware "},{t:4,k:"version"},{t:3,v:" está disponível para "},{t:4,k:"n"},{t:3,v:" ecrãs."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Todos os ecrãs têm o firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Atualizar "},{t:4,k:"n"},{t:3,v:" ecrã"}]},{t:2,i:[{t:3,v:"Atualizar os "},{t:4,k:"n"},{t:3,v:" ecrãs"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Novidades do firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar automaticamente todas as noites"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Entre as 03:00 e as 06:00, um ecrã de cada vez. Para se houver um erro e comunica-o no Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Habilidade instalada. O Claude Code deteta-a de imediato."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Habilidade instalada. Reinicie o Claude Code uma vez para que encontre a nova pasta de habilidades."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Ensine o Claude a usar o ESP Screens e depois peça: «Mostra um alerta em todos os meus ecrãs quando a caixa do correio estiver cheia.» O Claude conhece os eventos de alerta e todos os campos, cores e ícones."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Instalar para o Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Instalar novamente"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar a habilidade"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Não instalada"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Instalada"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Instalada · há uma versão mais recente"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Para o Claude Code no Home Assistant. Escreve um ficheiro em "},{t:4,k:"path"},{t:3,v:"; instalar novamente substitui-o."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descarregar para o claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Carregue o zip no Claude, em Personalizar → Habilidades."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tudo o que rodeia os seus ecrãs."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Os meus ecrãs"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Ecrãs"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Adicione um ecrã, ou compile e reinstale o firmware de um que já tenha."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar por USB ou Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Idioma e região"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Idioma dos ecrãs"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Idioma do Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Idioma do Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Os ecrãs usam inglês até o idioma do Home Assistant estar disponível."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · ainda não revisto, ajuda bem-vinda"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" ainda não foi revisto; toda a ajuda é bem-vinda: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"como traduzir"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Depois de uma alteração, cada ecrã precisa de uma atualização de firmware, uma compilação por ecrã: com o respetivo botão Atualizar ou nas atualizações noturnas."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Formato de hora"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automático, segue o idioma ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 horas"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 horas"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Formatação numérica"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automático, segue o idioma ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"O seu perfil do Home Assistant: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Usar estes"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"O próprio editor segue o idioma do seu perfil do Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Guardado."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. Cada ecrã passa a usar o novo idioma na próxima atualização."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Um cartão sobre todo o ecrã a partir de uma automatização, num ecrã ou em todos. O guia rápido tem os nomes das ações, os campos, os ícones e as cores, e um formulário para experimentar um alerta."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Notificações em ecrã inteiro, a partir de uma automatização"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar o firmware dos ecrãs"}},intro:{t:0,b:{t:2,i:[{t:3,v:"A CLI do ESPHome integrada usa o seu próprio perfil (YAML com chaves) e os seus segredos. Escolha o perfil do ecrã e depois uma porta USB (ecrã ligado à máquina do Home Assistant), "},{t:4,k:"ota"},{t:3,v:" com o nome do anfitrião, ou "},{t:4,k:"download"},{t:3,v:" para instalar o firmware no ecrã a partir do seu próprio computador. "},{t:4,k:"check"},{t:3,v:" só valida, "},{t:4,k:"build"},{t:3,v:" compila e "},{t:4,k:"install"},{t:3,v:" instala o firmware no ecrã. Os seus mosaicos ficam como estão no ESP Screens. A primeira compilação demora alguns minutos."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descarregar"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Verificar"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Só compilar"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e descarregar"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Falta a CLI do ESPHome. Atualize a app para a versão 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Escolha o perfil pretendido e depois uma porta USB, um endereço IP ou Descarregar."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Perfil ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Instalar em"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · ainda não foi encontrada nenhuma placa na máquina do Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Descarregar · instalar a partir do seu próprio computador"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Endereço IP ou nome do anfitrião"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Descarregar "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Instale-o no ecrã com o "},{t:4,k:"esphome_web"},{t:3,v:" no Chrome ou no Edge: Connect, escolha a porta USB do ecrã, Install e selecione este ficheiro. Contém a sua palavra-passe de Wi-Fi e as chaves do ecrã: não o partilhe."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Ligar e instalar."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Perfil guardado."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Um momento…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Pronto para descarregar."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Concluído."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Não funcionou."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"O ESP Screens cria o perfil próprio do ecrã com chaves únicas e compila o firmware. Ligue o ecrã com um cabo USB de dados à máquina onde corre o Home Assistant, ou descarregue o firmware e instale-o no ecrã a partir do seu próprio computador."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Que ecrã tem?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 polegadas"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 polegadas"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nome"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã da sala"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nome do dispositivo"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"personalizar"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cada ecrã tem o seu próprio perfil com as suas próprias chaves. Quatro ecrãs? Faça isto quatro vezes com um nome diferente."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Letras minúsculas, algarismos e hífenes. Um nome diferente para cada ecrã."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nome da rede Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Palavra-passe da rede Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Preencha só uma vez: o ESP Screens guarda isto no secrets.yaml do ESPHome e os ecrãs seguintes usam-no automaticamente."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Ainda faltam os dados de Wi-Fi no seu secrets.yaml do ESPHome. O ESP Screens só preenche as linhas em falta."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"A rede Wi-Fi vem do seu secrets.yaml do ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"O secrets.yaml na pasta do ESPHome não é YAML válido. Corrija primeiro o ficheiro; não vai ser substituído."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Instalar através de"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Mais tarde · só guardar o perfil"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Ligue o ecrã com um cabo USB de dados à máquina do Home Assistant; a lista atualiza-se sozinha. Ou escolha Descarregar para usar o seu próprio computador."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descarregue o firmware e instale-o no ecrã a partir do seu próprio computador, no Chrome ou no Edge. Depois disso, as atualizações são feitas por Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"O perfil fica na pasta do ESPHome. Pode instalar mais tarde através de Firmware e USB ou a partir do ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Há mais do que uma placa ligada: escolha a porta deste ecrã."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Uma vez por USB; depois disso, tudo é sem fios."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Instalar"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Guardar perfil"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Já está a decorrer uma compilação ou instalação ("},{t:4,k:"file"},{t:3,v:"). Aguarde que termine."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Falta a CLI do ESPHome nesta instalação; só é possível guardar o perfil."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" está na pasta do ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"A gravar o firmware em "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"A compilar o firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"O firmware para "},{t:4,k:"name"},{t:3,v:" está pronto"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"O firmware já está em "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"A compilação falhou"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"A instalação falhou"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Instale-o mais tarde a partir de Firmware e USB: escolha este perfil e depois a porta USB da máquina do Home Assistant, ou Descarregar para instalar o firmware no ecrã a partir do seu próprio computador. Guarde a chave API para o emparelhamento:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Não desligue ainda o cabo USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"A primeira compilação demora alguns minutos num Raspberry Pi. Pode sair desta página: a instalação continua e volta a encontrá-la em Novo ecrã."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"A primeira compilação demora alguns minutos num Raspberry Pi. Pode sair desta página: a compilação continua e volta a encontrá-la em Novo ecrã."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Instale-o no ecrã a partir do seu próprio computador e depois emparelhe o ecrã com o Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã arranca e liga-se à sua rede Wi-Fi. Emparelhe-o agora com o Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã arranca e liga-se à sua rede Wi-Fi. O CYD pede primeiro uma calibração do toque: toque nas cruzes. Emparelhe-o agora com o Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Consulte o registo abaixo."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" com um cabo USB de dados."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ligue o ecrã ao seu computador"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" no Chrome ou no Edge, clique em Connect e escolha a porta USB do ecrã."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Abra o "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" e selecione "},{t:4,k:"file"},{t:3,v:". O ecrã reinicia e liga-se à sua rede Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" e selecione "},{t:4,k:"file"},{t:3,v:". O ecrã reinicia e liga-se à sua rede Wi-Fi. O CYD pede primeiro uma calibração do toque: toque nas cruzes."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Clique em Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"O ficheiro contém a sua palavra-passe de Wi-Fi e as chaves do ecrã: não o partilhe."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Chave API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Isto acontece fora do ESP Screens. O Home Assistant descobre "},{t:4,k:"name"},{t:3,v:" como dispositivo ESPHome; clique em Adicionar. Não foi descoberto? Adicione o ESPHome manualmente com o endereço IP do ecrã."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Vá ao Home Assistant → Configuração → Dispositivos & serviços."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" acima quando o Home Assistant pedir a chave de encriptação."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Cole a chave API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" integração ESPHome → Configurar → «Permitir que o dispositivo execute ações do Home Assistant». Sem isto, o ecrã vê tudo mas não controla nada."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Permita as ações do HA:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" De volta ao ESP Screens, o ecrã aparece na lista à esquerda em cerca de trinta segundos; até lá, aparece aí como «ainda não está no Home Assistant»."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Escolha os seus mosaicos."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Registo do ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Tentar novamente"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Instalar outro ecrã"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Recomeçar"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Concluído"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alertas · guia rápido"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Uma notificação em ecrã inteiro, a partir de uma automatização."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Cada ecrã tem a ação "},{t:4,k:"action"},{t:3,v:". Coloca um cartão por cima de tudo, acorda o ecrã e mantém a retroiluminação no brilho normal até alguém tocar no botão ou o tempo limite acabar. O próprio Home Assistant não mostra explicações nem listas pendentes para as ações do ESPHome; tudo o que pode preencher está aqui."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"O guia rápido ainda está a carregar; um momento."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Está alguém à porta"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Porta 3, traseira"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Já vou"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Secções"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Experimente"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Os seus ecrãs"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"Numa automatização"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Todos os ecrãs"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Os campos"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Ícones"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Cores"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Comportamento"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Eventos"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Dicas"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Envie agora um alerta, com os mesmos campos que uma automatização envia. O ecrã mostra o cartão e, com a intermitência ativada, faz piscar a retroiluminação."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã"}},all:{t:0,b:{t:2,i:[{t:3,v:"Todos os ecrãs (prontos: "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · não está pronto"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Título"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Subtítulo"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Ícone"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Cor"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Texto do botão"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Tempo limite (segundos; 0 espera pelo botão)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Fazer piscar a retroiluminação"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Quatro vezes quando o alerta chega."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"A enviar…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Enviar alerta"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Enviado para "},{t:4,k:"n"},{t:3,v:" ecrã."}]},{t:2,i:[{t:3,v:"Enviado para "},{t:4,k:"n"},{t:3,v:" ecrãs."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Enviado para "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Enviado para o ecrã."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ecrã ignorado (offline ou firmware antigo)."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ecrãs ignorados (offline ou firmware antigo)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Deixados vazios: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Nenhum ecrã o conseguiu mostrar: verifique se há um ecrã online com o firmware "},{t:4,k:"version"},{t:3,v:" ou mais recente."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Branco (predefinido)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Cada ecrã tem a sua própria ação, com o nome do dispositivo. A partir do firmware "},{t:4,k:"version"},{t:3,v:"; atualize um ecrã mais antigo com o respetivo botão Atualizar em Ecrãs."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Ainda não há nenhum ecrã emparelhado. Instale um através de Novo ecrã; a ação aparece assim que o Home Assistant vir o ecrã."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Atualização necessária · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nome do dispositivo desconhecido · atualize o ecrã"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Mostrar alerta"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Descartar alerta"}}},howto:{add:{t:0,b:{t:2,i:[{t:3,v:"Clique em "},{t:4,k:"add"},{t:3,v:" e procure "},{t:4,k:"esphome"},{t:3,v:". Escolha a ação do seu ecrã: o Home Assistant chama-lhe «Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"»."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Adicionar ação"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nome do dispositivo"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" O Home Assistant pede os sete; deixe vazio o que não usar ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", desativado)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Preencha os campos."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Prefere YAML? Escolha "},{t:4,k:"edit"},{t:3,v:" na ação e cole o exemplo abaixo."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Exemplo para"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"um ecrã (ainda não emparelhado)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Editar em YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copiar YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Todos os ecrãs de uma vez"}},text:{t:0,b:{t:2,i:[{t:3,v:"Dispare o evento "},{t:4,k:"show"},{t:3,v:" com os mesmos campos e o ESP Screens passa o alerta a todos os ecrãs online, incluindo os que adicionar mais tarde. "},{t:4,k:"dismiss"},{t:3,v:" remove-o em todo o lado. Numa automatização, adicione a ação "},{t:4,k:"event"},{t:3,v:" ou cole o exemplo em "},{t:4,k:"edit"},{t:3,v:". Omita os campos que não usar. Para isto, o ESP Screens tem de estar em execução."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Dispara evento manual"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"O texto é livre; o limite é em bytes e uma letra acentuada conta como dois. O que não couber termina em reticências (título) ou é descartado (subtítulo)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Campo"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Tipo"}},what:{t:0,b:{t:2,i:[{t:3}],s:"O que faz"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Exemplo"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limite"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"texto"}},int:{t:0,b:{t:2,i:[{t:3}],s:"número"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"ativado / desativado"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entidade"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"de 0 a 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Preencha o nome em "},{t:4,k:"field"},{t:3,v:", por exemplo "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" e o código hexadecimal ("},{t:4,k:"hex"},{t:3,v:") também funcionam. O firmware só inclui estes ícones; qualquer outro nome mostra o triângulo de aviso. Toque num ícone para copiar o nome."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Úteis para notificações"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Procurar um ícone"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procurar por nome ou descrição…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Também disponíveis: ícones de controlo e de meteorologia"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copiar "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Nenhum ícone para «"},{t:4,k:"query"},{t:3,v:"». Os nomes desconhecidos mostram o triângulo de aviso ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Preencha o nome em "},{t:4,k:"field"},{t:3,v:". São os tons pastel dos mosaicos, com texto escuro. Vazio ou desconhecido dá o cartão branco. Toque para copiar."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Um alerta acorda de imediato um ecrã com brilho reduzido ou apagado e aparece por cima de todas as páginas, de todos os cartões de luz abertos e da camada de espera."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Acorda o ecrã."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Enquanto o cartão estiver visível, a retroiluminação mantém o brilho normal. A espera automática e o modo noturno ficam em pausa. Depois de premir o botão, o tempo de espera normal recomeça."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aceso até premir o botão."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" espera pelo botão, demore o que demorar. Com "},{t:4,k:"minute"},{t:3,v:", o cartão desaparece ao fim de um minuto, mas o botão fecha-o mais cedo."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tempo limite."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" faz piscar a retroiluminação quatro vezes quando o alerta chega (cerca de um segundo) e depois deixa o ecrã ligado."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Intermitência."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Um alerta novo substitui o atual; não se acumulam. O alerta substituído é reportado como "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Substituição."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" remove o cartão, por exemplo se a porta já estiver aberta. Sem alerta, essa ação não faz nada."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fecho remoto."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" não faz nada; só o botão o fecha. Assim, um toque para acordar o ecrã nunca descarta o alerta por acidente."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tocar fora do cartão"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Sempre que um alerta termina, é disparado o evento "},{t:4,k:"event"},{t:3,v:" com "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (o nome do dispositivo) e o "},{t:4,k:"device_id"},{t:3,v:" que o Home Assistant acrescenta. Visível em Configuração → Ferramentas → Eventos."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Quando"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Esperar que alguém prima o botão"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Use uma "},{t:4,k:"bold"},{t:3,v:": laranja para a porta, vermelho para fumo ou água, verde para «concluído». O texto fica sempre escuro e legível."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"cor por tipo de notificação"}},short:{t:0,b:{t:2,i:[{t:3,v:"Mantenha o título "},{t:4,k:"bold"},{t:3,v:"; um ecrã mostra cerca de vinte caracteres numa linha e termina um título mais longo com reticências. Coloque os detalhes no subtítulo."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"curto"}},button:{t:0,b:{t:2,i:[{t:3,v:"Um "},{t:4,k:"bold"},{t:3,v:" transforma a notificação numa pergunta: «Já vou», «Visto», «Desligar». Depois, o evento diz-lhe quem respondeu."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"texto de botão personalizado"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Para um alerta que se resolve sozinho (a porta abre-se, alguém tira a roupa da máquina), feche-o na mesma automatização com "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Todos os ecrãs? Dispare "},{t:4,k:"event"},{t:3,v:" uma vez (ver «Todos os ecrãs de uma vez»). Os ecrãs continuam a funcionar de forma independente e cada um reporta com o seu próprio "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Prefere "},{t:4,k:"bold"},{t:3,v:" que faça a automatização? Instale a habilidade do ESP Screens em Definições → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"pedir ao Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Campainha: mostra o alerta e espera que alguém prima o botão."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Vem alguém à porta."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avançado · personalização local"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML personalizado · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Este pequeno ficheiro é seu. É carregado depois do pacote partilhado dos ecrãs e mantém-se quando o ESP Screens é atualizado. Altere aqui detalhes específicos do hardware, como o modelo do ecrã."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"O que é seguro alterar?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"As secções display, touchscreen e substitutions, os pinos e outros detalhes do dispositivo. O nome, a rede Wi-Fi, a API, a OTA e as ligações aos pacotes continuam a ser geridos pelo ESP Screens."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Ativo"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Pronto para associar"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado local"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Usar exemplo"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Limpar"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" carácter"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" caracteres"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" linha"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" linhas"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Guardar e verificar"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Guardar YAML"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Não foi encontrado nenhum perfil ESPHome para este ecrã."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"As alterações feitas aqui aplicam-se na próxima compilação."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Guarde uma vez para associar este ficheiro ao perfil."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"A verificar e a guardar…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. O YAML personalizado mantém-se nas atualizações de firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado guardado."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. O ESPHome está a verificar o perfil completo…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"O ESPHome está a verificar o perfil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"O ESPHome está a verificar o perfil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"O perfil completo é válido. Pode compilar e instalar com segurança."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"O ESPHome rejeitou o perfil completo. Consulte Firmware e USB para ver o registo completo."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Substituir o texto atual pelo exemplo?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Exemplo carregado. Guarde-o quando estiver pronto."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Limpar o YAML personalizado local?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"O YAML personalizado ficará vazio quando guardar."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Casa"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Desconhecido"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Indisponível"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Aquecer"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Arrefecer"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Aquecer/Arrefecer"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Secar"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Ventilação"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"A aquecer"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"A arrefecer"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inativo"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Desumidificação"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilação"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Pré-Aquecimento"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Descongelação"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Aberta"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Fechado"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"A abrir"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"A fechar"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"A reproduzir"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Pausado"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inativo"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"Standby"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Casa"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Ausente"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Acima do horizonte"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Abaixo do horizonte"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Na Base"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"A Limpar"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Em pausa"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"A regressar à base"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inativo"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Ensolarado"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Limpo, noite"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Nublado"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Parcialmente nublado"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Chuvoso"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Aguaceiros"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Nevoso"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Nevoso, chuvoso"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Nevoeiro"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Granizo"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Trovoada"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Trovoada, chuva"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Ventoso"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Excecional"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Baixo"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"A carregar"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Não está a carregar"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Frio"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Aberto"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Fechada"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Aberta"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Fechado"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Quente"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Luz detetada"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Sem luz"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Destrancada"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Trancado"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Húmido"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Seco"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"Em movimento"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Parado"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Aberta"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Fechada"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Em casa"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Ausente"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problema"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"Em execução"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Parado"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Inseguro"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Seguro"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Adulteração detetada"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Atualização disponível"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Atualizado"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Aberto"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Fechada"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Ativar"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Executar"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Pressione"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Baixo"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Médio"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Alto"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Meio"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Concentrado"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Difuso"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Total"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Ambos"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Vertical"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Agora mesmo"}},minutes_ago:{t:0,b:{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" min"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" hora"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" horas"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Ontem"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" dia"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" dias"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" semana"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" semanas"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" mês"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" meses"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" ano"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" anos"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" hora"}]},{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" horas"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Amanhã"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" dia"}]},{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" dias"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"da manhã"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"da tarde"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"domingo"}},{t:0,b:{t:2,i:[{t:3}],s:"segunda-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"terça-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"quarta-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"quinta-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"sexta-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"sábado"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"domingo"}},{t:0,b:{t:2,i:[{t:3}],s:"segunda"}},{t:0,b:{t:2,i:[{t:3}],s:"terça"}},{t:0,b:{t:2,i:[{t:3}],s:"quarta"}},{t:0,b:{t:2,i:[{t:3}],s:"quinta"}},{t:0,b:{t:2,i:[{t:3}],s:"sexta"}},{t:0,b:{t:2,i:[{t:3}],s:"sábado"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"sg"}},{t:0,b:{t:2,i:[{t:3}],s:"te"}},{t:0,b:{t:2,i:[{t:3}],s:"qu"}},{t:0,b:{t:2,i:[{t:3}],s:"qi"}},{t:0,b:{t:2,i:[{t:3}],s:"sx"}},{t:0,b:{t:2,i:[{t:3}],s:"sb"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"janeiro"}},{t:0,b:{t:2,i:[{t:3}],s:"fevereiro"}},{t:0,b:{t:2,i:[{t:3}],s:"março"}},{t:0,b:{t:2,i:[{t:3}],s:"abril"}},{t:0,b:{t:2,i:[{t:3}],s:"maio"}},{t:0,b:{t:2,i:[{t:3}],s:"junho"}},{t:0,b:{t:2,i:[{t:3}],s:"julho"}},{t:0,b:{t:2,i:[{t:3}],s:"agosto"}},{t:0,b:{t:2,i:[{t:3}],s:"setembro"}},{t:0,b:{t:2,i:[{t:3}],s:"outubro"}},{t:0,b:{t:2,i:[{t:3}],s:"novembro"}},{t:0,b:{t:2,i:[{t:3}],s:"dezembro"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"jan."}},{t:0,b:{t:2,i:[{t:3}],s:"fev."}},{t:0,b:{t:2,i:[{t:3}],s:"mar."}},{t:0,b:{t:2,i:[{t:3}],s:"abr."}},{t:0,b:{t:2,i:[{t:3}],s:"mai."}},{t:0,b:{t:2,i:[{t:3}],s:"jun."}},{t:0,b:{t:2,i:[{t:3}],s:"jul."}},{t:0,b:{t:2,i:[{t:3}],s:"ago."}},{t:0,b:{t:2,i:[{t:3}],s:"set."}},{t:0,b:{t:2,i:[{t:3}],s:"out."}},{t:0,b:{t:2,i:[{t:3}],s:"nov."}},{t:0,b:{t:2,i:[{t:3}],s:"dez."}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" de "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:" "}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"2"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Página "},{t:4,k:"n"}]}}}}};export{t as default}; +const t={editor:{common:{undo:{t:0,b:{t:2,i:[{t:3}],s:"Desfazer"}},online:{t:0,b:{t:2,i:[{t:3}],s:"Online"}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"desconhecido"}},unsaved:{t:0,b:{t:2,i:[{t:3}],s:"Alterações não guardadas"}},cancel:{t:0,b:{t:2,i:[{t:3}],s:"Cancelar"}},open_integrations:{t:0,b:{t:2,i:[{t:3}],s:"Abrir Dispositivos & serviços"}},save_send:{t:0,b:{t:2,i:[{t:3}],s:"Guardar e enviar"}},saving:{t:0,b:{t:2,i:[{t:3}],s:"A guardar…"}},read_current_data:{t:0,b:{t:2,i:[{t:3}],s:"Ler dados atuais"}},results:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" resultado. Continue a escrever para filtrar."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" resultados. Continue a escrever para filtrar."}]}]}},close:{t:0,b:{t:2,i:[{t:3}],s:"Fechar"}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remover"}},change:{t:0,b:{t:2,i:[{t:3}],s:"Alterar"}},loading:{t:0,b:{t:2,i:[{t:3}],s:"A carregar…"}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Voltar"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copiar"}}},nav:{new_screen:{t:0,b:{t:2,i:[{t:3}],s:"Novo ecrã"}},firmware:{t:0,b:{t:2,i:[{t:3}],s:"Firmware e USB"}},alerts:{t:0,b:{t:2,i:[{t:3}],s:"Alertas"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Definições"}},new_screen_detail:{t:0,b:{t:2,i:[{t:3}],s:"Ligar e instalar"}}},api:{failed:{t:0,b:{t:2,i:[{t:3}],s:"Não funcionou. Recarregue a página e tente novamente."}}},copy:{api_key:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Chave API copiada."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"A chave API está selecionada. Copie-a com Ctrl+C ou Command+C."}}},layout_json:{copied:{t:0,b:{t:2,i:[{t:3}],s:"JSON do layout copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O JSON do layout está selecionado. Copie-o com Ctrl+C ou Command+C."}}},action_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome da ação copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O nome da ação está selecionado. Copie-o com Ctrl+C ou Command+C."}}},yaml:{copied:{t:0,b:{t:2,i:[{t:3}],s:"YAML copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O YAML está selecionado. Copie-o com Ctrl+C ou Command+C."}}},icon_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome do ícone copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O nome do ícone está selecionado. Copie-o com Ctrl+C ou Command+C."}}},empty_color:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Cor vazia copiada."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"A cor vazia está selecionada. Copie-a com Ctrl+C ou Command+C."}}},color_name:{copied:{t:0,b:{t:2,i:[{t:3}],s:"Nome da cor copiado."}},selected:{t:0,b:{t:2,i:[{t:3}],s:"O nome da cor está selecionado. Copie-o com Ctrl+C ou Command+C."}}}},sidebar:{connection:{unreachable:{t:0,b:{t:2,i:[{t:3}],s:"Página de gestão inacessível · a tentar novamente…"}},connected:{t:0,b:{t:2,i:[{t:3}],s:"Ligado ao Home Assistant"}},reconnecting:{t:0,b:{t:2,i:[{t:3}],s:"A ligar novamente ao Home Assistant…"}}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procurar"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Ecrãs"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Mais"}},refresh:{t:0,b:{t:2,i:[{t:3}],s:"Recarregar"}},update:{pill:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},queued:{t:0,b:{t:2,i:[{t:3}],s:"Na fila para atualizar"}},available:{t:0,b:{t:2,i:[{t:3,v:"Atualização para "},{t:4,k:"version"}]}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Não foi encontrado nenhum perfil ESPHome com este nome de dispositivo."}},whats_new:{t:0,b:{t:2,i:[{t:3}],s:"Novidades"}},full_log:{t:0,b:{t:2,i:[{t:3}],s:"Registo completo"}}},host:{hint:{t:0,b:{t:2,i:[{t:3}],s:"O endereço IP, só desta vez; o firmware novo passa a comunicá-lo sozinho."}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Endereço IP, p. ex. 192.168.1.50"}},label:{t:0,b:{t:2,i:[{t:3}],s:"Endereço IP"}},start:{t:0,b:{t:2,i:[{t:3}],s:"Iniciar"}}},pending:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Instalado, mas ainda não está no Home Assistant. Adicione o dispositivo ESPHome descoberto em Configuração → Dispositivos & serviços, cole lá a chave API e ative «Permitir que o dispositivo execute ações do Home Assistant» em Configurar."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Firmware descarregado; ainda não está no Home Assistant. Instale-o no ecrã com o ESPHome Web e depois adicione o dispositivo ESPHome descoberto em Configuração → Dispositivos & serviços, cole lá a chave API e permita as ações do Home Assistant em Configurar."}},not_flashed:{t:0,b:{t:2,i:[{t:3,v:"Ainda não está no Home Assistant. Já instalou o firmware? Adicione o dispositivo ESPHome em Configuração → Dispositivos & serviços e depois permita as ações do Home Assistant em Configurar. Ainda não? Firmware e USB → "},{t:4,k:"file"},{t:3,v:"."}]}}},copy_api_key:{t:0,b:{t:2,i:[{t:3}],s:"Copiar chave API"}}},palette:{groups:{screens:{t:0,b:{t:2,i:[{t:3}],s:"Ecrãs"}},actions:{t:0,b:{t:2,i:[{t:3}],s:"Ações"}},add:{t:0,b:{t:2,i:[{t:3}],s:"Adicionar a este ecrã"}}},alerts_detail:{t:0,b:{t:2,i:[{t:3}],s:"Guia rápido e um alerta de teste"}},settings_detail:{t:0,b:{t:2,i:[{t:3}],s:"Atualizações, Claude"}},nothing_to_save:{t:0,b:{t:2,i:[{t:3}],s:"Nada para guardar"}},identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificar este ecrã"}},identify_detail:{t:0,b:{t:2,i:[{t:3}],s:"Faz piscar a retroiluminação e mostra um cartão"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Precisa de um firmware mais recente"}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exportar layout"}},export_detail:{t:0,b:{t:2,i:[{t:3}],s:"Descarregar e copiar como JSON"}},placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Procurar ecrãs, entidades, ações…"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Sem resultados. Escreva parte do nome de um ecrã, entidade ou ação."}}},empty:{choose:{title:{t:0,b:{t:2,i:[{t:3}],s:"Escolha um ecrã"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Escolha um dos seus ecrãs à esquerda para alterar os mosaicos, a barra superior e as definições."}}},start:{title:{t:0,b:{t:2,i:[{t:3}],s:"Comece com um ecrã"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Ligue um CYD ou um Guition por USB à máquina do Home Assistant. Perfil, firmware e primeira instalação ficam feitos de uma só vez."}},button:{t:0,b:{t:2,i:[{t:3}],s:"Instalar novo ecrã"}}}},screen_view:{confirm:{switch:{t:0,b:{t:2,i:[{t:3}],s:"Tem alterações não guardadas. Abrir outro ecrã mesmo assim?"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Substituir o layout não guardado por uma cópia do layout do outro ecrã?"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Substituir o layout não guardado pelo importado?"}}},saved:{current:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. O seu ecrã está a ser atualizado."}},other:{t:0,b:{t:2,i:[{t:3,v:"Guardado. "},{t:4,k:"name"},{t:3,v:" está a ser atualizado."}]}},other_unnamed:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. O ecrã está a ser atualizado."}},newer_edit:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. A sua alteração mais recente ainda não foi enviada: prima Guardar e enviar outra vez."}}},identified:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" pisca e mostra um cartão durante alguns segundos."}]}},offline:{t:0,b:{t:2,i:[{t:3}],s:"Offline · as alterações ficam guardadas"}},tabs:{layout:{t:0,b:{t:2,i:[{t:3}],s:"Layout"}},settings:{t:0,b:{t:2,i:[{t:3}],s:"Definições do ecrã"}}},sent:{t:0,b:{t:2,i:[{t:3}],s:"Guardado · enviado para o ecrã"}},all_saved:{t:0,b:{t:2,i:[{t:3}],s:"Tudo guardado"}},more:{t:0,b:{t:2,i:[{t:3}],s:"Mais"}},menu:{identify:{t:0,b:{t:2,i:[{t:3}],s:"Identificar"}},identify_hint:{t:0,b:{t:2,i:[{t:3}],s:"faz piscar o ecrã"}},identify_needs:{t:0,b:{t:2,i:[{t:3}],s:"Precisa do firmware 0.2.31 ou mais recente"}},inspect_hint:{t:0,b:{t:2,i:[{t:3}],s:"do Home Assistant"}},copy:{t:0,b:{t:2,i:[{t:3}],s:"Copiar layout de…"}},copy_screens:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ecrã"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ecrãs"}]}]}},copy_none:{t:0,b:{t:2,i:[{t:3}],s:"nenhum outro ecrã"}},copy_tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" mosaico"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" mosaicos"}]}]}},export:{t:0,b:{t:2,i:[{t:3}],s:"Exportar layout"}},import:{t:0,b:{t:2,i:[{t:3}],s:"Importar layout…"}},override:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado"}},override_hint:{t:0,b:{t:2,i:[{t:3}],s:"avançado"}},override_none:{t:0,b:{t:2,i:[{t:3}],s:"Não foi encontrado nenhum perfil ESPHome para este ecrã"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar firmware"}}}},layout:{removed:{t:0,b:{t:2,i:[{t:3,v:"Removido: "},{t:4,k:"name"}]}},no_room:{t:0,b:{t:2,i:[{t:3,v:"Não há espaço para este mosaico na página "},{t:4,k:"page"},{t:3,v:"."}]}},no_free_page:{t:0,b:{t:2,i:[{t:3}],s:"Não há nenhuma página livre para um mosaico de página inteira. Liberte primeiro uma página."}},page_taken:{t:0,b:{t:2,i:[{t:3,v:"Este ecrã já tem um mosaico que leva à página "},{t:4,k:"page"},{t:3,v:"."}]}},copied:{t:0,b:{t:2,i:[{t:3,v:"Layout de "},{t:4,k:"name"},{t:3,v:" copiado. Prima Guardar e enviar quando estiver bem."}]}},copied_part:{t:0,b:{t:2,i:[{t:3,v:"Layout de "},{t:4,k:"name"},{t:3,v:" copiado: "},{t:4,k:"kept"},{t:3,v:" de "},{t:4,k:"total"},{t:3,v:" mosaicos são compatíveis com o firmware deste ecrã. Prima Guardar e enviar quando estiver bem."}]}},imported:{t:0,b:{t:2,i:[{t:3}],s:"Layout importado. Prima Guardar e enviar quando estiver bem."}},imported_part:{t:0,b:{t:2,i:[{t:3,v:"Layout importado: "},{t:4,k:"kept"},{t:3,v:" de "},{t:4,k:"total"},{t:3,v:" mosaicos são compatíveis com o firmware deste ecrã. Prima Guardar e enviar quando estiver bem."}]}},not_json:{t:0,b:{t:2,i:[{t:3}],s:"Isso não é JSON. Exporte primeiro um layout ou cole um de outro ESP Screens."}},no_tiles_in_file:{t:0,b:{t:2,i:[{t:3}],s:"Este ficheiro não tem mosaicos. Era esperado um layout exportado do ESP Screens."}},count:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" página · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" mosaicos"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" páginas · "},{t:4,k:"tiles"},{t:3,v:" / "},{t:4,k:"limit"},{t:3,v:" mosaicos"}]}]}},no_tiles:{t:0,b:{t:2,i:[{t:3}],s:"Adicione a primeira luz, cena ou dispositivo a partir da biblioteca."}},how_to:{t:0,b:{t:2,i:[{t:3}],s:"Toque na barra superior ou num mosaico para o alterar. Arraste para mover; largue na página seguinte para criar uma nova."}},positions_hint:{t:0,b:{t:2,i:[{t:3,v:"Os espaços vazios e as posições fixas funcionam a partir do firmware 0.2.26. Até essa atualização, este ecrã (firmware "},{t:4,k:"firmware"},{t:3,v:") sobe os mosaicos para o primeiro espaço livre."}]}},aria:{t:0,b:{t:2,i:[{t:3}],s:"Layout do ecrã"}},add_page:{t:0,b:{t:2,i:[{t:3}],s:"+ Adicionar página"}},max_pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"No máximo "},{t:4,k:"n"},{t:3,v:" página"}]},{t:2,i:[{t:3,v:"No máximo "},{t:4,k:"n"},{t:3,v:" páginas"}]}]}}},page:{label:{t:0,b:{t:2,i:[{t:3,v:"Página "},{t:4,k:"page"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remover página"}},remove_title:{t:0,b:{t:2,i:[{t:3}],s:"As páginas seguintes sobem uma posição"}},edit_bar:{t:0,b:{t:2,i:[{t:3}],s:"Editar barra superior"}},cell:{title:{t:0,b:{t:2,i:[{t:3}],s:"Espaço vazio. Clique para adicionar aqui um mosaico ou arraste um para cá."}},aria:{t:0,b:{t:2,i:[{t:3,v:"Espaço vazio "},{t:4,k:"slot"},{t:3,v:" na página "},{t:4,k:"page"},{t:3,v:": adicione aqui o próximo mosaico"}]}},next:{t:0,b:{t:2,i:[{t:3}],s:"O próximo mosaico fica aqui"}},empty:{t:0,b:{t:2,i:[{t:3}],s:"Vazio"}}}},library:{title:{t:0,b:{t:2,i:[{t:3}],s:"Biblioteca"}},entities:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" entidade"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" entidades"}]}]}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procurar por nome, dispositivo ou divisão…"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Adicionar uma entidade"}},filters:{all:{t:0,b:{t:2,i:[{t:3}],s:"Tudo"}},light:{t:0,b:{t:2,i:[{t:3}],s:"Luzes"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatização"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruptores"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Estado"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Ações"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Scripts"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventoinhas"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Coberturas"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Cenas"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirador"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensores"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Multimédia"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valores"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Seletores"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Pessoas"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Temporizadores"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã"}}},room:{t:0,b:{t:2,i:[{t:3}],s:"Divisão"}},all_rooms:{t:0,b:{t:2,i:[{t:3}],s:"Todas as divisões"}},hide_placed:{t:0,b:{t:2,i:[{t:3}],s:"Ocultar adicionadas"}},hide_placed_title:{t:0,b:{t:2,i:[{t:3}],s:"Ocultar o que já está neste ecrã"}},all_placed:{t:0,b:{t:2,i:[{t:3}],s:"Tudo o que está aqui já está neste ecrã."}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma entidade encontrada. Experimente outro nome, divisão ou filtro."}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Neste ecrã cabe "},{t:4,k:"n"},{t:3,v:" mosaico."}]},{t:2,i:[{t:3,v:"Neste ecrã cabem "},{t:4,k:"n"},{t:3,v:" mosaicos."}]}]}},full_update:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Neste ecrã cabe "},{t:4,k:"n"},{t:3,v:" mosaico; atualize o firmware para ter 48."}]},{t:2,i:[{t:3,v:"Neste ecrã cabem "},{t:4,k:"n"},{t:3,v:" mosaicos; atualize o firmware para ter 48."}]}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Arraste para uma página ou toque em + para adicionar ao primeiro espaço livre. ⌘K procura em tudo."}}},domains:{light:{t:0,b:{t:2,i:[{t:3}],s:"Luz"}},climate:{t:0,b:{t:2,i:[{t:3}],s:"Climatização"}},vacuum:{t:0,b:{t:2,i:[{t:3}],s:"Aspirador"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventoinha"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Cobertura"}},media_player:{t:0,b:{t:2,i:[{t:3}],s:"Multimédia"}},sensor:{t:0,b:{t:2,i:[{t:3}],s:"Sensor"}},binary_sensor:{t:0,b:{t:2,i:[{t:3}],s:"Estado"}},switch:{t:0,b:{t:2,i:[{t:3}],s:"Interruptor"}},input_boolean:{t:0,b:{t:2,i:[{t:3}],s:"Interruptor"}},scene:{t:0,b:{t:2,i:[{t:3}],s:"Cena"}},script:{t:0,b:{t:2,i:[{t:3}],s:"Script"}},weather:{t:0,b:{t:2,i:[{t:3}],s:"Clima"}},number:{t:0,b:{t:2,i:[{t:3}],s:"Valor"}},input_number:{t:0,b:{t:2,i:[{t:3}],s:"Valor"}},select:{t:0,b:{t:2,i:[{t:3}],s:"Seletor"}},input_select:{t:0,b:{t:2,i:[{t:3}],s:"Seletor"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Ação"}},input_button:{t:0,b:{t:2,i:[{t:3}],s:"Ação"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã"}},sun:{t:0,b:{t:2,i:[{t:3}],s:"Sol"}},timer:{t:0,b:{t:2,i:[{t:3}],s:"Temporizador"}},person:{t:0,b:{t:2,i:[{t:3}],s:"Pessoa"}},camera:{t:0,b:{t:2,i:[{t:3}],s:"Câmara"}},image:{t:0,b:{t:2,i:[{t:3}],s:"Imagem"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Entidade"}}},displays:{standard:{t:0,b:{t:2,i:[{t:3}],s:"padrão"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"valor grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"previsão do tempo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"gráfico"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"relógio digital"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"relógio analógico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"trajetória do sol"}},live:{t:0,b:{t:2,i:[{t:3}],s:"imagem ao vivo"}},cover:{t:0,b:{t:2,i:[{t:3}],s:"capa do álbum"}}},sizes:{single:{t:0,b:{t:2,i:[{t:3}],s:"normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"duplo"}},full:{t:0,b:{t:2,i:[{t:3}],s:"página inteira"}}},tile:{name:{t:0,b:{t:2,i:[{t:3}],s:"Nome no ecrã"}},icon:{auto_ha:{t:0,b:{t:2,i:[{t:3}],s:"Automático (do Home Assistant)"}},auto_default:{t:0,b:{t:2,i:[{t:3}],s:"Automático (predefinido)"}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã mostra o ícone escolhido a partir do firmware 0.2.18."}}},goes_to:{label:{t:0,b:{t:2,i:[{t:3}],s:"Leva à página"}},empty:{t:0,b:{t:2,i:[{t:4,k:"page"},{t:3,v:" (vazia)"}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Os mosaicos de navegação precisam do firmware 0.2.62: prima primeiro Atualizar na lista de ecrãs."}},no_page:{t:0,b:{t:2,i:[{t:3,v:"Este ecrã não tem página "},{t:4,k:"page"},{t:3,v:", por isso um toque abre a última página. Escolha outra página."}]}},hint:{t:0,b:{t:2,i:[{t:3}],s:"Um toque no mosaico abre essa página."}}},display:{label:{t:0,b:{t:2,i:[{t:3}],s:"Apresentação"}},digital:{t:0,b:{t:2,i:[{t:3}],s:"Relógio digital"}},analog:{t:0,b:{t:2,i:[{t:3}],s:"Relógio analógico"}},standard:{t:0,b:{t:2,i:[{t:3}],s:"Nome e estado"}},watch:{t:0,b:{t:2,i:[{t:3}],s:"Valor grande"}},forecast:{t:0,b:{t:2,i:[{t:3}],s:"Previsão do tempo"}},graph:{t:0,b:{t:2,i:[{t:3}],s:"Gráfico"}},sunpath:{t:0,b:{t:2,i:[{t:3}],s:"Trajetória do sol"}},live:{t:0,b:{t:2,i:[{t:3}],s:"Imagem ao vivo"}},live_hint:{t:0,b:{t:2,i:[{t:3}],s:"Uma pequena imagem da câmara no lugar do ícone, atualizada ao ritmo abaixo enquanto a página está no ecrã. Um toque continua a abri-la em ecrã inteiro."}},live_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Uma imagem ao vivo precisa do firmware 0.2.77 ou mais recente: prima Atualizar no ecrã depois de guardar."}},cover:{t:0,b:{t:2,i:[{t:3}],s:"Capa do álbum"}},cover_hint:{t:0,b:{t:2,i:[{t:3}],s:"A capa do álbum do que está a tocar no lugar do ícone, como no próprio mosaico do Home Assistant; um leitor sem imagem mantém o seu ícone. Um toque continua a abrir o cartão."}},cover_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"A capa do álbum no mosaico precisa do firmware 0.2.78 ou mais recente: prima Atualizar no ecrã depois de guardar."}},no_graph:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não tem valores numéricos para esta entidade, por isso o gráfico fica vazio. Escolha outra apresentação."}},no_forecast:{t:0,b:{t:2,i:[{t:3}],s:"Este serviço meteorológico não tem previsão diária no Home Assistant. Escolha outra apresentação."}}},refresh:{label:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar"}},seconds:{t:0,b:{t:2,i:[{t:3,v:"A cada "},{t:4,k:"n"},{t:3,v:" s"}]}}},size:{label:{t:0,b:{t:2,i:[{t:3}],s:"Tamanho"}},single:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},wide:{t:0,b:{t:2,i:[{t:3}],s:"Largura dupla"}},full:{t:0,b:{t:2,i:[{t:3}],s:"Página inteira"}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Página inteira: um botão grande na cor do próprio mosaico; em baixo ficam um deslizador, controlos ou um gráfico."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"Um mosaico de página inteira precisa do firmware 0.2.62: prima primeiro Atualizar na lista de ecrãs."}}},page:{label:{t:0,b:{t:2,i:[{t:3}],s:"Página"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Nova página"}}},controls:{label:{t:0,b:{t:2,i:[{t:3}],s:"Controlo direto no mosaico"}},not_offered:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não oferece este controlo para esta entidade, por isso fica vazio no ecrã. Escolha outro."}},full_hint:{t:0,b:{t:2,i:[{t:3}],s:"Na parte de baixo do mosaico de página inteira; um toque em qualquer outro sítio funciona como definido abaixo."}},wide_hint:{t:0,b:{t:2,i:[{t:3}],s:"À direita do mosaico de largura dupla, como as linhas no Home Assistant. Tocar no nome funciona como definido abaixo."}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã mostra o controlo direto a partir do firmware 0.2.19; até lá, o mosaico fica como estava."}}},tap:{label:{t:0,b:{t:2,i:[{t:3}],s:"Ao tocar"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Automático"}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Abrir controlo"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Só ver"}},toggle:{t:0,b:{t:2,i:[{t:3}],s:"Ligar / desligar"}},action:{t:0,b:{t:2,i:[{t:3}],s:"Executar ação"}},no_toggle:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não consegue ligar e desligar isto, por isso um toque não faz nada. Escolha outra opção."}},toggle_needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã liga e desliga isto a partir do firmware 0.2.58: prima Atualizar na lista de ecrãs. Até lá, um toque abre o respetivo cartão."}},hold:{t:0,b:{t:2,i:[{t:3}],s:"Mantenha o mosaico premido para abrir o respetivo cartão."}}},slider:{label:{t:0,b:{t:2,i:[{t:3}],s:"Controlo deslizante pequeno no mosaico"}},no:{t:0,b:{t:2,i:[{t:3}],s:"Não"}},yes:{t:0,b:{t:2,i:[{t:3}],s:"Sim, controlo direto"}},nothing:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não tem nada que um controlo deslizante possa alterar nesta entidade. Escolha Não."}}},history:{label:{t:0,b:{t:2,i:[{t:3}],s:"Histórico"}},hours:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" hora"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" horas"}]}]}}},background:{label:{t:0,b:{t:2,i:[{t:3}],s:"Fundo pastel"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Fundo: "},{t:4,k:"name"}]}}}},tile_card:{label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", espaço "},{t:4,k:"slot"},{t:3,v:" da página "},{t:4,k:"page"},{t:3,v:". Enter: configurar; teclas de seta: mover"}]}},remove:{t:0,b:{t:2,i:[{t:3}],s:"Remover mosaico"}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Remover "},{t:4,k:"name"}]}}},action:{label:{t:0,b:{t:2,i:[{t:3}],s:"Ação"}},asking:{t:0,b:{t:2,i:[{t:3}],s:"A perguntar ao Home Assistant que ações tem esta entidade…"}},not_answering:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant não está a responder neste momento. Tente novamente daqui a pouco."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Escolha uma ação"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procure, por exemplo alternar, posição ou reproduzir"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Procurar uma ação"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma ação encontrada."}},gone:{t:0,b:{t:2,i:[{t:3}],s:"O Home Assistant já não oferece esta ação para esta entidade, por isso um toque não faz nada. Escolha outra."}},optional:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" (opcional)"}]}},not_set:{t:0,b:{t:2,i:[{t:3}],s:"Não definido"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Ativado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desativado"}},needs:{t:0,b:{t:2,i:[{t:3,v:"O Home Assistant precisa de "},{t:4,k:"fields"},{t:3,v:"."}]}},needs_firmware:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã executa ações a partir do firmware 0.2.58: prima Atualizar na lista de ecrãs. Até lá, um toque funciona como Automático."}}},icon:{label:{t:0,b:{t:2,i:[{t:3}],s:"Ícone"}},none:{t:0,b:{t:2,i:[{t:3}],s:"Sem ícone"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procure, por exemplo candeeiro, música ou porta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Procurar um ícone"}},none_text_only:{t:0,b:{t:2,i:[{t:3}],s:"Sem ícone, só texto"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Ícone: "},{t:4,k:"name"}]}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nenhum ícone encontrado."}}},inspect:{title:{t:0,b:{t:2,i:[{t:3}],s:"Dados atuais"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Ligação, estado e propriedades suportadas"}},reading:{t:0,b:{t:2,i:[{t:3}],s:"A ler…"}},fetching:{t:0,b:{t:2,i:[{t:3}],s:"A obter o estado atual do HA…"}},status:{t:0,b:{t:2,i:[{t:3,v:"Estado: "},{t:4,k:"status"}]}},options:{t:0,b:{t:2,i:[{t:3,v:"Controlo deslizante pequeno: "},{t:4,k:"slider"},{t:3,v:" · Apresentação: "},{t:4,k:"display"},{t:3,v:" · Tamanho: "},{t:4,k:"size"},{t:3,v:" · Controlo: "},{t:4,k:"control"},{t:3,v:" · Fundo: "},{t:4,k:"background"}]}},yes:{t:0,b:{t:2,i:[{t:3}],s:"sim"}},no:{t:0,b:{t:2,i:[{t:3}],s:"não"}},control_none:{t:0,b:{t:2,i:[{t:3}],s:"nenhum"}},background_default:{t:0,b:{t:2,i:[{t:3}],s:"Predefinido"}},read_again:{t:0,b:{t:2,i:[{t:3}],s:"Ler novamente"}}},topbar:{removed:{t:0,b:{t:2,i:[{t:3,v:"Removido da barra superior: "},{t:4,k:"name"}]}},full:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Na barra superior cabe "},{t:4,k:"n"},{t:3,v:" elemento."}]},{t:2,i:[{t:3,v:"Na barra superior cabem "},{t:4,k:"n"},{t:3,v:" elementos."}]}]}},already:{t:0,b:{t:2,i:[{t:3}],s:"Isto já está na barra superior."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Barra superior"}},aria:{t:0,b:{t:2,i:[{t:3,v:"Barra superior: "},{t:4,k:"name"}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Do próprio ecrã; também funciona sem o Home Assistant"}},items:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" elemento"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" elementos"}]}]}},name:{t:0,b:{t:2,i:[{t:3}],s:"Esquerda: nome"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Por exemplo: Sala de estar"}},right:{t:0,b:{t:2,i:[{t:3}],s:"Direita: hora, sensores ou um relógio"}},item_label:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:", espaço "},{t:4,k:"slot"},{t:3,v:". Enter: configurar; setas: mover"}]}},remove_named:{t:0,b:{t:2,i:[{t:3,v:"Remover "},{t:4,k:"name"},{t:3,v:" da barra superior"}]}},max:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"No máximo "},{t:4,k:"n"},{t:3,v:" elemento"}]},{t:2,i:[{t:3,v:"No máximo "},{t:4,k:"n"},{t:3,v:" elementos"}]}]}},add_title:{t:0,b:{t:2,i:[{t:3}],s:"Adicione a hora, a data, o relógio analógico ou uma entidade"}},add_button:{t:0,b:{t:2,i:[{t:3}],s:"+ Adicionar hora, data ou uma entidade"}},hint:{overflow:{t:0,b:{t:2,i:[{t:3}],s:"Nem tudo cabe ao lado do nome: o ecrã omite os elementos tracejados. Remova um ou escolha um nome mais curto."}},reorder:{t:0,b:{t:2,i:[{t:3}],s:"Arraste para reordenar; toque num elemento para o configurar."}},needs_firmware:{t:0,b:{t:2,i:[{t:3,v:"Os sensores, a data e o relógio analógico aparecem a partir do firmware "},{t:4,k:"version"},{t:3,v:"; até essa atualização, este ecrã mostra o nome e, se a hora estiver na barra, o relógio."}]}}},detail:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Oculto: agora não está ativo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"Não cabe ao lado do nome"}},dial:{t:0,b:{t:2,i:[{t:3}],s:"Mostrador"}}},live:{hidden:{t:0,b:{t:2,i:[{t:3}],s:"Oculto neste momento: não está ativo"}},overflow:{t:0,b:{t:2,i:[{t:3}],s:"De momento não cabe ao lado do nome"}},looks:{t:0,b:{t:2,i:[{t:3}],s:"Assim fica no ecrã"}}},analog_sample:{t:0,b:{t:2,i:[{t:3}],s:"Mostrador pequeno com a hora"}},content:{label:{t:0,b:{t:2,i:[{t:3}],s:"O que mostrar"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Última alteração» continua a contar no próprio ecrã: «Agora mesmo», «Há 5 min», «Ontem»."}}},auto_icon:{t:0,b:{t:2,i:[{t:3}],s:"Automático (como no Home Assistant)"}},show:{label:{t:0,b:{t:2,i:[{t:3}],s:"Mostrar"}},hint:{t:0,b:{t:2,i:[{t:3}],s:"«Apenas quando ativo» oculta o elemento enquanto estiver desligado, fechado, ausente ou a 0. Útil para uma porta aberta, uma máquina de lavar a funcionar ou quem está em casa."}}},clock_24:{t:0,b:{t:2,i:[{t:3,v:"Relógio de 24 horas · altere em "},{t:4,k:"settings"}]}},clock_12:{t:0,b:{t:2,i:[{t:3,v:"Relógio de 12 horas · altere em "},{t:4,k:"settings"}]}},clock_settings:{t:0,b:{t:2,i:[{t:3}],s:"Definições → Idioma e região"}},date_hint:{t:0,b:{t:2,i:[{t:3,v:"Hoje: "},{t:4,k:"date"},{t:3,v:". A data segue o relógio do próprio ecrã."}]}},up:{t:0,b:{t:2,i:[{t:3}],s:"↑ Subir"}},down:{t:0,b:{t:2,i:[{t:3}],s:"↓ Descer"}},add:{title:{t:0,b:{t:2,i:[{t:3}],s:"Adicionar à barra superior"}},slots:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" espaço usado"}]},{t:2,i:[{t:4,k:"used"},{t:3,v:" de "},{t:4,k:"n"},{t:3,v:" espaços usados"}]}]}},builtin:{t:0,b:{t:2,i:[{t:3}],s:"Do próprio ecrã"}},added:{t:0,b:{t:2,i:[{t:3}],s:"Já adicionado"}},suggestions:{t:0,b:{t:2,i:[{t:3}],s:"Sugestões do Home Assistant"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"Uma entidade"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procure por nome, divisão ou entidade, p. ex. temperatura ou porta"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Procurar uma entidade para a barra superior"}},none_found:{t:0,b:{t:2,i:[{t:3}],s:"Nenhuma entidade encontrada."}}}},screen_settings:{groups:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brilho"}},night:{t:0,b:{t:2,i:[{t:3}],s:"Noite"}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã"}}},rows:{brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brilho"}},dark_mode:{t:0,b:{t:2,i:[{t:3}],s:"Modo escuro"}},standby_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Espera automática"}},standby_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Espera após"}},standby_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brilho em espera"}},night_enabled:{t:0,b:{t:2,i:[{t:3}],s:"Modo noturno"}},night_start:{t:0,b:{t:2,i:[{t:3}],s:"Início"}},night_end:{t:0,b:{t:2,i:[{t:3}],s:"Fim"}},night_brightness:{t:0,b:{t:2,i:[{t:3}],s:"Brilho noturno"}},auto_home:{t:0,b:{t:2,i:[{t:3}],s:"Voltar à página 1"}},auto_home_seconds:{t:0,b:{t:2,i:[{t:3}],s:"Após"}},home_on_standby:{t:0,b:{t:2,i:[{t:3}],s:"Também em espera"}},swipe_pages:{t:0,b:{t:2,i:[{t:3}],s:"Deslizar entre páginas"}},page_buttons:{t:0,b:{t:2,i:[{t:3}],s:"Botões de página"}},rotation:{t:0,b:{t:2,i:[{t:3}],s:"Rotação"}}},duration:{seconds:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" s"}]}},minutes:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" min"}]}},hours:{t:0,b:{t:2,i:[{t:4,k:"n"},{t:3,v:" h"}]}},hours_minutes:{t:0,b:{t:2,i:[{t:4,k:"h"},{t:3,v:" h "},{t:4,k:"m"}]}}},time:{am:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" da manhã"}]}},pm:{t:0,b:{t:2,i:[{t:4,k:"time"},{t:3,v:" da tarde"}]}}},other_screen_busy:{t:0,b:{t:2,i:[{t:3}],s:"Ainda se estão a guardar as definições do outro ecrã. Tente novamente daqui a pouco."}},reach:{intro:{t:0,b:{t:2,i:[{t:3}],s:"Os botões de página e o deslizar estão desativados, por isso só os mosaicos «Ir para a página» mudam de página."}},pages:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"a página "},{t:4,k:"list"}]},{t:2,i:[{t:3,v:"as páginas "},{t:4,k:"list"}]}]}},tiles:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaico «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:"."}]},{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:"."}]}]}},tiles_missing_one:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaico «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:", mas nenhum para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]},{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:", mas nenhum para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]}]}},tiles_missing_more:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaico «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:", mas nenhum para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]},{t:2,i:[{t:3,v:"Tem "},{t:4,k:"n"},{t:3,v:" mosaicos «Ir para a página», para "},{t:4,k:"targets"},{t:3,v:", mas nenhum para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Não tem mosaicos «Ir para a página»."}},none_missing_one:{t:0,b:{t:2,i:[{t:3,v:"Não tem mosaicos «Ir para a página» para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]}},none_missing_more:{t:0,b:{t:2,i:[{t:3,v:"Não tem mosaicos «Ir para a página» para "},{t:4,k:"missing"},{t:3,v:", por isso não consegue lá chegar."}]}},cut_off:{t:0,b:{t:2,i:[{t:3,v:"Os mosaicos para "},{t:4,k:"pages"},{t:3,v:" só estão em páginas a que não consegue chegar."}]}},no_way_back:{t:0,b:{t:2,i:[{t:3,v:"Desde "},{t:4,k:"pages"},{t:3,v:", nenhum mosaico leva de volta à página 1."}]}}},status:{offline:{t:0,b:{t:2,i:[{t:3}],s:"Este ecrã está offline. Poderá alterar as definições quando voltar."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"As alterações aplicam-se de imediato no ecrã e aparecem aqui quando são feitas lá."}},app:{t:0,b:{t:2,i:[{t:3}],s:"As alterações aplicam-se de imediato. Com o firmware 0.2.49, o próprio ecrã guarda-as."}}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Esta entidade está desativada no Home Assistant ou o ecrã está a reiniciar."}},lower:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": menos"}]}},higher:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:": mais"}]}}},update:{starting:{t:0,b:{t:2,i:[{t:3}],s:"A iniciar a atualização…"}},building:{t:0,b:{t:2,i:[{t:3}],s:"A compilar o firmware…"}},writing:{t:0,b:{t:2,i:[{t:3}],s:"A gravar o firmware por Wi-Fi…"}},phases:{install:{t:0,b:{t:2,i:[{t:3}],s:"A compilar e a instalar…"}},verify:{t:0,b:{t:2,i:[{t:3}],s:"À espera que o ecrã volte…"}},settle:{t:0,b:{t:2,i:[{t:3}],s:"A verificar se se mantém estável…"}}},new_language:{t:0,b:{t:2,i:[{t:3,v:"Novo idioma: "},{t:4,k:"name"}]}}},settings:{updates:{auto_on:{t:0,b:{t:2,i:[{t:3}],s:"Os ecrãs vão passar a atualizar-se automaticamente à noite."}},auto_off:{t:0,b:{t:2,i:[{t:3}],s:"As atualizações automáticas estão desativadas."}},title:{t:0,b:{t:2,i:[{t:3}],s:"Atualizações de firmware"}},busy:{t:0,b:{t:2,i:[{t:3,v:"A atualizar para o firmware "},{t:4,k:"version"},{t:3,v:"…"}]}},no_screens:{t:0,b:{t:2,i:[{t:3,v:"Ainda não há nenhum ecrã emparelhado. Os novos ecrãs recebem o firmware "},{t:4,k:"version"},{t:3,v:"."}]}},available:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"O firmware "},{t:4,k:"version"},{t:3,v:" está disponível para "},{t:4,k:"n"},{t:3,v:" ecrã."}]},{t:2,i:[{t:3,v:"O firmware "},{t:4,k:"version"},{t:3,v:" está disponível para "},{t:4,k:"n"},{t:3,v:" ecrãs."}]}]}},current:{t:0,b:{t:2,i:[{t:3,v:"Todos os ecrãs têm o firmware "},{t:4,k:"version"},{t:3,v:"."}]}},all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Atualizar "},{t:4,k:"n"},{t:3,v:" ecrã"}]},{t:2,i:[{t:3,v:"Atualizar os "},{t:4,k:"n"},{t:3,v:" ecrãs"}]}]}},whats_new:{t:0,b:{t:2,i:[{t:3,v:"Novidades do firmware "},{t:4,k:"version"}]}},auto_label:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar automaticamente todas as noites"}},auto_hint:{t:0,b:{t:2,i:[{t:3}],s:"Entre as 03:00 e as 06:00, um ecrã de cada vez. Para se houver um erro e comunica-o no Home Assistant."}}},claude:{installed:{t:0,b:{t:2,i:[{t:3}],s:"Habilidade instalada. O Claude Code deteta-a de imediato."}},installed_restart:{t:0,b:{t:2,i:[{t:3}],s:"Habilidade instalada. Reinicie o Claude Code uma vez para que encontre a nova pasta de habilidades."}},text:{t:0,b:{t:2,i:[{t:3}],s:"Ensine o Claude a usar o ESP Screens e depois peça: «Mostra um alerta em todos os meus ecrãs quando a caixa do correio estiver cheia.» O Claude conhece os eventos de alerta e todos os campos, cores e ícones."}},install:{t:0,b:{t:2,i:[{t:3}],s:"Instalar para o Claude Code"}},install_again:{t:0,b:{t:2,i:[{t:3}],s:"Instalar novamente"}},update:{t:0,b:{t:2,i:[{t:3}],s:"Atualizar a habilidade"}},not_installed:{t:0,b:{t:2,i:[{t:3}],s:"Não instalada"}},installed_chip:{t:0,b:{t:2,i:[{t:3}],s:"● Instalada"}},newer:{t:0,b:{t:2,i:[{t:3}],s:"Instalada · há uma versão mais recente"}},writes:{t:0,b:{t:2,i:[{t:3,v:"Para o Claude Code no Home Assistant. Escreve um ficheiro em "},{t:4,k:"path"},{t:3,v:"; instalar novamente substitui-o."}]}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descarregar para o claude.ai"}},upload:{t:0,b:{t:2,i:[{t:3}],s:"Carregue o zip no Claude, em Personalizar → Habilidades."}}},title:{t:0,b:{t:2,i:[{t:3}],s:"Tudo o que rodeia os seus ecrãs."}},back:{t:0,b:{t:2,i:[{t:3}],s:"← Os meus ecrãs"}},screens:{title:{t:0,b:{t:2,i:[{t:3}],s:"Ecrãs"}},text:{t:0,b:{t:2,i:[{t:3}],s:"Adicione um ecrã, ou compile e reinstale o firmware de um que já tenha."}},firmware_detail:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar por USB ou Wi-Fi"}}},language:{title:{t:0,b:{t:2,i:[{t:3}],s:"Idioma e região"}},screen_language:{t:0,b:{t:2,i:[{t:3}],s:"Idioma dos ecrãs"}},auto:{t:0,b:{t:2,i:[{t:3,v:"Idioma do Home Assistant ("},{t:4,k:"name"},{t:3,v:")"}]}},auto_plain:{t:0,b:{t:2,i:[{t:3}],s:"Idioma do Home Assistant"}},ha_missing:{t:0,b:{t:2,i:[{t:3}],s:"Os ecrãs usam inglês até o idioma do Home Assistant estar disponível."}},unchecked:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · ainda não revisto, ajuda bem-vinda"}]}},help:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" ainda não foi revisto; toda a ajuda é bem-vinda: "},{t:4,k:"guide"}]}},guide:{t:0,b:{t:2,i:[{t:3}],s:"como traduzir"}},update_hint:{t:0,b:{t:2,i:[{t:3}],s:"Depois de uma alteração, cada ecrã precisa de uma atualização de firmware, uma compilação por ecrã: com o respetivo botão Atualizar ou nas atualizações noturnas."}},time:{t:0,b:{t:2,i:[{t:3}],s:"Formato de hora"}},time_auto:{t:0,b:{t:2,i:[{t:3,v:"Automático, segue o idioma ("},{t:4,k:"clock"},{t:3,v:")"}]}},clock_24:{t:0,b:{t:2,i:[{t:3}],s:"24 horas"}},clock_12:{t:0,b:{t:2,i:[{t:3}],s:"12 horas"}},numbers:{t:0,b:{t:2,i:[{t:3}],s:"Formatação numérica"}},numbers_auto:{t:0,b:{t:2,i:[{t:3,v:"Automático, segue o idioma ("},{t:4,k:"example"},{t:3,v:")"}]}},profile:{t:0,b:{t:2,i:[{t:3,v:"O seu perfil do Home Assistant: "},{t:4,k:"formats"}]}},use_profile:{t:0,b:{t:2,i:[{t:3}],s:"Usar estes"}},editor_hint:{t:0,b:{t:2,i:[{t:3}],s:"O próprio editor segue o idioma do seu perfil do Home Assistant."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Guardado."}},saved_language:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. Cada ecrã passa a usar o novo idioma na próxima atualização."}}},alerts:{text:{t:0,b:{t:2,i:[{t:3}],s:"Um cartão sobre todo o ecrã a partir de uma automatização, num ecrã ou em todos. O guia rápido tem os nomes das ações, os campos, os ícones e as cores, e um formulário para experimentar um alerta."}},detail:{t:0,b:{t:2,i:[{t:3}],s:"Notificações em ecrã inteiro, a partir de uma automatização"}}}},firmware:{title:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar o firmware dos ecrãs"}},intro:{t:0,b:{t:2,i:[{t:3,v:"A CLI do ESPHome integrada usa o seu próprio perfil (YAML com chaves) e os seus segredos. Escolha o perfil do ecrã e depois uma porta USB (ecrã ligado à máquina do Home Assistant), "},{t:4,k:"ota"},{t:3,v:" com o nome do anfitrião, ou "},{t:4,k:"download"},{t:3,v:" para instalar o firmware no ecrã a partir do seu próprio computador. "},{t:4,k:"check"},{t:3,v:" só valida, "},{t:4,k:"build"},{t:3,v:" compila e "},{t:4,k:"install"},{t:3,v:" instala o firmware no ecrã. Os seus mosaicos ficam como estão no ESP Screens. A primeira compilação demora alguns minutos."}]}},ota:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi / OTA"}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descarregar"}},check:{t:0,b:{t:2,i:[{t:3}],s:"Verificar"}},build:{t:0,b:{t:2,i:[{t:3}],s:"Só compilar"}},install:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e instalar"}},build_download:{t:0,b:{t:2,i:[{t:3}],s:"Compilar e descarregar"}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Falta a CLI do ESPHome. Atualize a app para a versão 0.2.0."}},choose:{t:0,b:{t:2,i:[{t:3}],s:"Escolha o perfil pretendido e depois uma porta USB, um endereço IP ou Descarregar."}},profile:{t:0,b:{t:2,i:[{t:3}],s:"Perfil ESPHome"}},install_to:{t:0,b:{t:2,i:[{t:3}],s:"Instalar em"}},no_board:{t:0,b:{t:2,i:[{t:3}],s:"USB · ainda não foi encontrada nenhuma placa na máquina do Home Assistant"}},download_target:{t:0,b:{t:2,i:[{t:3}],s:"Descarregar · instalar a partir do seu próprio computador"}},host:{t:0,b:{t:2,i:[{t:3}],s:"Endereço IP ou nome do anfitrião"}},download_file:{t:0,b:{t:2,i:[{t:3,v:"Descarregar "},{t:4,k:"name"}]}},download_how:{t:0,b:{t:2,i:[{t:3,v:"Instale-o no ecrã com o "},{t:4,k:"esphome_web"},{t:3,v:" no Chrome ou no Edge: Connect, escolha a porta USB do ecrã, Install e selecione este ficheiro. Contém a sua palavra-passe de Wi-Fi e as chaves do ecrã: não o partilhe."}]}}},installer:{title:{setup:{t:0,b:{t:2,i:[{t:3}],s:"Ligar e instalar."}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Perfil guardado."}},running:{t:0,b:{t:2,i:[{t:3}],s:"Um momento…"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Pronto para descarregar."}},done:{t:0,b:{t:2,i:[{t:3}],s:"Concluído."}},failed:{t:0,b:{t:2,i:[{t:3}],s:"Não funcionou."}}},intro:{t:0,b:{t:2,i:[{t:3}],s:"O ESP Screens cria o perfil próprio do ecrã com chaves únicas e compila o firmware. Ligue o ecrã com um cabo USB de dados à máquina onde corre o Home Assistant, ou descarregue o firmware e instale-o no ecrã a partir do seu próprio computador."}},board:{t:0,b:{t:2,i:[{t:3}],s:"Que ecrã tem?"}},board_cyd:{t:0,b:{t:2,i:[{t:3}],s:"CYD · 2,8 polegadas"}},board_guition:{t:0,b:{t:2,i:[{t:3}],s:"Guition · 4 polegadas"}},board_elecrow:{t:0,b:{t:2,i:[{t:3}],s:"Elecrow CrowPanel · 7 polegadas"}},name:{t:0,b:{t:2,i:[{t:3}],s:"Nome"}},name_placeholder:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã da sala"}},device_name:{t:0,b:{t:2,i:[{t:3}],s:"Nome do dispositivo"}},customize:{t:0,b:{t:2,i:[{t:3}],s:"personalizar"}},name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Cada ecrã tem o seu próprio perfil com as suas próprias chaves. Quatro ecrãs? Faça isto quatro vezes com um nome diferente."}},device_name_hint:{t:0,b:{t:2,i:[{t:3}],s:"Letras minúsculas, algarismos e hífenes. Um nome diferente para cada ecrã."}},wifi:{title:{t:0,b:{t:2,i:[{t:3}],s:"Wi-Fi"}},ssid:{t:0,b:{t:2,i:[{t:3}],s:"Nome da rede Wi-Fi (2,4 GHz)"}},password:{t:0,b:{t:2,i:[{t:3}],s:"Palavra-passe da rede Wi-Fi"}},new:{t:0,b:{t:2,i:[{t:3}],s:"Preencha só uma vez: o ESP Screens guarda isto no secrets.yaml do ESPHome e os ecrãs seguintes usam-no automaticamente."}},missing:{t:0,b:{t:2,i:[{t:3}],s:"Ainda faltam os dados de Wi-Fi no seu secrets.yaml do ESPHome. O ESP Screens só preenche as linhas em falta."}},ready:{t:0,b:{t:2,i:[{t:3}],s:"A rede Wi-Fi vem do seu secrets.yaml do ESPHome."}},invalid:{t:0,b:{t:2,i:[{t:3}],s:"O secrets.yaml na pasta do ESPHome não é YAML válido. Corrija primeiro o ficheiro; não vai ser substituído."}}},install_via:{t:0,b:{t:2,i:[{t:3}],s:"Instalar através de"}},later:{t:0,b:{t:2,i:[{t:3}],s:"Mais tarde · só guardar o perfil"}},target:{usb:{t:0,b:{t:2,i:[{t:3}],s:"Ligue o ecrã com um cabo USB de dados à máquina do Home Assistant; a lista atualiza-se sozinha. Ou escolha Descarregar para usar o seu próprio computador."}},download:{t:0,b:{t:2,i:[{t:3}],s:"Descarregue o firmware e instale-o no ecrã a partir do seu próprio computador, no Chrome ou no Edge. Depois disso, as atualizações são feitas por Wi-Fi."}},later:{t:0,b:{t:2,i:[{t:3}],s:"O perfil fica na pasta do ESPHome. Pode instalar mais tarde através de Firmware e USB ou a partir do ESPHome Device Builder."}},several:{t:0,b:{t:2,i:[{t:3}],s:"Há mais do que uma placa ligada: escolha a porta deste ecrã."}},once:{t:0,b:{t:2,i:[{t:3}],s:"Uma vez por USB; depois disso, tudo é sem fios."}}},install:{t:0,b:{t:2,i:[{t:3}],s:"Instalar"}},save_profile:{t:0,b:{t:2,i:[{t:3}],s:"Guardar perfil"}},busy:{t:0,b:{t:2,i:[{t:3,v:"Já está a decorrer uma compilação ou instalação ("},{t:4,k:"file"},{t:3,v:"). Aguarde que termine."}]}},no_cli:{t:0,b:{t:2,i:[{t:3}],s:"Falta a CLI do ESPHome nesta instalação; só é possível guardar o perfil."}},progress:{saved:{t:0,b:{t:2,i:[{t:4,k:"file"},{t:3,v:" está na pasta do ESPHome"}]}},writing:{t:0,b:{t:2,i:[{t:3,v:"A gravar o firmware em "},{t:4,k:"name"},{t:3,v:"…"}]}},building:{t:0,b:{t:2,i:[{t:3}],s:"A compilar o firmware…"}},ready:{t:0,b:{t:2,i:[{t:3,v:"O firmware para "},{t:4,k:"name"},{t:3,v:" está pronto"}]}},installed:{t:0,b:{t:2,i:[{t:3,v:"O firmware já está em "},{t:4,k:"name"}]}},build_failed:{t:0,b:{t:2,i:[{t:3}],s:"A compilação falhou"}},install_failed:{t:0,b:{t:2,i:[{t:3}],s:"A instalação falhou"}}},detail:{saved:{t:0,b:{t:2,i:[{t:3}],s:"Instale-o mais tarde a partir de Firmware e USB: escolha este perfil e depois a porta USB da máquina do Home Assistant, ou Descarregar para instalar o firmware no ecrã a partir do seu próprio computador. Guarde a chave API para o emparelhamento:"}},uploading:{t:0,b:{t:2,i:[{t:3}],s:"Não desligue ainda o cabo USB."}},building:{t:0,b:{t:2,i:[{t:3}],s:"A primeira compilação demora alguns minutos num Raspberry Pi. Pode sair desta página: a instalação continua e volta a encontrá-la em Novo ecrã."}},building_download:{t:0,b:{t:2,i:[{t:3}],s:"A primeira compilação demora alguns minutos num Raspberry Pi. Pode sair desta página: a compilação continua e volta a encontrá-la em Novo ecrã."}},downloaded:{t:0,b:{t:2,i:[{t:3}],s:"Instale-o no ecrã a partir do seu próprio computador e depois emparelhe o ecrã com o Home Assistant."}},booted:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã arranca e liga-se à sua rede Wi-Fi. Emparelhe-o agora com o Home Assistant:"}},booted_cyd:{t:0,b:{t:2,i:[{t:3}],s:"O ecrã arranca e liga-se à sua rede Wi-Fi. O CYD pede primeiro uma calibração do toque: toque nas cruzes. Emparelhe-o agora com o Home Assistant:"}},see_log:{t:0,b:{t:2,i:[{t:3}],s:"Consulte o registo abaixo."}}},download_steps:{plug:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" com um cabo USB de dados."}]}},plug_bold:{t:0,b:{t:2,i:[{t:3}],s:"Ligue o ecrã ao seu computador"}},open:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" no Chrome ou no Edge, clique em Connect e escolha a porta USB do ecrã."}]}},open_bold:{t:0,b:{t:2,i:[{t:3,v:"Abra o "},{t:4,k:"esphome_web"}]}},install:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" e selecione "},{t:4,k:"file"},{t:3,v:". O ecrã reinicia e liga-se à sua rede Wi-Fi."}]}},install_cyd:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" e selecione "},{t:4,k:"file"},{t:3,v:". O ecrã reinicia e liga-se à sua rede Wi-Fi. O CYD pede primeiro uma calibração do toque: toque nas cruzes."}]}},install_bold:{t:0,b:{t:2,i:[{t:3}],s:"Clique em Install"}}},download_keep:{t:0,b:{t:2,i:[{t:3}],s:"O ficheiro contém a sua palavra-passe de Wi-Fi e as chaves do ecrã: não o partilhe."}},api_key:{t:0,b:{t:2,i:[{t:3}],s:"Chave API"}},pairing:{ha:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Isto acontece fora do ESP Screens. O Home Assistant descobre "},{t:4,k:"name"},{t:3,v:" como dispositivo ESPHome; clique em Adicionar. Não foi descoberto? Adicione o ESPHome manualmente com o endereço IP do ecrã."}]}},ha_bold:{t:0,b:{t:2,i:[{t:3}],s:"Vá ao Home Assistant → Configuração → Dispositivos & serviços."}},key:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" acima quando o Home Assistant pedir a chave de encriptação."}]}},key_bold:{t:0,b:{t:2,i:[{t:3}],s:"Cole a chave API"}},actions:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" integração ESPHome → Configurar → «Permitir que o dispositivo execute ações do Home Assistant». Sem isto, o ecrã vê tudo mas não controla nada."}]}},actions_bold:{t:0,b:{t:2,i:[{t:3}],s:"Permita as ações do HA:"}},tiles:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" De volta ao ESP Screens, o ecrã aparece na lista à esquerda em cerca de trinta segundos; até lá, aparece aí como «ainda não está no Home Assistant»."}]}},tiles_bold:{t:0,b:{t:2,i:[{t:3}],s:"Escolha os seus mosaicos."}}},log:{t:0,b:{t:2,i:[{t:3}],s:"Registo do ESPHome"}},retry:{t:0,b:{t:2,i:[{t:3}],s:"Tentar novamente"}},another:{t:0,b:{t:2,i:[{t:3}],s:"Instalar outro ecrã"}},start_over:{t:0,b:{t:2,i:[{t:3}],s:"Recomeçar"}},done:{t:0,b:{t:2,i:[{t:3}],s:"Concluído"}}},alerts:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Alertas · guia rápido"}},title:{t:0,b:{t:2,i:[{t:3}],s:"Uma notificação em ecrã inteiro, a partir de uma automatização."}},intro:{t:0,b:{t:2,i:[{t:3,v:"Cada ecrã tem a ação "},{t:4,k:"action"},{t:3,v:". Coloca um cartão por cima de tudo, acorda o ecrã e mantém a retroiluminação no brilho normal até alguém tocar no botão ou o tempo limite acabar. O próprio Home Assistant não mostra explicações nem listas pendentes para as ações do ESPHome; tudo o que pode preencher está aqui."}]}},loading:{t:0,b:{t:2,i:[{t:3}],s:"O guia rápido ainda está a carregar; um momento."}},example:{title:{t:0,b:{t:2,i:[{t:3}],s:"Está alguém à porta"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Porta 3, traseira"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Já vou"}}},sections:{t:0,b:{t:2,i:[{t:3}],s:"Secções"}},nav:{try:{t:0,b:{t:2,i:[{t:3}],s:"Experimente"}},screens:{t:0,b:{t:2,i:[{t:3}],s:"Os seus ecrãs"}},howto:{t:0,b:{t:2,i:[{t:3}],s:"Numa automatização"}},all:{t:0,b:{t:2,i:[{t:3}],s:"Todos os ecrãs"}},fields:{t:0,b:{t:2,i:[{t:3}],s:"Os campos"}},icons:{t:0,b:{t:2,i:[{t:3}],s:"Ícones"}},colors:{t:0,b:{t:2,i:[{t:3}],s:"Cores"}},behaviour:{t:0,b:{t:2,i:[{t:3}],s:"Comportamento"}},events:{t:0,b:{t:2,i:[{t:3}],s:"Eventos"}},tips:{t:0,b:{t:2,i:[{t:3}],s:"Dicas"}}},try:{text:{t:0,b:{t:2,i:[{t:3}],s:"Envie agora um alerta, com os mesmos campos que uma automatização envia. O ecrã mostra o cartão e, com a intermitência ativada, faz piscar a retroiluminação."}},screen:{t:0,b:{t:2,i:[{t:3}],s:"Ecrã"}},all:{t:0,b:{t:2,i:[{t:3,v:"Todos os ecrãs (prontos: "},{t:4,k:"ready"},{t:3,v:")"}]}},not_ready:{t:0,b:{t:2,i:[{t:4,k:"name"},{t:3,v:" · não está pronto"}]}},title:{t:0,b:{t:2,i:[{t:3}],s:"Título"}},subtitle:{t:0,b:{t:2,i:[{t:3}],s:"Subtítulo"}},icon:{t:0,b:{t:2,i:[{t:3}],s:"Ícone"}},color:{t:0,b:{t:2,i:[{t:3}],s:"Cor"}},button:{t:0,b:{t:2,i:[{t:3}],s:"Texto do botão"}},timeout:{t:0,b:{t:2,i:[{t:3}],s:"Tempo limite (segundos; 0 espera pelo botão)"}},flash:{t:0,b:{t:2,i:[{t:3}],s:"Fazer piscar a retroiluminação"}},flash_hint:{t:0,b:{t:2,i:[{t:3}],s:"Quatro vezes quando o alerta chega."}},sending:{t:0,b:{t:2,i:[{t:3}],s:"A enviar…"}},send:{t:0,b:{t:2,i:[{t:3}],s:"Enviar alerta"}},sent_all:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Enviado para "},{t:4,k:"n"},{t:3,v:" ecrã."}]},{t:2,i:[{t:3,v:"Enviado para "},{t:4,k:"n"},{t:3,v:" ecrãs."}]}]}},sent_to:{t:0,b:{t:2,i:[{t:3,v:"Enviado para "},{t:4,k:"name"},{t:3,v:"."}]}},sent_one:{t:0,b:{t:2,i:[{t:3}],s:"Enviado para o ecrã."}},skipped:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" ecrã ignorado (offline ou firmware antigo)."}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" ecrãs ignorados (offline ou firmware antigo)."}]}]}},left_empty:{t:0,b:{t:2,i:[{t:3,v:"Deixados vazios: "},{t:4,k:"fields"},{t:3,v:"."}]}},nothing:{t:0,b:{t:2,i:[{t:3,v:"Nenhum ecrã o conseguiu mostrar: verifique se há um ecrã online com o firmware "},{t:4,k:"version"},{t:3,v:" ou mais recente."}]}}},white:{t:0,b:{t:2,i:[{t:3}],s:"Branco (predefinido)"}},screens:{text:{t:0,b:{t:2,i:[{t:3,v:"Cada ecrã tem a sua própria ação, com o nome do dispositivo. A partir do firmware "},{t:4,k:"version"},{t:3,v:"; atualize um ecrã mais antigo com o respetivo botão Atualizar em Ecrãs."}]}},none:{t:0,b:{t:2,i:[{t:3}],s:"Ainda não há nenhum ecrã emparelhado. Instale um através de Novo ecrã; a ação aparece assim que o Home Assistant vir o ecrã."}},ready:{t:0,b:{t:2,i:[{t:3,v:"● firmware "},{t:4,k:"version"}]}},update:{t:0,b:{t:2,i:[{t:3,v:"Atualização necessária · firmware "},{t:4,k:"version"}]}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Nome do dispositivo desconhecido · atualize o ecrã"}},show:{t:0,b:{t:2,i:[{t:3}],s:"Mostrar alerta"}},dismiss:{t:0,b:{t:2,i:[{t:3}],s:"Descartar alerta"}}},howto:{add:{t:0,b:{t:2,i:[{t:3,v:"Clique em "},{t:4,k:"add"},{t:3,v:" e procure "},{t:4,k:"esphome"},{t:3,v:". Escolha a ação do seu ecrã: o Home Assistant chama-lhe «Performs the action show_alert of the node "},{t:4,k:"device"},{t:3,v:"»."}]}},add_bold:{t:0,b:{t:2,i:[{t:3}],s:"Adicionar ação"}},device:{t:0,b:{t:2,i:[{t:3}],s:"nome do dispositivo"}},fields:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" O Home Assistant pede os sete; deixe vazio o que não usar ("},{t:4,k:"empty"},{t:3,v:", "},{t:4,k:"zero"},{t:3,v:", desativado)."}]}},fields_bold:{t:0,b:{t:2,i:[{t:3}],s:"Preencha os campos."}},yaml:{t:0,b:{t:2,i:[{t:3,v:"Prefere YAML? Escolha "},{t:4,k:"edit"},{t:3,v:" na ação e cole o exemplo abaixo."}]}},example_for:{t:0,b:{t:2,i:[{t:3}],s:"Exemplo para"}},no_screen:{t:0,b:{t:2,i:[{t:3}],s:"um ecrã (ainda não emparelhado)"}}},edit_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Editar em YAML"}},copy_yaml:{t:0,b:{t:2,i:[{t:3}],s:"Copiar YAML"}},all:{title:{t:0,b:{t:2,i:[{t:3}],s:"Todos os ecrãs de uma vez"}},text:{t:0,b:{t:2,i:[{t:3,v:"Dispare o evento "},{t:4,k:"show"},{t:3,v:" com os mesmos campos e o ESP Screens passa o alerta a todos os ecrãs online, incluindo os que adicionar mais tarde. "},{t:4,k:"dismiss"},{t:3,v:" remove-o em todo o lado. Numa automatização, adicione a ação "},{t:4,k:"event"},{t:3,v:" ou cole o exemplo em "},{t:4,k:"edit"},{t:3,v:". Omita os campos que não usar. Para isto, o ESP Screens tem de estar em execução."}]}},event:{t:0,b:{t:2,i:[{t:3}],s:"Dispara evento manual"}}},fields:{text:{t:0,b:{t:2,i:[{t:3}],s:"O texto é livre; o limite é em bytes e uma letra acentuada conta como dois. O que não couber termina em reticências (título) ou é descartado (subtítulo)."}},field:{t:0,b:{t:2,i:[{t:3}],s:"Campo"}},type:{t:0,b:{t:2,i:[{t:3}],s:"Tipo"}},what:{t:0,b:{t:2,i:[{t:3}],s:"O que faz"}},example:{t:0,b:{t:2,i:[{t:3}],s:"Exemplo"}},limit:{t:0,b:{t:2,i:[{t:3}],s:"Limite"}},types:{string:{t:0,b:{t:2,i:[{t:3}],s:"texto"}},int:{t:0,b:{t:2,i:[{t:3}],s:"número"}},bool:{t:0,b:{t:2,i:[{t:3}],s:"ativado / desativado"}},entity:{t:0,b:{t:2,i:[{t:3}],s:"entidade"}}},bytes:{t:0,b:{t:2,i:[{t:3,v:"CYD "},{t:4,k:"cyd"},{t:3,v:" · Guition "},{t:4,k:"guition"},{t:3,v:" bytes"}]}},seconds:{t:0,b:{t:2,i:[{t:3}],s:"de 0 a 86400 s"}},camera_limit:{t:0,b:{t:2,i:[{t:3}],s:"Guition, firmware 0.2.57+"}}},icons:{text:{t:0,b:{t:2,i:[{t:3,v:"Preencha o nome em "},{t:4,k:"field"},{t:3,v:", por exemplo "},{t:4,k:"example"},{t:3,v:". "},{t:4,k:"mdi"},{t:3,v:" e o código hexadecimal ("},{t:4,k:"hex"},{t:3,v:") também funcionam. O firmware só inclui estes ícones; qualquer outro nome mostra o triângulo de aviso. Toque num ícone para copiar o nome."}]}},handy:{t:0,b:{t:2,i:[{t:3}],s:"Úteis para notificações"}},search_label:{t:0,b:{t:2,i:[{t:3}],s:"Procurar um ícone"}},search:{t:0,b:{t:2,i:[{t:3}],s:"Procurar por nome ou descrição…"}},extra:{t:0,b:{t:2,i:[{t:3}],s:"Também disponíveis: ícones de controlo e de meteorologia"}},copy:{t:0,b:{t:2,i:[{t:3,v:"Copiar "},{t:4,k:"name"}]}},none:{t:0,b:{t:2,i:[{t:3,v:"Nenhum ícone para «"},{t:4,k:"query"},{t:3,v:"». Os nomes desconhecidos mostram o triângulo de aviso ("},{t:4,k:"fallback"},{t:3,v:")."}]}}},colors:{text:{t:0,b:{t:2,i:[{t:3,v:"Preencha o nome em "},{t:4,k:"field"},{t:3,v:". São os tons pastel dos mosaicos, com texto escuro. Vazio ou desconhecido dá o cartão branco. Toque para copiar."}]}}},behaviour:{wakes:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Um alerta acorda de imediato um ecrã com brilho reduzido ou apagado e aparece por cima de todas as páginas, de todos os cartões de luz abertos e da camada de espera."}]}},wakes_bold:{t:0,b:{t:2,i:[{t:3}],s:"Acorda o ecrã."}},on:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Enquanto o cartão estiver visível, a retroiluminação mantém o brilho normal. A espera automática e o modo noturno ficam em pausa. Depois de premir o botão, o tempo de espera normal recomeça."}]}},on_bold:{t:0,b:{t:2,i:[{t:3}],s:"Aceso até premir o botão."}},timeout:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"zero"},{t:3,v:" espera pelo botão, demore o que demorar. Com "},{t:4,k:"minute"},{t:3,v:", o cartão desaparece ao fim de um minuto, mas o botão fecha-o mais cedo."}]}},timeout_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tempo limite."}},blinking:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"flash"},{t:3,v:" faz piscar a retroiluminação quatro vezes quando o alerta chega (cerca de um segundo) e depois deixa o ecrã ligado."}]}},blinking_bold:{t:0,b:{t:2,i:[{t:3}],s:"Intermitência."}},replacing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" Um alerta novo substitui o atual; não se acumulam. O alerta substituído é reportado como "},{t:4,k:"replaced"},{t:3,v:"."}]}},replacing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Substituição."}},closing:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" "},{t:4,k:"dismiss"},{t:3,v:" remove o cartão, por exemplo se a porta já estiver aberta. Sem alerta, essa ação não faz nada."}]}},closing_bold:{t:0,b:{t:2,i:[{t:3}],s:"Fecho remoto."}},beside:{t:0,b:{t:2,i:[{t:4,k:"bold"},{t:3,v:" não faz nada; só o botão o fecha. Assim, um toque para acordar o ecrã nunca descarta o alerta por acidente."}]}},beside_bold:{t:0,b:{t:2,i:[{t:3}],s:"Tocar fora do cartão"}}},events:{text:{t:0,b:{t:2,i:[{t:3,v:"Sempre que um alerta termina, é disparado o evento "},{t:4,k:"event"},{t:3,v:" com "},{t:4,k:"action"},{t:3,v:", "},{t:4,k:"title"},{t:3,v:", "},{t:4,k:"screen"},{t:3,v:" (o nome do dispositivo) e o "},{t:4,k:"device_id"},{t:3,v:" que o Home Assistant acrescenta. Visível em Configuração → Ferramentas → Eventos."}]}},when:{t:0,b:{t:2,i:[{t:3}],s:"Quando"}},wait:{t:0,b:{t:2,i:[{t:3}],s:"Esperar que alguém prima o botão"}}},tips:{color:{t:0,b:{t:2,i:[{t:3,v:"Use uma "},{t:4,k:"bold"},{t:3,v:": laranja para a porta, vermelho para fumo ou água, verde para «concluído». O texto fica sempre escuro e legível."}]}},color_bold:{t:0,b:{t:2,i:[{t:3}],s:"cor por tipo de notificação"}},short:{t:0,b:{t:2,i:[{t:3,v:"Mantenha o título "},{t:4,k:"bold"},{t:3,v:"; um ecrã mostra cerca de vinte caracteres numa linha e termina um título mais longo com reticências. Coloque os detalhes no subtítulo."}]}},short_bold:{t:0,b:{t:2,i:[{t:3}],s:"curto"}},button:{t:0,b:{t:2,i:[{t:3,v:"Um "},{t:4,k:"bold"},{t:3,v:" transforma a notificação numa pergunta: «Já vou», «Visto», «Desligar». Depois, o evento diz-lhe quem respondeu."}]}},button_bold:{t:0,b:{t:2,i:[{t:3}],s:"texto de botão personalizado"}},resolve:{t:0,b:{t:2,i:[{t:3,v:"Para um alerta que se resolve sozinho (a porta abre-se, alguém tira a roupa da máquina), feche-o na mesma automatização com "},{t:4,k:"dismiss"},{t:3,v:"."}]}},every:{t:0,b:{t:2,i:[{t:3,v:"Todos os ecrãs? Dispare "},{t:4,k:"event"},{t:3,v:" uma vez (ver «Todos os ecrãs de uma vez»). Os ecrãs continuam a funcionar de forma independente e cada um reporta com o seu próprio "},{t:4,k:"screen"},{t:3,v:"."}]}},claude:{t:0,b:{t:2,i:[{t:3,v:"Prefere "},{t:4,k:"bold"},{t:3,v:" que faça a automatização? Instale a habilidade do ESP Screens em Definições → Claude."}]}},claude_bold:{t:0,b:{t:2,i:[{t:3}],s:"pedir ao Claude"}}},wait_yaml:{comment:{t:0,b:{t:2,i:[{t:3}],s:"Campainha: mostra o alerta e espera que alguém prima o botão."}},message:{t:0,b:{t:2,i:[{t:3}],s:"Vem alguém à porta."}}}},override:{eyebrow:{t:0,b:{t:2,i:[{t:3}],s:"Avançado · personalização local"}},title:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado"}},title_named:{t:0,b:{t:2,i:[{t:3,v:"YAML personalizado · "},{t:4,k:"name"}]}},intro:{t:0,b:{t:2,i:[{t:3}],s:"Este pequeno ficheiro é seu. É carregado depois do pacote partilhado dos ecrãs e mantém-se quando o ESP Screens é atualizado. Altere aqui detalhes específicos do hardware, como o modelo do ecrã."}},safe_title:{t:0,b:{t:2,i:[{t:3}],s:"O que é seguro alterar?"}},safe_text:{t:0,b:{t:2,i:[{t:3}],s:"As secções display, touchscreen e substitutions, os pinos e outros detalhes do dispositivo. O nome, a rede Wi-Fi, a API, a OTA e as ligações aos pacotes continuam a ser geridos pelo ESP Screens."}},active:{t:0,b:{t:2,i:[{t:3}],s:"Ativo"}},ready:{t:0,b:{t:2,i:[{t:3}],s:"Pronto para associar"}},editor_label:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado local"}},use_example:{t:0,b:{t:2,i:[{t:3}],s:"Usar exemplo"}},clear:{t:0,b:{t:2,i:[{t:3}],s:"Limpar"}},characters:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" carácter"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" caracteres"}]}]}},lines:{t:0,b:{t:1,c:[{t:2,i:[{t:4,k:"n"},{t:3,v:" linha"}]},{t:2,i:[{t:4,k:"n"},{t:3,v:" linhas"}]}]}},save_check:{t:0,b:{t:2,i:[{t:3}],s:"Guardar e verificar"}},save:{t:0,b:{t:2,i:[{t:3}],s:"Guardar YAML"}},no_profile:{t:0,b:{t:2,i:[{t:3}],s:"Não foi encontrado nenhum perfil ESPHome para este ecrã."}},attached:{t:0,b:{t:2,i:[{t:3}],s:"As alterações feitas aqui aplicam-se na próxima compilação."}},not_attached:{t:0,b:{t:2,i:[{t:3}],s:"Guarde uma vez para associar este ficheiro ao perfil."}},saving:{t:0,b:{t:2,i:[{t:3}],s:"A verificar e a guardar…"}},saved:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. O YAML personalizado mantém-se nas atualizações de firmware."}},saved_toast:{t:0,b:{t:2,i:[{t:3}],s:"YAML personalizado guardado."}},checking:{t:0,b:{t:2,i:[{t:3}],s:"Guardado. O ESPHome está a verificar o perfil completo…"}},checking_profile:{t:0,b:{t:2,i:[{t:3}],s:"O ESPHome está a verificar o perfil…"}},checking_stage:{t:0,b:{t:2,i:[{t:3,v:"O ESPHome está a verificar o perfil… "},{t:4,k:"stage"}]}},valid:{t:0,b:{t:2,i:[{t:3}],s:"O perfil completo é válido. Pode compilar e instalar com segurança."}},rejected:{t:0,b:{t:2,i:[{t:3}],s:"O ESPHome rejeitou o perfil completo. Consulte Firmware e USB para ver o registo completo."}},confirm_example:{t:0,b:{t:2,i:[{t:3}],s:"Substituir o texto atual pelo exemplo?"}},example_loaded:{t:0,b:{t:2,i:[{t:3}],s:"Exemplo carregado. Guarde-o quando estiver pronto."}},confirm_clear:{t:0,b:{t:2,i:[{t:3}],s:"Limpar o YAML personalizado local?"}},cleared:{t:0,b:{t:2,i:[{t:3}],s:"O YAML personalizado ficará vazio quando guardar."}}},mockup:{home:{t:0,b:{t:2,i:[{t:3}],s:"Casa"}},unknown:{t:0,b:{t:2,i:[{t:3}],s:"Desconhecido"}}}},screen:{ha:{on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},unavailable:{t:0,b:{t:2,i:[{t:3}],s:"Indisponível"}},climate:{off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},heat:{t:0,b:{t:2,i:[{t:3}],s:"Aquecer"}},cool:{t:0,b:{t:2,i:[{t:3}],s:"Arrefecer"}},heat_cool:{t:0,b:{t:2,i:[{t:3}],s:"Aquecer/Arrefecer"}},auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},dry:{t:0,b:{t:2,i:[{t:3}],s:"Secar"}},fan_only:{t:0,b:{t:2,i:[{t:3}],s:"Ventilação"}}},hvac_action:{heating:{t:0,b:{t:2,i:[{t:3}],s:"A aquecer"}},cooling:{t:0,b:{t:2,i:[{t:3}],s:"A arrefecer"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inativo"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},drying:{t:0,b:{t:2,i:[{t:3}],s:"Desumidificação"}},fan:{t:0,b:{t:2,i:[{t:3}],s:"Ventilação"}},preheating:{t:0,b:{t:2,i:[{t:3}],s:"Pré-Aquecimento"}},defrosting:{t:0,b:{t:2,i:[{t:3}],s:"Descongelação"}}},cover:{open:{t:0,b:{t:2,i:[{t:3}],s:"Aberta"}},closed:{t:0,b:{t:2,i:[{t:3}],s:"Fechado"}},opening:{t:0,b:{t:2,i:[{t:3}],s:"A abrir"}},closing:{t:0,b:{t:2,i:[{t:3}],s:"A fechar"}}},media:{playing:{t:0,b:{t:2,i:[{t:3}],s:"A reproduzir"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Pausado"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inativo"}},standby:{t:0,b:{t:2,i:[{t:3}],s:"Standby"}}},person:{home:{t:0,b:{t:2,i:[{t:3}],s:"Casa"}},not_home:{t:0,b:{t:2,i:[{t:3}],s:"Ausente"}}},sun:{above_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Acima do horizonte"}},below_horizon:{t:0,b:{t:2,i:[{t:3}],s:"Abaixo do horizonte"}}},vacuum:{docked:{t:0,b:{t:2,i:[{t:3}],s:"Na Base"}},cleaning:{t:0,b:{t:2,i:[{t:3}],s:"A Limpar"}},paused:{t:0,b:{t:2,i:[{t:3}],s:"Em pausa"}},returning:{t:0,b:{t:2,i:[{t:3}],s:"A regressar à base"}},idle:{t:0,b:{t:2,i:[{t:3}],s:"Inativo"}}},weather:{sunny:{t:0,b:{t:2,i:[{t:3}],s:"Ensolarado"}},clear_night:{t:0,b:{t:2,i:[{t:3}],s:"Limpo, noite"}},cloudy:{t:0,b:{t:2,i:[{t:3}],s:"Nublado"}},partlycloudy:{t:0,b:{t:2,i:[{t:3}],s:"Parcialmente nublado"}},rainy:{t:0,b:{t:2,i:[{t:3}],s:"Chuvoso"}},pouring:{t:0,b:{t:2,i:[{t:3}],s:"Aguaceiros"}},snowy:{t:0,b:{t:2,i:[{t:3}],s:"Nevoso"}},snowy_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Nevoso, chuvoso"}},fog:{t:0,b:{t:2,i:[{t:3}],s:"Nevoeiro"}},hail:{t:0,b:{t:2,i:[{t:3}],s:"Granizo"}},lightning:{t:0,b:{t:2,i:[{t:3}],s:"Trovoada"}},lightning_rainy:{t:0,b:{t:2,i:[{t:3}],s:"Trovoada, chuva"}},windy:{t:0,b:{t:2,i:[{t:3}],s:"Ventoso"}},exceptional:{t:0,b:{t:2,i:[{t:3}],s:"Excecional"}}},binary:{battery_on:{t:0,b:{t:2,i:[{t:3}],s:"Baixo"}},battery_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},battery_charging_on:{t:0,b:{t:2,i:[{t:3}],s:"A carregar"}},battery_charging_off:{t:0,b:{t:2,i:[{t:3}],s:"Não está a carregar"}},carbon_monoxide_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},carbon_monoxide_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},cold_on:{t:0,b:{t:2,i:[{t:3}],s:"Frio"}},cold_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},connectivity_on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},connectivity_off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},door_on:{t:0,b:{t:2,i:[{t:3}],s:"Aberto"}},door_off:{t:0,b:{t:2,i:[{t:3}],s:"Fechada"}},garage_door_on:{t:0,b:{t:2,i:[{t:3}],s:"Aberta"}},garage_door_off:{t:0,b:{t:2,i:[{t:3}],s:"Fechado"}},gas_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},gas_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},heat_on:{t:0,b:{t:2,i:[{t:3}],s:"Quente"}},heat_off:{t:0,b:{t:2,i:[{t:3}],s:"Normal"}},light_on:{t:0,b:{t:2,i:[{t:3}],s:"Luz detetada"}},light_off:{t:0,b:{t:2,i:[{t:3}],s:"Sem luz"}},lock_on:{t:0,b:{t:2,i:[{t:3}],s:"Destrancada"}},lock_off:{t:0,b:{t:2,i:[{t:3}],s:"Trancado"}},moisture_on:{t:0,b:{t:2,i:[{t:3}],s:"Húmido"}},moisture_off:{t:0,b:{t:2,i:[{t:3}],s:"Seco"}},motion_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},motion_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},moving_on:{t:0,b:{t:2,i:[{t:3}],s:"Em movimento"}},moving_off:{t:0,b:{t:2,i:[{t:3}],s:"Parado"}},occupancy_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},occupancy_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},opening_on:{t:0,b:{t:2,i:[{t:3}],s:"Aberta"}},opening_off:{t:0,b:{t:2,i:[{t:3}],s:"Fechada"}},plug_on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},plug_off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},power_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},power_off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},presence_on:{t:0,b:{t:2,i:[{t:3}],s:"Em casa"}},presence_off:{t:0,b:{t:2,i:[{t:3}],s:"Ausente"}},problem_on:{t:0,b:{t:2,i:[{t:3}],s:"Problema"}},problem_off:{t:0,b:{t:2,i:[{t:3}],s:"OK"}},running_on:{t:0,b:{t:2,i:[{t:3}],s:"Em execução"}},running_off:{t:0,b:{t:2,i:[{t:3}],s:"Parado"}},safety_on:{t:0,b:{t:2,i:[{t:3}],s:"Inseguro"}},safety_off:{t:0,b:{t:2,i:[{t:3}],s:"Seguro"}},smoke_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},smoke_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},sound_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},sound_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},tamper_on:{t:0,b:{t:2,i:[{t:3}],s:"Adulteração detetada"}},tamper_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},update_on:{t:0,b:{t:2,i:[{t:3}],s:"Atualização disponível"}},update_off:{t:0,b:{t:2,i:[{t:3}],s:"Atualizado"}},vibration_on:{t:0,b:{t:2,i:[{t:3}],s:"Detetado"}},vibration_off:{t:0,b:{t:2,i:[{t:3}],s:"Limpo"}},window_on:{t:0,b:{t:2,i:[{t:3}],s:"Aberto"}},window_off:{t:0,b:{t:2,i:[{t:3}],s:"Fechada"}}},button:{activate:{t:0,b:{t:2,i:[{t:3}],s:"Ativar"}},run:{t:0,b:{t:2,i:[{t:3}],s:"Executar"}},press:{t:0,b:{t:2,i:[{t:3}],s:"Pressione"}}},climate_fan:{auto:{t:0,b:{t:2,i:[{t:3}],s:"Auto"}},low:{t:0,b:{t:2,i:[{t:3}],s:"Baixo"}},medium:{t:0,b:{t:2,i:[{t:3}],s:"Médio"}},high:{t:0,b:{t:2,i:[{t:3}],s:"Alto"}},middle:{t:0,b:{t:2,i:[{t:3}],s:"Meio"}},focus:{t:0,b:{t:2,i:[{t:3}],s:"Concentrado"}},diffuse:{t:0,b:{t:2,i:[{t:3}],s:"Difuso"}},top:{t:0,b:{t:2,i:[{t:3}],s:"Total"}},on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}}},climate_swing:{on:{t:0,b:{t:2,i:[{t:3}],s:"Ligado"}},off:{t:0,b:{t:2,i:[{t:3}],s:"Desligado"}},both:{t:0,b:{t:2,i:[{t:3}],s:"Ambos"}},vertical:{t:0,b:{t:2,i:[{t:3}],s:"Vertical"}},horizontal:{t:0,b:{t:2,i:[{t:3}],s:"Horizontal"}}}},time:{just_now:{t:0,b:{t:2,i:[{t:3}],s:"Agora mesmo"}},minutes_ago:{t:0,b:{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" min"}]}},hours_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" hora"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" horas"}]}]}},yesterday:{t:0,b:{t:2,i:[{t:3}],s:"Ontem"}},days_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" dia"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" dias"}]}]}},weeks_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" semana"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" semanas"}]}]}},months_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" mês"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" meses"}]}]}},years_ago:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" ano"}]},{t:2,i:[{t:3,v:"Há "},{t:4,k:"n"},{t:3,v:" anos"}]}]}},in_minutes:{t:0,b:{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" min"}]}},in_hours:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" hora"}]},{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" horas"}]}]}},tomorrow:{t:0,b:{t:2,i:[{t:3}],s:"Amanhã"}},in_days:{t:0,b:{t:1,c:[{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" dia"}]},{t:2,i:[{t:3,v:"Daqui a "},{t:4,k:"n"},{t:3,v:" dias"}]}]}},am:{t:0,b:{t:2,i:[{t:3}],s:"da manhã"}},pm:{t:0,b:{t:2,i:[{t:3}],s:"da tarde"}}},date:{weekdays:[{t:0,b:{t:2,i:[{t:3}],s:"domingo"}},{t:0,b:{t:2,i:[{t:3}],s:"segunda-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"terça-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"quarta-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"quinta-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"sexta-feira"}},{t:0,b:{t:2,i:[{t:3}],s:"sábado"}}],weekdays_short:[{t:0,b:{t:2,i:[{t:3}],s:"domingo"}},{t:0,b:{t:2,i:[{t:3}],s:"segunda"}},{t:0,b:{t:2,i:[{t:3}],s:"terça"}},{t:0,b:{t:2,i:[{t:3}],s:"quarta"}},{t:0,b:{t:2,i:[{t:3}],s:"quinta"}},{t:0,b:{t:2,i:[{t:3}],s:"sexta"}},{t:0,b:{t:2,i:[{t:3}],s:"sábado"}}],weekdays_min:[{t:0,b:{t:2,i:[{t:3}],s:"do"}},{t:0,b:{t:2,i:[{t:3}],s:"sg"}},{t:0,b:{t:2,i:[{t:3}],s:"te"}},{t:0,b:{t:2,i:[{t:3}],s:"qu"}},{t:0,b:{t:2,i:[{t:3}],s:"qi"}},{t:0,b:{t:2,i:[{t:3}],s:"sx"}},{t:0,b:{t:2,i:[{t:3}],s:"sb"}}],months:[{t:0,b:{t:2,i:[{t:3}],s:"janeiro"}},{t:0,b:{t:2,i:[{t:3}],s:"fevereiro"}},{t:0,b:{t:2,i:[{t:3}],s:"março"}},{t:0,b:{t:2,i:[{t:3}],s:"abril"}},{t:0,b:{t:2,i:[{t:3}],s:"maio"}},{t:0,b:{t:2,i:[{t:3}],s:"junho"}},{t:0,b:{t:2,i:[{t:3}],s:"julho"}},{t:0,b:{t:2,i:[{t:3}],s:"agosto"}},{t:0,b:{t:2,i:[{t:3}],s:"setembro"}},{t:0,b:{t:2,i:[{t:3}],s:"outubro"}},{t:0,b:{t:2,i:[{t:3}],s:"novembro"}},{t:0,b:{t:2,i:[{t:3}],s:"dezembro"}}],months_short:[{t:0,b:{t:2,i:[{t:3}],s:"jan."}},{t:0,b:{t:2,i:[{t:3}],s:"fev."}},{t:0,b:{t:2,i:[{t:3}],s:"mar."}},{t:0,b:{t:2,i:[{t:3}],s:"abr."}},{t:0,b:{t:2,i:[{t:3}],s:"mai."}},{t:0,b:{t:2,i:[{t:3}],s:"jun."}},{t:0,b:{t:2,i:[{t:3}],s:"jul."}},{t:0,b:{t:2,i:[{t:3}],s:"ago."}},{t:0,b:{t:2,i:[{t:3}],s:"set."}},{t:0,b:{t:2,i:[{t:3}],s:"out."}},{t:0,b:{t:2,i:[{t:3}],s:"nov."}},{t:0,b:{t:2,i:[{t:3}],s:"dez."}}],top_bar:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},full:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"day"},{t:3,v:" de "},{t:4,k:"month"}]}},day_month:{t:0,b:{t:2,i:[{t:4,k:"day"},{t:3,v:" "},{t:4,k:"month"}]}},weekday_time:{t:0,b:{t:2,i:[{t:4,k:"weekday"},{t:3,v:", "},{t:4,k:"time"}]}}},number:{decimal:{t:0,b:{t:2,i:[{t:3}],s:","}},group:{t:0,b:{t:2,i:[{t:3}],s:" "}},group_min:{t:0,b:{t:2,i:[{t:3}],s:"2"}},percent:{t:0,b:{t:2,i:[{t:3}],s:"%"}}},tile:{page:{t:0,b:{t:2,i:[{t:3,v:"Página "},{t:4,k:"n"}]}}}}};export{t as default}; diff --git a/screen_manager/app/static/index.html b/screen_manager/app/static/index.html index e8e2377..fa85ddf 100644 --- a/screen_manager/app/static/index.html +++ b/screen_manager/app/static/index.html @@ -5,8 +5,8 @@ ESP Screens - - + +

diff --git a/screen_manager/config.yaml b/screen_manager/config.yaml index 0c7102a..972e309 100644 --- a/screen_manager/config.yaml +++ b/screen_manager/config.yaml @@ -1,8 +1,8 @@ name: ESP Screen Manager -version: "0.2.92" +version: "0.2.93" slug: esp_screen_manager description: Choose tiles for your CYD and Guition touchscreen, without reflashing. -url: https://github.com/MaxGramser/homeassistant_espscreen +url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen arch: [aarch64, amd64] startup: application boot: auto diff --git a/screen_manager/translations/de.json b/screen_manager/translations/de.json index 09b279c..f1f0d94 100644 --- a/screen_manager/translations/de.json +++ b/screen_manager/translations/de.json @@ -1593,6 +1593,7 @@ "board": "Welchen Bildschirm hast du?", "board_cyd": "CYD · 2,8 Zoll", "board_guition": "Guition · 4 Zoll", + "board_elecrow": "Elecrow CrowPanel · 7 Zoll", "name": "Name", "name_placeholder": "Bildschirm Wohnzimmer", "device_name": "Gerätename", diff --git a/screen_manager/translations/en.json b/screen_manager/translations/en.json index 5e5f5b6..5829643 100644 --- a/screen_manager/translations/en.json +++ b/screen_manager/translations/en.json @@ -1593,6 +1593,7 @@ "board": "Which screen do you have?", "board_cyd": "CYD · 2.8 inch", "board_guition": "Guition · 4 inch", + "board_elecrow": "Elecrow CrowPanel · 7 inch", "name": "Name", "name_placeholder": "Living room screen", "device_name": "Device name", diff --git a/screen_manager/translations/es.json b/screen_manager/translations/es.json index 5f212c4..e480e2d 100644 --- a/screen_manager/translations/es.json +++ b/screen_manager/translations/es.json @@ -1593,6 +1593,7 @@ "board": "¿Qué pantalla tienes?", "board_cyd": "CYD · 2,8 pulgadas", "board_guition": "Guition · 4 pulgadas", + "board_elecrow": "Elecrow CrowPanel · 7 pulgadas", "name": "Nombre", "name_placeholder": "Pantalla del salón", "device_name": "Nombre del dispositivo", diff --git a/screen_manager/translations/fr.json b/screen_manager/translations/fr.json index 286058b..39da825 100644 --- a/screen_manager/translations/fr.json +++ b/screen_manager/translations/fr.json @@ -1593,6 +1593,7 @@ "board": "Quel écran avez-vous ?", "board_cyd": "CYD · 2,8 pouces", "board_guition": "Guition · 4 pouces", + "board_elecrow": "Elecrow CrowPanel · 7 pouces", "name": "Nom", "name_placeholder": "Écran du salon", "device_name": "Nom de l'appareil", diff --git a/screen_manager/translations/it.json b/screen_manager/translations/it.json index 7dc52cf..1c007f0 100644 --- a/screen_manager/translations/it.json +++ b/screen_manager/translations/it.json @@ -1593,6 +1593,7 @@ "board": "Quale schermo hai?", "board_cyd": "CYD · 2,8 pollici", "board_guition": "Guition · 4 pollici", + "board_elecrow": "Elecrow CrowPanel · 7 pollici", "name": "Nome", "name_placeholder": "Schermo del soggiorno", "device_name": "Nome dispositivo", diff --git a/screen_manager/translations/nl.json b/screen_manager/translations/nl.json index 60dc32e..2baab3e 100644 --- a/screen_manager/translations/nl.json +++ b/screen_manager/translations/nl.json @@ -1593,6 +1593,7 @@ "board": "Welk scherm heb je?", "board_cyd": "CYD · 2,8 inch", "board_guition": "Guition · 4 inch", + "board_elecrow": "Elecrow CrowPanel · 7 inch", "name": "Naam", "name_placeholder": "Scherm woonkamer", "device_name": "Apparaatnaam", diff --git a/screen_manager/translations/pl.json b/screen_manager/translations/pl.json index 72fe1a3..a527467 100644 --- a/screen_manager/translations/pl.json +++ b/screen_manager/translations/pl.json @@ -1593,6 +1593,7 @@ "board": "Jaki masz ekran?", "board_cyd": "CYD · 2,8 cala", "board_guition": "Guition · 4 cale", + "board_elecrow": "Elecrow CrowPanel · 7 cali", "name": "Nazwa", "name_placeholder": "Ekran w salonie", "device_name": "Nazwa urządzenia", diff --git a/screen_manager/translations/pt.json b/screen_manager/translations/pt.json index cb55dbf..fec4c92 100644 --- a/screen_manager/translations/pt.json +++ b/screen_manager/translations/pt.json @@ -1593,6 +1593,7 @@ "board": "Que ecrã tem?", "board_cyd": "CYD · 2,8 polegadas", "board_guition": "Guition · 4 polegadas", + "board_elecrow": "Elecrow CrowPanel · 7 polegadas", "name": "Nome", "name_placeholder": "Ecrã da sala", "device_name": "Nome do dispositivo", diff --git a/tests/test_easy_package.py b/tests/test_easy_package.py index 9bcc682..4cb2b3e 100644 --- a/tests/test_easy_package.py +++ b/tests/test_easy_package.py @@ -10,7 +10,7 @@ ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / 'tools')) import profiles # noqa: E402 -BOARDS = {'cyd': 'home-like-2432s028.yaml', 'guition': 'guition-4848s040.yaml'} +BOARDS = {'cyd': 'home-like-2432s028.yaml', 'guition': 'guition-4848s040.yaml', 'elecrow': 'elecrow-crowpanel7.yaml'} # The old manual profile bound tiles to fixed entities in the YAML. ESP Screens sends the tiles now, so # none of this may come back: the fixed subscriptions, its tap handlers and scripts, its own vacuum card. GONE = ['ha_state_tile1', 'tile1_brightness', 'tile6_climate_humidity', 'tile6_cover_state', 'smartdisplay_action', @@ -42,8 +42,8 @@ class PackageTests(unittest.TestCase): package = (ROOT / 'packages' / f'{board}.yaml').read_text() self.assertNotIn('!secret', package) self.assertNotIn('type: local', package) - self.assertIn('url: https://github.com/MaxGramser/homeassistant_espscreen.git', package) - self.assertIn('FONT_DIR: "https://raw.githubusercontent.com/MaxGramser/homeassistant_espscreen/main/fonts"', package) + self.assertIn('url: https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen.git', package) + self.assertIn('FONT_DIR: "https://gittea.trippedonmy.name/Xandrossian/homeassistant_espscreen/raw/branch/main/fonts"', package) # The fonts of the shared core come from that place; a checkout takes them from fonts/. self.assertIn('file: "${FONT_DIR}/Roboto-500.ttf"', profiles.CORE.read_text()) self.assertIn('FONT_DIR: "fonts"', (ROOT / BOARDS[board]).read_text()) diff --git a/tests/test_elecrow.py b/tests/test_elecrow.py new file mode 100644 index 0000000..5bd03e4 --- /dev/null +++ b/tests/test_elecrow.py @@ -0,0 +1,148 @@ +"""The Elecrow CrowPanel 7.0" (app 0.2.93, firmware 0.2.79): a third board, the Guition's kind at 800x480 on 4 MB of flash.""" +import re +import sys +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / 'tools')) +import profiles # noqa: E402 +sys.path.insert(0, str(ROOT / 'screen_manager/app')) +import camera_feed # noqa: E402 +import core # noqa: E402 +sys.path.insert(0, str(ROOT / 'components/smart_display')) +import partitions # noqa: E402 + +BOARD = profiles.BOARDS['elecrow'] +TEXT = BOARD.read_text() +SUBS = profiles.substitutions_of(BOARD) + + +class BoardFile(unittest.TestCase): + def test_it_is_a_landscape_guition(self): + self.assertEqual((SUBS['DISPLAY_W'], SUBS['DISPLAY_H']), ('800', '480')) + guition = profiles.substitutions_of(profiles.BOARDS['guition']) + # The vertical sizes are the Guition's: the rows, the tile height, the fonts. + for name in ('GRID_ROW1_Y', 'GRID_ROW2_Y', 'GRID_ROW3_Y', 'TILE_H', 'SCROLL_Y', 'SCROLL_H', 'HEADER_Y', + 'FONT_LABEL_SIZE', 'FONT_ICON_SIZE', 'FONT_HEADLINE_SIZE', 'TILE_ICON_SIZE', 'PAGE_BAR_H'): + self.assertEqual(SUBS[name], guition[name], name) + # Two columns of tiles fill the width with the Guition's margins and gap. + col1, col2, tile = int(SUBS['GRID_COL1_X']), int(SUBS['GRID_COL2_X']), int(SUBS['TILE_W']) + self.assertEqual(col1, 16) + self.assertEqual(col2, col1 + tile + 12) + self.assertEqual(col2 + tile + 16, 800) + self.assertEqual(int(SUBS['PAGE_KEY_W']), 400) + self.assertEqual(int(SUBS['TOUCH_TEST_FAR_X']), 800 - 12 - 24 - 1) + self.assertEqual(int(SUBS['TOUCH_TEST_MID_X']), 400 - 12) + self.assertEqual(int(SUBS['SETTINGS_HOLD_W']), 800 - 2 * int(SUBS['EDGE_SWIPE_BAND_PX'])) + + def test_it_does_not_turn(self): + self.assertEqual(SUBS['ROTATION_SUPPORTED'], 'false') + self.assertEqual(SUBS['APPLY_ROTATION'], '') + self.assertEqual(SUBS['APPLY_ROTATION_ENTITY'], '') + self.assertNotIn('id: setting_rotation', TEXT) + + def test_the_hardware_of_the_crowpanel(self): + self.assertIn('flash_size: 4MB', TEXT) + self.assertIn('platform: mipi_rgb', TEXT) + self.assertIn('model: RPI', TEXT) + self.assertIn('pclk_inverted: true', TEXT) + self.assertIn('red: [14, 21, 47, 48, 45]', TEXT) + self.assertIn('green: [9, 46, 3, 8, 16, 1]', TEXT) + self.assertIn('blue: [15, 7, 6, 5, 4]', TEXT) + self.assertIn('sda: GPIO19', TEXT) + self.assertIn('scl: GPIO20', TEXT) + self.assertIn('scan: false', TEXT) + self.assertIn('address: 0x5D', TEXT) + self.assertIn('pin: GPIO2', TEXT) + # The USB pins are the touch I2C: the header that frees them, and no interrupt pin or I/O expander. + self.assertIn('', TEXT) + code = '\n'.join(line for line in TEXT.split('\n') if not line.lstrip().startswith('#')) + self.assertNotIn('interrupt_pin', code) + self.assertNotIn('pca9557', code.lower()) + self.assertIn('assertion_level: SILENT', TEXT) + + def test_the_flash_fits_by_three_measures(self): + self.assertIn('partitions: 4mb_wide_slots', TEXT) + self.assertIn('CONFIG_MBEDTLS_TLS_CLIENT_ONLY: y', TEXT) + fonts = re.search(r'^font:\n(.*?)(?=^[a-z_]+:)', TEXT, re.M | re.S)[1] + for font in ('materialdesign_icons', 'materialdesign_icons_mini', 'materialdesign_icons_big', 'watch_icon'): + self.assertIn(f'- id: !extend {font}\n bpp: 2', fonts) + self.assertNotIn('!extend headline', fonts) + + def test_the_usb_phy_header_runs_before_every_component(self): + header = (ROOT / 'components/smart_display/elecrow_usb_phy.h').read_text() + self.assertIn('__attribute__((constructor(101)))', header) + self.assertIn('usb_serial_jtag_ll_phy_enable_pad(false)', header) + for reg in ('IO_MUX_GPIO19_REG', 'IO_MUX_GPIO20_REG'): + self.assertIn(reg, header) + # ESPHome includes every header of the component in every build: the code is behind a flag only this board sets. + self.assertIn('#if defined(ESP_SCREENS_FREE_USB_PADS) && ESP_SCREENS_FREE_USB_PADS', header) + for board, path in profiles.BOARDS.items(): + self.assertEqual('-DESP_SCREENS_FREE_USB_PADS=1' in path.read_text(), board == 'elecrow', board) + + def test_the_partition_table(self): + table = partitions.TABLES['4mb_wide_slots'] + rows = [[cell.strip() for cell in line.split(',')] for line in table.splitlines() if line.strip() and not line.startswith('#')] + by_name = {row[0]: row for row in rows} + self.assertEqual(by_name['app0'][1:], ['app', 'ota_0', '0x10000', '0x1F0000']) + self.assertEqual(by_name['app1'][1:], ['app', 'ota_1', '0x200000', '0x1F0000']) + self.assertEqual(int(by_name['nvs'][3], 16) + int(by_name['nvs'][4], 16), 4 * 1024 * 1024) + # The slots touch neither each other nor the table before them. + self.assertEqual(int(by_name['app0'][3], 16) + int(by_name['app0'][4], 16), int(by_name['app1'][3], 16)) + self.assertEqual(int(by_name['app1'][3], 16) + int(by_name['app1'][4], 16), int(by_name['nvs'][3], 16)) + self.assertGreaterEqual(int(by_name['app0'][3], 16), int(by_name['phy_init'][3], 16) + int(by_name['phy_init'][4], 16)) + for name in ('app0', 'app1'): + self.assertEqual(int(by_name[name][3], 16) % 0x10000, 0, f'{name} is 64 KB aligned') + + def test_the_entry_files(self): + for name in ('elecrow-crowpanel7.yaml', 'packages/elecrow.yaml'): + self.assertIn('boards/elecrow-crowpanel7.yaml', (ROOT / name).read_text(), name) + self.assertIn('files: [packages/elecrow.yaml]', (ROOT / 'installers/elecrow.yaml').read_text()) + self.assertEqual(profiles.board_of('packages/elecrow.yaml'), 'elecrow') + + +class TheApp(unittest.TestCase): + def test_the_board_is_read_from_the_type_sensor(self): + registry = [] + states = {} + for device, value in (('d1', 'elecrow'), ('d2', 'guition'), ('d3', 'unavailable'), ('d4', None), ('d5', 'cyd')): + registry += [{'entity_id': f'text.{device}_tiles', 'platform': 'esphome', 'original_name': 'Tile settings', 'device_id': device}, + {'entity_id': f'sensor.{device}_type', 'platform': 'esphome', 'original_name': 'Guition screen type', 'device_id': device}] + states[f'text.{device}_tiles'] = {'state': 'Synced'} + if value is not None: + states[f'sensor.{device}_type'] = {'state': value} + registry.append({'entity_id': 'text.d6_tiles', 'platform': 'esphome', 'original_name': 'Tile settings', 'device_id': 'd6'}) + states['text.d6_tiles'] = {'state': 'Synced'} + screens = {s['device_id']: s['board'] for s in core.discover_screens(registry, states, [{'id': f'd{n}', 'name': f'D{n}'} for n in range(1, 7)], [])} + # The value names the board; a sensor without a board's name (older firmware, a restart) is a Guition; no sensor is no large board. + self.assertEqual(screens, {'d1': 'elecrow', 'd2': 'guition', 'd3': 'guition', 'd4': 'guition', 'd5': 'guition', 'd6': 'unknown'}) + + def test_the_app_knows_the_board(self): + self.assertIn('elecrow', core.REFS) + self.assertEqual(core.ALERT_LIMITS['elecrow'], {'title': int(SUBS['ALERT_TITLE_MAX']), 'subtitle': int(SUBS['ALERT_SUBTITLE_MAX']), + 'button_text': int(SUBS['ALERT_BUTTON_MAX'])}) + self.assertIn('files: [packages/elecrow.yaml]', core.installation_yaml({'board': 'elecrow', 'name': 'hall', 'friendly_name': 'Hall'})) + + def test_the_camera_boxes_are_the_profile_sizes(self): + self.assertEqual(camera_feed.BOXES['elecrow'], {'full': (int(SUBS['CAMERA_FULL_W']), int(SUBS['CAMERA_FULL_H'])), + 'thumb': (int(SUBS['CAMERA_THUMB_W']), int(SUBS['CAMERA_THUMB_H']))}) + self.assertTrue(camera_feed.can_show({'board': 'elecrow', 'firmware': '0.2.79'})) + self.assertTrue(camera_feed.can_show_live({'board': 'elecrow', 'firmware': '0.2.79'})) + self.assertTrue(camera_feed.can_show_cover({'board': 'elecrow', 'firmware': '0.2.79'})) + # The alert's picture fits the wider card. + self.assertEqual(int(SUBS['CAMERA_THUMB_W']), int(SUBS['ALERT_CARD_W']) - 2 * int(SUBS['ALERT_IMAGE_INSET'])) + + def test_the_editor_offers_the_board(self): + installer = (ROOT / 'web/src/components/InstallerView.vue').read_text() + self.assertIn('value="elecrow"', installer) + for path in sorted((ROOT / 'screen_manager/translations').glob('*.json')): + if path.stem != 'en-GB': + self.assertIn('"board_elecrow"', path.read_text(), path.name) + store = (ROOT / 'web/src/store.ts').read_text() + self.assertIn('LARGE_BOARDS = ["guition", "elecrow"]', store) + self.assertIn('elecrow: { width: 768', (ROOT / 'web/src/model/topbar.ts').read_text()) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_release_lint.py b/tests/test_release_lint.py index 2f86b60..4f54580 100644 --- a/tests/test_release_lint.py +++ b/tests/test_release_lint.py @@ -20,7 +20,7 @@ CHANGELOG = ROOT / 'screen_manager/CHANGELOG.md' APP_HEADING = re.compile(r'^## (\d+)\.(\d+)\.(\d+)\b(.*)$', re.M) FIRMWARE_IN_HEADING = re.compile(r'\(firmware (\d+\.\d+\.\d+)\)') # The published entries (packages/.yaml) point ${FONT_DIR} at the raw GitHub URL of fonts/ on main. -FONT_URL = re.compile(r'https://raw\.githubusercontent\.com/MaxGramser/homeassistant_espscreen/[^/\s"\']+/(fonts/[^"\'\s]+)') +FONT_URL = re.compile(r'https://gittea\.trippedonmy\.name/Xandrossian/homeassistant_espscreen/raw/branch/[^/\s"\']+/(fonts/[^"\'\s]+)') def app_headings(): diff --git a/tools/check.sh b/tools/check.sh index 71970c4..90ffed9 100755 --- a/tools/check.sh +++ b/tools/check.sh @@ -4,7 +4,7 @@ # # tools/check.sh the Python tests, every tests/*.cpp, the package check, the icon generator's --check, the editor's # tests, types and build, and whether the editor bundle in Git equals that build -# tools/check.sh --firmware compiles both board profiles and applies the CYD's flash budget +# tools/check.sh --firmware compiles every board profile and applies the flash budget to the 4 MB boards (CYD, Elecrow) # tools/check.sh --all both # --baseline BYTES with --firmware: the CYD image of the last release, to print the growth # @@ -175,8 +175,8 @@ api_encryption_key: "Y2hlY2stYnVpbGQtcGxhY2Vob2xkZXIta2V5LTMyYnk=" ota_password: "check-build-ota-password-0000000" ap_password: "check-ap-passwd0" EOF - for board in cyd guition; do - file=$([[ $board == cyd ]] && echo home-like-2432s028.yaml || echo guition-4848s040.yaml) + for board in cyd guition elecrow; do + case $board in cyd) file=home-like-2432s028.yaml ;; guition) file=guition-4848s040.yaml ;; elecrow) file=elecrow-crowpanel7.yaml ;; esac cp "$ROOT/$file" "$config/check-$board.yaml" || return 1 if ! grep -q '^captive_portal:' "$config/check-$board.yaml" || ! grep -q '^ ap:' "$config/check-$board.yaml"; then echo "$file has no captive_portal: or wifi ap: any more, unlike the YAML users get; the flash figures would read low." @@ -186,16 +186,16 @@ EOF echo "Check profiles in $config" } -compile_board() { # compile_board cyd|guition +compile_board() { # compile_board cyd|guition|elecrow local board=$1 cd "$WORK/config" || return 1 "${ESPHOME_CMD[@]}" -s DEVICE_NAME "check-$board" -s DEVICE_FRIENDLY_NAME "Check $board" compile "check-$board.yaml" || return 1 flash_report "$board" } -# flash_report BOARD [budget]: the image against its update slot, both read from the build, and on the CYD the growth -# against --baseline and the budget of docs/RELEASING.md step 2. Exit 3 means over 90 %: it passes, but the release has -# to say why. +# flash_report BOARD [budget]: the image against its update slot, both read from the build, and on the 4 MB boards (the +# CYD, the Elecrow) the growth against --baseline (the CYD only) and the budget of docs/RELEASING.md step 2. Exit 3 means +# over 90 %: it passes, but the release has to say why. flash_report() { local board=$1 mode=${2:-} status=0 out="$WORK/flash-$1.txt" against="" [[ $board == cyd ]] && against=$baseline @@ -251,6 +251,7 @@ EOF } cyd_budget() { flash_report cyd budget; } +elecrow_budget() { flash_report elecrow budget; } # ---- Run ---- @@ -282,6 +283,8 @@ if ((want_firmware)); then run "Firmware: CYD" compile_board cyd if ((last_ok)); then run "CYD flash budget" cyd_budget; else skip "CYD flash budget" "no CYD build"; fi run "Firmware: Guition" compile_board guition + run "Firmware: Elecrow" compile_board elecrow + if ((last_ok)); then run "Elecrow flash budget" elecrow_budget; else skip "Elecrow flash budget" "no Elecrow build"; fi else skip "Firmware builds" "ESPHome or the check profiles are missing" fi diff --git a/tools/i18n.py b/tools/i18n.py index 51b76a3..33f11df 100644 --- a/tools/i18n.py +++ b/tools/i18n.py @@ -200,7 +200,7 @@ LINT_KEEP = { 'None', 'Auto', 'Wh', # Placeholders of the YAML tree that the runtime tiles replace before a screen shows them, and profile defaults. 'Lamp', 'Plug', 'Evening', 'All off', 'AC', 'Vacuum', 'Tile 7', 'Tile 8', 'Tile 9', 'Tile 10', 'Light', 'Light Color', - 'Climate', 'Example lamp', 'My CYD', 'My Guition', + 'Climate', 'Example lamp', 'My CYD', 'My Guition', 'My CrowPanel', } LINT_FILES = ('components/smart_display/*.h', 'packages/core.yaml', 'packages/boards/*.yaml') diff --git a/tools/profiles.py b/tools/profiles.py index ac350a9..445248f 100644 --- a/tools/profiles.py +++ b/tools/profiles.py @@ -1,7 +1,8 @@ """The board profiles as the tests and tools read them (app 0.2.84+). A screen is three files: an entry (`home-like-2432s028.yaml` or `packages/cyd.yaml` for a CYD, `guition-4848s040.yaml` -or `packages/guition.yaml` for a Guition), `packages/core.yaml` that every board shares, and the board's own file under +or `packages/guition.yaml` for a Guition, `elecrow-crowpanel7.yaml` or `packages/elecrow.yaml` for an Elecrow CrowPanel 7.0"), +`packages/core.yaml` that every board shares, and the board's own file under `packages/boards/`. `text(name)` is the three of them one after the other, so a check that looks for a line finds it wherever it lives; `resolved(name)` also fills in the `${NAME}` substitutions from the three files (the sizes, the fonts and the hooks with the board's code), for a check that needs the numbers or the whole lambda. Neither is what ESPHome @@ -15,12 +16,13 @@ import yaml ROOT = Path(__file__).resolve().parents[1] CORE = ROOT / 'packages/core.yaml' -BOARDS = {'cyd': ROOT / 'packages/boards/cyd-2432s028.yaml', 'guition': ROOT / 'packages/boards/guition-4848s040.yaml'} -ENTRIES = {'home-like-2432s028.yaml': 'cyd', 'guition-4848s040.yaml': 'guition', - 'packages/cyd.yaml': 'cyd', 'packages/guition.yaml': 'guition'} -# The names the four entry files are known by, in the order the older tests listed them. -PROFILES = ('home-like-2432s028.yaml', 'guition-4848s040.yaml') -PACKAGES = ('packages/cyd.yaml', 'packages/guition.yaml') +BOARDS = {'cyd': ROOT / 'packages/boards/cyd-2432s028.yaml', 'guition': ROOT / 'packages/boards/guition-4848s040.yaml', + 'elecrow': ROOT / 'packages/boards/elecrow-crowpanel7.yaml'} +ENTRIES = {'home-like-2432s028.yaml': 'cyd', 'guition-4848s040.yaml': 'guition', 'elecrow-crowpanel7.yaml': 'elecrow', + 'packages/cyd.yaml': 'cyd', 'packages/guition.yaml': 'guition', 'packages/elecrow.yaml': 'elecrow'} +# The names the six entry files are known by, in the order the older tests listed them. +PROFILES = ('home-like-2432s028.yaml', 'guition-4848s040.yaml', 'elecrow-crowpanel7.yaml') +PACKAGES = ('packages/cyd.yaml', 'packages/guition.yaml', 'packages/elecrow.yaml') NAMES = PROFILES + PACKAGES diff --git a/tools/render_topbar.py b/tools/render_topbar.py index 93be521..4e9c3b2 100644 --- a/tools/render_topbar.py +++ b/tools/render_topbar.py @@ -20,14 +20,16 @@ from pathlib import Path ROOT = Path(__file__).resolve().parents[1] WORK = ROOT / '.esphome' / 'render-topbar' -PROFILES = {'guition': 'guition-4848s040.yaml', 'cyd': 'home-like-2432s028.yaml'} +PROFILES = {'guition': 'guition-4848s040.yaml', 'cyd': 'home-like-2432s028.yaml', 'elecrow': 'elecrow-crowpanel7.yaml'} sys.path.insert(0, str(ROOT / 'tools')) import profiles # noqa: E402 FONTS = ('headline', 'time_label', 'sublabel_big', 'label', 'materialdesign_icons', 'materialdesign_icons_mini') # Hardware headers the host cannot compile; the top bar needs none of them. SKIP = {'guition_diagnostics.h', '__pycache__'} -# Header band per board: page width and height above the tiles. -BANDS = {'guition': (480, 72), 'cyd': (320, 40)} +# Header band per board: page width and height above the tiles. The Elecrow's bar is the Guition's across 800 px +# (the same fonts and insets), so it renders with the Guition's fonts. +BANDS = {'guition': (480, 72), 'cyd': (320, 40), 'elecrow': (800, 72)} +LARGE = ('guition', 'elecrow') # (slug, title, items) with items as C++ expressions of the render lambda's helpers. SCENARIOS = ( @@ -56,8 +58,8 @@ def font_blocks(board): def band(board, y): width, height = BANDS[board] - margin, top = (16, 22) if board == 'guition' else (11, 14) - tile_y, tile_w, tile_h, col2, radius = (72, 218, 108, 246, 22) if board == 'guition' else (40, 147, 52, 164, 18) + margin, top = (16, 22) if board in LARGE else (11, 14) + tile_y, tile_w, tile_h, col2, radius = {'guition': (72, 218, 108, 246, 22), 'elecrow': (72, 378, 108, 406, 22), 'cyd': (40, 147, 52, 164, 18)}[board] return f''' - obj: id: {board}_page x: 0 @@ -85,7 +87,7 @@ def band(board, y): text: "" text_font: time_label_{board} - obj: - x: {margin if board == 'guition' else 9} + x: {margin if board in LARGE else 9} y: {tile_y} width: {tile_w} height: {tile_h} @@ -128,6 +130,7 @@ struct Board {{ const char *name; lv_obj_t *page, *room, *time; const lv_font_t std::vector boards = {{ {{"guition", id(guition_page), id(guition_room), id(guition_time), id(sublabel_big_guition)->get_lv_font(), id(materialdesign_icons_mini_guition)->get_lv_font()}}, {{"cyd", id(cyd_page), id(cyd_room), id(cyd_time), id(sublabel_big_cyd)->get_lv_font(), id(materialdesign_icons_mini_cyd)->get_lv_font()}}, + {{"elecrow", id(elecrow_page), id(elecrow_room), id(elecrow_time), id(sublabel_big_guition)->get_lv_font(), id(materialdesign_icons_mini_guition)->get_lv_font()}}, }}; for (auto &scenario : scenarios) {{ for (auto &board : boards) {{ @@ -200,8 +203,8 @@ display: - platform: sdl id: sdl_display dimensions: - width: 480 - height: 480 + width: 800 + height: 540 auto_clear_enabled: false update_interval: never @@ -227,7 +230,7 @@ lvgl: points: - 0, 0 - 1, 1 -{band('guition', 0)}{band('cyd', 220)} +{band('guition', 0)}{band('cyd', 220)}{band('elecrow', 340).replace('headline_elecrow', 'headline_guition').replace('time_label_elecrow', 'time_label_guition')} script: - id: action_seed then: @@ -254,15 +257,18 @@ def crop_scale(image, width, height, scale): return bytes(out) def sheet(out): - """Header bands of every scenario: Guition 2x above CYD 3x, 12 px white between.""" + """Header bands of every scenario: Guition 2x above CYD 3x above the Elecrow 1x, 12 px white between.""" width, gap = 960, 12 rows = [] for slug, _, _ in SCENARIOS: - for board, scale in (('guition', 2), ('cyd', 3)): + for board, scale in (('guition', 2), ('cyd', 3), ('elecrow', 1)): image = read_ppm(out / f'{slug}-{board}.ppm') band_w, band_h = BANDS[board] png(out / f'{slug}-{board}.png', image[0], image[1], image[2]) - rows.append((crop_scale(image, band_w, band_h, scale), band_h * scale)) + band = crop_scale(image, band_w, band_h, scale) + # A band narrower than the sheet (the Elecrow's 800) gets white at its right. + pad = bytes([255]) * (width - band_w * scale) * 3 + rows.append((b''.join(band[y * band_w * scale * 3:(y + 1) * band_w * scale * 3] + pad for y in range(band_h * scale)), band_h * scale)) rows.append((bytes([255]) * width * 3 * gap * 2, gap * 2)) height = sum(h for _, h in rows) png(out / 'sheet.png', width, height, b''.join(data for data, _ in rows)) diff --git a/web/src/components/DevicePage.vue b/web/src/components/DevicePage.vue index a3e57f7..ed12580 100644 --- a/web/src/components/DevicePage.vue +++ b/web/src/components/DevicePage.vue @@ -3,7 +3,7 @@ import { computed } from "vue"; import { t } from "../i18n"; import { cellsOf, pageOf, sizeOf, SLOTS_PER_PAGE, spanOf } from "../model/layout"; -import { isGuition, openBar, removePage, state } from "../store"; +import { isGuition, isWideScreen, openBar, removePage, state } from "../store"; import type { Tile } from "../types"; import TileCard from "./TileCard.vue"; import TopbarSvg from "./TopbarSvg.vue"; @@ -29,7 +29,7 @@ function pickCell(slot: number) { {{ filled }} / {{ SLOTS_PER_PAGE }} -
+
diff --git a/web/src/components/InstallerView.vue b/web/src/components/InstallerView.vue index 9ff95b7..2ab5c80 100644 --- a/web/src/components/InstallerView.vue +++ b/web/src/components/InstallerView.vue @@ -189,6 +189,7 @@ onBeforeUnmount(() => clearInterval(poll));
+
diff --git a/web/src/components/LayoutView.vue b/web/src/components/LayoutView.vue index 2494179..9dfc363 100644 --- a/web/src/components/LayoutView.vue +++ b/web/src/components/LayoutView.vue @@ -3,7 +3,7 @@ import { computed } from "vue"; import { t } from "../i18n"; import { entriesOf, hasGaps, MAX_PAGES, pageCount } from "../model/layout"; -import { addPage, closeInspector, currentScreen, pageReachWarning, pagesShown, state, supports, tileLimit } from "../store"; +import { addPage, closeInspector, currentScreen, isGuition, isWideScreen, pageReachWarning, pagesShown, state, supports, tileLimit } from "../store"; import DevicePage from "./DevicePage.vue"; import Library from "./Library.vue"; @@ -37,7 +37,7 @@ function onCanvasClick(e: MouseEvent) {
{{ t("editor.page.label", { page: shown + 1 }) }}
-
+
{{ canAdd ? t("editor.layout.add_page") : t("editor.layout.max_pages", MAX_PAGES) }}
diff --git a/web/src/model/topbar.ts b/web/src/model/topbar.ts index 1f7e43f..e944490 100644 --- a/web/src/model/topbar.ts +++ b/web/src/model/topbar.ts @@ -50,6 +50,8 @@ export function agoText(then: number, now = Math.floor(Date.now() / 1000), local export type BarMetrics = { width: number; top: number; name: number; text: number; icon: number }; export const BAR_METRICS: Record = { guition: { width: 448, top: 36, name: 27, text: 21, icon: 26 }, + // The Elecrow CrowPanel 7.0" (app 0.2.93): the Guition's bar across 800 px, the same insets and fonts. + elecrow: { width: 768, top: 36, name: 27, text: 21, icon: 26 }, cyd: { width: 298, top: 24, name: 18, text: 14, icon: 18 }, }; export type ItemView = { icon?: string | null; text?: string; color?: string | null; shown: boolean; analog?: boolean; loading?: boolean }; diff --git a/web/src/store.ts b/web/src/store.ts index 46be950..76be67e 100644 --- a/web/src/store.ts +++ b/web/src/store.ts @@ -86,8 +86,12 @@ export const pageTilesRepeat = computed(() => { return typeof repeat === "boolean" ? repeat : supports(0, 2, 65); }); export const repeatable = (id: string) => pageTilesRepeat.value && pageTarget(id) > 0; -export const isGuition = computed(() => currentScreen.value?.board === "guition"); -export const barMetrics = computed(() => BAR_METRICS[isGuition.value ? "guition" : "cyd"]); +// The large boards (app 0.2.93): a Guition or an Elecrow CrowPanel 7.0", the ones that draw camera images and album +// covers and take the large cards; `isGuition` keeps its name where it means that. The CYD is the small one. +export const LARGE_BOARDS = ["guition", "elecrow"]; +export const isGuition = computed(() => LARGE_BOARDS.includes(currentScreen.value?.board ?? "")); +export const isWideScreen = computed(() => currentScreen.value?.board === "elecrow"); +export const barMetrics = computed(() => BAR_METRICS[currentScreen.value?.board ?? ""] ?? BAR_METRICS.cyd); export const currentTile = computed(() => state.selectedTile && state.layout?.tiles.includes(state.selectedTile) ? state.selectedTile : undefined); // The reactive copy and the plain object are the same tile. diff --git a/web/src/styles/app.css b/web/src/styles/app.css index cb68224..f839301 100644 --- a/web/src/styles/app.css +++ b/web/src/styles/app.css @@ -137,6 +137,7 @@ a:hover { text-decoration: underline; } /* The device mock keeps the Guition light palette on purpose: it is the screen, not the page. */ .device { background: #e7e7e7; border-radius: 18px; padding: 10px; display: grid; grid-template-rows: auto minmax(0, 1fr); gap: 8px; color: #1b1b1b; aspect-ratio: 1 / 1; } .device.cyd { aspect-ratio: 4 / 3; } +.device.wide { aspect-ratio: 5 / 3; } .bar-wrap { cursor: pointer; border-radius: 8px; padding: 0 2px; } .bar-wrap:hover { background: #dedede; } .bar-wrap.selected { outline: 2px solid var(--accent); outline-offset: 1px; } diff --git a/web/tests/components.spec.ts b/web/tests/components.spec.ts index 014da98..e08b8da 100644 --- a/web/tests/components.spec.ts +++ b/web/tests/components.spec.ts @@ -237,6 +237,11 @@ describe("TileInspector: a live picture on a camera tile (app 0.2.91)", () => { Object.assign(state.inventory.screens[0], { board: "guition" }); tile.options = { size: "full" }; expect(choices(mount(TileInspector, { props: { tile } }), "Display")).toEqual(["Name and status", "Large value"]); + // An Elecrow CrowPanel 7.0" (app 0.2.93) is a large board like the Guition: the cover is on offer again. + Object.assign(state.inventory.screens[0], { board: "elecrow" }); + tile.options = { size: "single" }; + expect(choices(mount(TileInspector, { props: { tile } }), "Display")).toContain("Album cover"); + Object.assign(state.inventory.screens[0], { board: "guition" }); }); });