41 files
This commit is contained in:
1 parent
9ea95c3a46
commit
2bc77c43ce
41 files changed
+22649
No files matched your search
@@ -10,6 +10,10 @@
|
||||
!**/.??*.yml
|
||||
!*.md
|
||||
!**/.??*.md
|
||||
!*.json
|
||||
!**/.??*.json
|
||||
!*.js
|
||||
!**/.??*.js
|
||||
|
||||
# Track specific .storage configuration files
|
||||
!.storage/lovelace
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"enable_auto_backup": true,
|
||||
"auto_backup_throttle_minutes": 0,
|
||||
"auto_backup_retain_per_entity": 100,
|
||||
"auto_backup_dir": "",
|
||||
"auto_backup_calendar_lookahead_days": 7,
|
||||
"enable_snapshot_delete": false,
|
||||
"snapshot_delete_min_age_days": 7
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"enable_tool_search": false,
|
||||
"tool_search_max_results": 10
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "Dishwasher",
|
||||
"device_id": 150633095332665,
|
||||
"type": 225,
|
||||
"protocol": 3,
|
||||
"ip_address": "192.168.1.83",
|
||||
"port": 6444,
|
||||
"model": "7600004A",
|
||||
"subtype": 3,
|
||||
"token": "2a146cafc4951b1317096d6dfd3bde6bc32aad40cdb9d60d51dcc99f8abbab4ed75331e2bc4e3dfb3664b4cf68b0b5c60ee4453bbe1d48619cc60c3483229395",
|
||||
"key": "0725ef104dbe450e83d0abaa3701f112d7771d10a9cb4306bc086718be8e684d"
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"aliases": [
|
||||
"Google Nest Mini"
|
||||
],
|
||||
"calculation_enabled_condition": "{{ is_state('[[entity]]', 'playing') }}",
|
||||
"calculation_strategy": "linear",
|
||||
"created_at": "2022-10-05T10:14:54Z",
|
||||
"device_type": "smart_speaker",
|
||||
"linear_config": {
|
||||
"calibrate": [
|
||||
"0 -> 2.01",
|
||||
"10 -> 2.01",
|
||||
"20 -> 2.04",
|
||||
"30 -> 2.10",
|
||||
"40 -> 2.26",
|
||||
"50 -> 2.49",
|
||||
"60 -> 2.83",
|
||||
"70 -> 3.13",
|
||||
"80 -> 3.37",
|
||||
"90 -> 3.50",
|
||||
"100 -> 3.66"
|
||||
]
|
||||
},
|
||||
"measure_description": "Streamed 'Radiohead - National Anthem' using spotify, and took average measurements using the measure.py tool on different volume levels",
|
||||
"measure_device": "Shelly Plug S",
|
||||
"measure_method": "manual",
|
||||
"name": "Nest Mini",
|
||||
"standby_power": 1.65,
|
||||
"author_info": {
|
||||
"name": "Daniel O'Connor",
|
||||
"email": "daniel.oconnor@gmail.com",
|
||||
"github": "CloCkWeRX"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"aliases": [
|
||||
"TRADFRI bulb GU10 WS 345lm",
|
||||
"TRADFRIbulbGU10WS345lm"
|
||||
],
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2022-01-28T15:48:57Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script",
|
||||
"measure_device": "Shelly Plug S",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 3,
|
||||
"SLEEP_TIME": 6,
|
||||
"VERSION": "master"
|
||||
},
|
||||
"name": "TRADFRI bulb GU10 345 lumen, dimmable, white spectrum",
|
||||
"standby_power": 0.2,
|
||||
"author_info": {
|
||||
"name": "giu889",
|
||||
"github": "giu889"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"aliases": [
|
||||
"TRADFRI bulb GU10 WW 345lm"
|
||||
],
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2025-12-22T22:20:22Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script. Used 40W incandescent bulb as dummy load.",
|
||||
"measure_device": "Shelly 1PM Mini",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 2,
|
||||
"SLEEP_TIME": 3,
|
||||
"VERSION": "v1.19.5:docker"
|
||||
},
|
||||
"name": "TRADFRI bulb GU10 WW 345lm",
|
||||
"standby_power": 0.1,
|
||||
"author_info": {
|
||||
"name": "Peklaa",
|
||||
"github": "Peklaa"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2024-04-12T08:07:57Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script",
|
||||
"measure_device": "TP-Link Tapo P110",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 4,
|
||||
"SLEEP_TIME": 5,
|
||||
"VERSION": "v1.10.0:docker"
|
||||
},
|
||||
"name": "TRADFRI bulb GU10 WS 345 lm, dimmable, white spectrum",
|
||||
"standby_power": 0.2,
|
||||
"author_info": {
|
||||
"name": "martinkura-svk",
|
||||
"github": "martinkura-svk"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"manufacturers":[{"aliases":[],"name":"robb","full_name":"ROBB","dir_name":"robb","models":[{"calculation_strategy":"fixed","created_at":"2024-05-07T20:30:00Z","device_type":"smart_switch","measure_device":"Brennenstuhl PM 231 E","measure_method":"manual","name":"Zigbee Smart Plug","only_self_usage":true,"standby_power":0.2,"standby_power_on":0.65,"author_info":{"name":"Tim van Werkhoven","email":"tim+github.com@vanwerkhoven.org","github":"tvwerkhoven"},"id":"ROB_200-017-0","manufacturer":"robb","updated_at":"2026-07-10T07:54:55","max_power":0.65,"sub_profile_count":0,"hash":"befb8d28daf4363545e1dee969f43a64"}],"device_types":["smart_switch"]},{"aliases":[],"name":"teckin","full_name":"Teckin","dir_name":"teckin","models":[{"calculation_strategy":"lut","created_at":"2022-11-10T19:42:22Z","device_type":"light","measure_device":"Shelly 1PM","measure_method":"script","measure_settings":{"SAMPLE_COUNT":2,"SLEEP_TIME":3,"VERSION":"v1.0.3:docker"},"name":"Smart Wi-Fi RGB LED Light Bulb","standby_power":0.81,"author_info":{"name":"gary-oneill82","github":"gary-oneill82"},"id":"SB50","manufacturer":"teckin","updated_at":"2026-07-18T07:09:16","max_power":9.06,"sub_profile_count":0,"color_modes":["hs","color_temp"],"hash":"1b4187e43d0d3a5b996952de74a8e4d5"}],"device_types":["light"]},{"aliases":[],"name":"zemismart","full_name":"Zemismart","dir_name":"zemismart","models":[{"calculation_strategy":"lut","created_at":"2022-11-30T17:57:54Z","device_type":"light","measure_device":"Shelly 1PM","measure_method":"script","measure_settings":{"SAMPLE_COUNT":2,"SLEEP_TIME":3,"VERSION":"v1.1.2:docker"},"name":"Moonlamp (esphome)","standby_power":0.5,"author_info":{"name":"Kenneth Fribert","email":"fribse@gmail.com","github":"fribse"},"id":"moonlamp","manufacturer":"zemismart","updated_at":"2026-07-18T07:09:16","max_power":2.8,"sub_profile_count":0,"color_modes":["hs","color_temp"],"hash":"116009ce0b7b4777372b5a5bd7cfb02d"}],"device_types":["light"]},{"aliases":[],"name":"dygsm","full_name":"DYGSM","dir_name":"dygsm","models":[{"calculation_strategy":"fixed","created_at":"2024-12-27T12:00:00Z","device_type":"network","discovery_by":"device","measure_device":"Shelly Plus Plug S","measure_method":"script","name":"Gas sensor","author_info":{"name":"Andrzej Dopierała","email":"andrzej.dopierala@currency-one.com","github":"theundefined"},"id":"DY-RQ500A","manufacturer":"dygsm","updated_at":"2026-07-10T07:54:55","max_power":0.88,"sub_profile_count":0,"hash":"50930380a813300952c8156253299cdb"}],"device_types":["network"]},{"aliases":["Fibargroup"],"name":"fibaro","full_name":"Fibaro","dir_name":"fibaro","models":[{"calculation_strategy":"fixed","created_at":"2022-09-06T08:26:19Z","device_type":"smart_switch","measure_device":"Fibaro FGWP102","measure_method":"manual","name":"Wall Plug (Z-Wave Plus)","only_self_usage":true,"standby_power":0.3,"standby_power_on":0.8,"author_info":{"name":"Bram Gerritsen","email":"bgerritsen@gmail.com","github":"bramstroker"},"id":"FGWP102","manufacturer":"fibaro","updated_at":"2026-07-10T07:54:55","max_power":0.8,"sub_profile_count":0,"hash":"6942f60b1084479da62f18ebf1a2c3f8"}],"device_types":["smart_switch"]},{"aliases":["ID-RF"],"name":"nodon","full_name":"NodOn","dir_name":"nodon","models":[{"aliases":["MSP-3-1-X1"],"calculation_strategy":"fixed","created_at":"2022-10-04T18:58:32Z","device_type":"smart_switch","measure_device":"Zhurui PR10","measure_method":"manual","name":"Micro Smart Plug","only_self_usage":true,"standby_power":0.67,"standby_power_on":0.96,"author_info":{"name":"Bram Gerritsen","email":"bgerritsen@gmail.com","github":"bramstroker"},"id":"Micro Smart Plug","manufacturer":"nodon","updated_at":"2026-07-10T07:54:55","max_power":0.96,"sub_profile_count":0,"hash":"8139528c7ccef57e38f8b7b729e4c972"}],"device_types":["smart_switch"]},{"aliases":[],"name":"innr","full_name":"Innr","dir_name":"innr","models":[{"calculation_strategy":"lut","created_at":"2026-01-13T13:30:33Z","device_type":"light","measure_device":"Shelly PM Mini Gen3","measure_method":"script","measure_settings":{"SAMPLE_COUNT":2,"SLEEP_TIME":3,"VERSION":"v1.20.2:docker"},"name":"Smart Candle Comfort E14","standby_power":0.38,"author_info":{"name":"Dominik Sander","email":"git@dsander.de","github":"dsander"},"id":"RB 248 T","manufacturer":"innr","updated_at":"2026-07-18T07:09:16","max_power":5.4,"sub_profile_count":0,"color_modes":["color_temp"],"hash":"e7a9eb50d6b96dc5e33f0be5fe5b359b"},{"calculation_strategy":"lut","created_at":"2021-10-25T17:16:55Z","device_type":"light","measure_device":"Shelly 1PM","measure_method":"script","measure_settings":{"SAMPLE_COUNT":4,"SLEEP_TIME":2},"name":"Smart Bulb Colour E27 806lm","standby_power":0.4,"author_info":{"name":"geelenbert","email":"mail2bert@gmail.com","github":"geelenbert"},"id":"RB 285 C","manufacturer":"innr","updated_at":"2026-07-18T07:09:16","max_power":9.37,"sub_profile_count":0,"color_modes":["hs","color_temp"],"hash":"37dcbc2dedc3c44fbcd1312270ac270a"},{"calculation_stLine truncated
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2025-10-28T04:32:28Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script",
|
||||
"measure_device": "Shelly Plus Plug S",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 4,
|
||||
"SLEEP_TIME": 3,
|
||||
"VERSION": "v1.17.24:docker"
|
||||
},
|
||||
"name": "Smart Bulb A80 E27 922-65 RGB (type SHRGB, model 8719514554634, 18.5 W, 220-240 V, 50/60 Hz, 2452 lm @ 4000K, CRI: 90, beam angle: 360°)",
|
||||
"standby_power": 0.31,
|
||||
"author_info": {
|
||||
"name": "schuppan",
|
||||
"github": "schuppan"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"aliases": [
|
||||
"SHRGB"
|
||||
],
|
||||
"calculation_strategy": "lut",
|
||||
"created_at": "2025-11-08T06:11:27Z",
|
||||
"device_type": "light",
|
||||
"measure_description": "Measured with utils/measure script",
|
||||
"measure_device": "Shelly 2.5",
|
||||
"measure_method": "script",
|
||||
"measure_settings": {
|
||||
"SAMPLE_COUNT": 2,
|
||||
"SLEEP_TIME": 3,
|
||||
"VERSION": "v1.17.24:docker"
|
||||
},
|
||||
"name": "3.5 inch recessed downlight 8W",
|
||||
"standby_power": 0.2,
|
||||
"author_info": {
|
||||
"name": "Mike Debney",
|
||||
"email": "mike.debney@outlook.com",
|
||||
"github": "mike-debney"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,347 @@
|
||||
{
|
||||
"version": 1,
|
||||
"minor_version": 1,
|
||||
"key": "thermostat_timeline.json",
|
||||
"data": {
|
||||
"instances": {
|
||||
"default": {
|
||||
"schedules": {
|
||||
"climate.vt_basement": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.climate_scheduler_climate_schedule_living_room": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [
|
||||
{
|
||||
"id": "7ky0uyr",
|
||||
"startMin": 690,
|
||||
"endMin": 971,
|
||||
"temp": 21
|
||||
}
|
||||
],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.basement": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.living_room_living_room": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
}
|
||||
},
|
||||
"weekdays": {},
|
||||
"profiles": {
|
||||
"climate.vt_basement": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.climate_scheduler_climate_schedule_living_room": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.basement": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.living_room_living_room": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"entities": [
|
||||
"climate.basement",
|
||||
"climate.living_room_living_room"
|
||||
],
|
||||
"room_use_input_number": [
|
||||
false,
|
||||
false
|
||||
],
|
||||
"room_use_temp_sensor": [
|
||||
false,
|
||||
false
|
||||
],
|
||||
"time_12h": true,
|
||||
"temp_unit": "C",
|
||||
"storage_temp_unit": "C",
|
||||
"time_source": "browser",
|
||||
"row_height": 64,
|
||||
"default_temp": 20,
|
||||
"min_temp": 5,
|
||||
"max_temp": 25,
|
||||
"weekdays_enabled": false,
|
||||
"seasonal_enabled": false,
|
||||
"seasonal_mode": "winter",
|
||||
"weekdays_mode": "weekday_weekend",
|
||||
"weekdays_view": "all_rooms_one_day",
|
||||
"weekdays_view_switch_in_timeline": false,
|
||||
"weekdays_selected_room": "",
|
||||
"per_room_defaults": false,
|
||||
"away": {
|
||||
"enabled": false,
|
||||
"persons": [],
|
||||
"target_c": 17,
|
||||
"advanced_enabled": false,
|
||||
"combos": {},
|
||||
"delay_enabled": false,
|
||||
"delay_value": 0,
|
||||
"delay_unit": "minutes"
|
||||
},
|
||||
"away_bypass": false,
|
||||
"merges": {},
|
||||
"labels": {},
|
||||
"temp_sensors": {},
|
||||
"turn_on": {},
|
||||
"presence_sensor_enabled": false,
|
||||
"presence_live_header": true,
|
||||
"presence_sensors": {},
|
||||
"presence_sensor_temps": {},
|
||||
"presence_sensor_delays": {},
|
||||
"presence_sensor_delay_units": {
|
||||
"climate.basement": "minutes",
|
||||
"climate.living_room_living_room": "minutes"
|
||||
},
|
||||
"show_pause_button": true,
|
||||
"pause_sensor_enabled": false,
|
||||
"pause_sensor_entity": "",
|
||||
"pause_indef": true,
|
||||
"pause_until_ms": 0,
|
||||
"boiler_switch": "",
|
||||
"boiler_switch_domain": "switch",
|
||||
"boiler_rooms": null,
|
||||
"boiler_on_offset": 0,
|
||||
"boiler_off_offset": 0,
|
||||
"boiler_temp_sensor": "",
|
||||
"boiler_min_temp": 20,
|
||||
"boiler_max_temp": 25,
|
||||
"boiler_multi_enabled": false,
|
||||
"boiler_room_settings": {},
|
||||
"show_room_temp": true,
|
||||
"auto_apply_enabled": true,
|
||||
"apply_on_edit": true,
|
||||
"apply_on_default_change": true,
|
||||
"backup_auto_enabled": false,
|
||||
"backup_interval_days": 1,
|
||||
"profiles_enabled": false,
|
||||
"global_profile": null,
|
||||
"sync_mode": "instant",
|
||||
"sync_delay_min": 5,
|
||||
"sync_delay_sec": 300,
|
||||
"color_ranges": {},
|
||||
"color_global": false,
|
||||
"boiler_enabled": false,
|
||||
"holidays_source": "calendar",
|
||||
"holidays_entity": "",
|
||||
"holidays_dates": [],
|
||||
"holidays_groups": [],
|
||||
"open_window": {
|
||||
"enabled": false,
|
||||
"open_delay_min": 2,
|
||||
"close_delay_min": 5,
|
||||
"sensors": {}
|
||||
}
|
||||
},
|
||||
"colors": {
|
||||
"color_ranges": {},
|
||||
"color_global": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"active_instance_id": "default",
|
||||
"schedules": {
|
||||
"climate.vt_basement": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.climate_scheduler_climate_schedule_living_room": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [
|
||||
{
|
||||
"id": "7ky0uyr",
|
||||
"startMin": 690,
|
||||
"endMin": 971,
|
||||
"temp": 21
|
||||
}
|
||||
],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.basement": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
},
|
||||
"climate.living_room_living_room": {
|
||||
"defaultTemp": 20,
|
||||
"blocks": [],
|
||||
"profiles": {},
|
||||
"activeProfile": null,
|
||||
"holiday": {
|
||||
"blocks": []
|
||||
},
|
||||
"presence": {}
|
||||
}
|
||||
},
|
||||
"weekdays": {},
|
||||
"profiles": {
|
||||
"climate.vt_basement": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.climate_scheduler_climate_schedule_living_room": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.basement": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
},
|
||||
"climate.living_room_living_room": {
|
||||
"profiles": {},
|
||||
"activeProfile": null
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"entities": [
|
||||
"climate.basement",
|
||||
"climate.living_room_living_room"
|
||||
],
|
||||
"room_use_input_number": [
|
||||
false,
|
||||
false
|
||||
],
|
||||
"room_use_temp_sensor": [
|
||||
false,
|
||||
false
|
||||
],
|
||||
"time_12h": true,
|
||||
"temp_unit": "C",
|
||||
"storage_temp_unit": "C",
|
||||
"time_source": "browser",
|
||||
"row_height": 64,
|
||||
"default_temp": 20,
|
||||
"min_temp": 5,
|
||||
"max_temp": 25,
|
||||
"weekdays_enabled": false,
|
||||
"seasonal_enabled": false,
|
||||
"seasonal_mode": "winter",
|
||||
"weekdays_mode": "weekday_weekend",
|
||||
"weekdays_view": "all_rooms_one_day",
|
||||
"weekdays_view_switch_in_timeline": false,
|
||||
"weekdays_selected_room": "",
|
||||
"per_room_defaults": false,
|
||||
"away": {
|
||||
"enabled": false,
|
||||
"persons": [],
|
||||
"target_c": 17,
|
||||
"advanced_enabled": false,
|
||||
"combos": {},
|
||||
"delay_enabled": false,
|
||||
"delay_value": 0,
|
||||
"delay_unit": "minutes"
|
||||
},
|
||||
"away_bypass": false,
|
||||
"merges": {},
|
||||
"labels": {},
|
||||
"temp_sensors": {},
|
||||
"turn_on": {},
|
||||
"presence_sensor_enabled": false,
|
||||
"presence_live_header": true,
|
||||
"presence_sensors": {},
|
||||
"presence_sensor_temps": {},
|
||||
"presence_sensor_delays": {},
|
||||
"presence_sensor_delay_units": {
|
||||
"climate.basement": "minutes",
|
||||
"climate.living_room_living_room": "minutes"
|
||||
},
|
||||
"show_pause_button": true,
|
||||
"pause_sensor_enabled": false,
|
||||
"pause_sensor_entity": "",
|
||||
"pause_indef": true,
|
||||
"pause_until_ms": 0,
|
||||
"boiler_switch": "",
|
||||
"boiler_switch_domain": "switch",
|
||||
"boiler_rooms": null,
|
||||
"boiler_on_offset": 0,
|
||||
"boiler_off_offset": 0,
|
||||
"boiler_temp_sensor": "",
|
||||
"boiler_min_temp": 20,
|
||||
"boiler_max_temp": 25,
|
||||
"boiler_multi_enabled": false,
|
||||
"boiler_room_settings": {},
|
||||
"show_room_temp": true,
|
||||
"auto_apply_enabled": true,
|
||||
"apply_on_edit": true,
|
||||
"apply_on_default_change": true,
|
||||
"backup_auto_enabled": false,
|
||||
"backup_interval_days": 1,
|
||||
"profiles_enabled": false,
|
||||
"global_profile": null,
|
||||
"sync_mode": "instant",
|
||||
"sync_delay_min": 5,
|
||||
"sync_delay_sec": 300,
|
||||
"color_ranges": {},
|
||||
"color_global": false,
|
||||
"boiler_enabled": false,
|
||||
"holidays_source": "calendar",
|
||||
"holidays_entity": "",
|
||||
"holidays_dates": [],
|
||||
"holidays_groups": [],
|
||||
"open_window": {
|
||||
"enabled": false,
|
||||
"open_delay_min": 2,
|
||||
"close_delay_min": 5,
|
||||
"sensors": {}
|
||||
}
|
||||
},
|
||||
"colors": {
|
||||
"color_ranges": {},
|
||||
"color_global": false
|
||||
},
|
||||
"version": 177,
|
||||
"settings_version": 169,
|
||||
"colors_version": 169,
|
||||
"weekday_version": 1,
|
||||
"profile_version": 5
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"domain": "cafe",
|
||||
"name": "C.A.F.E.",
|
||||
"version": "0.7.0",
|
||||
"codeowners": [],
|
||||
"config_flow": true,
|
||||
"dependencies": ["frontend", "http"],
|
||||
"documentation": "https://github.com/FezVrasta/cafe-hass",
|
||||
"documentation_url": "https://github.com/FezVrasta/cafe-hass",
|
||||
"integration_type": "service",
|
||||
"iot_class": "local_push",
|
||||
"issue_tracker": "https://github.com/FezVrasta/cafe-hass/issues",
|
||||
"requirements": []
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"config": {
|
||||
"title": "C.A.F.E.",
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Set up C.A.F.E.",
|
||||
"description": "C.A.F.E. is a visual automation editor for Home Assistant. It allows you to create and manage your automations using a visual flow editor.\n\nClick Submit to add C.A.F.E. to your Home Assistant."
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "C.A.F.E. is already configured"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"config": {
|
||||
"title": "C.A.F.E.",
|
||||
"step": {
|
||||
"user": {
|
||||
"title": "Set up C.A.F.E.",
|
||||
"description": "C.A.F.E. is a visual automation editor for Home Assistant. It allows you to create and manage your automations using a visual flow editor.\n\nClick Submit to add C.A.F.E. to your Home Assistant."
|
||||
}
|
||||
},
|
||||
"abort": {
|
||||
"already_configured": "C.A.F.E. is already configured"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,573 @@
|
||||
var hCn=Object.defineProperty;var pCn=(n,i,s)=>i in n?hCn(n,i,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[i]=s;var Zf=(n,i,s)=>pCn(n,typeof i!="symbol"?i+"":i,s);function gCn(n,i){for(var s=0;s<i.length;s++){const c=i[s];if(typeof c!="string"&&!Array.isArray(c)){for(const d in c)if(d!=="default"&&!(d in n)){const g=Object.getOwnPropertyDescriptor(c,d);g&&Object.defineProperty(n,d,g.get?g:{enumerable:!0,get:()=>c[d]})}}}return Object.freeze(Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}))}(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))c(d);new MutationObserver(d=>{for(const g of d)if(g.type==="childList")for(const b of g.addedNodes)b.tagName==="LINK"&&b.rel==="modulepreload"&&c(b)}).observe(document,{childList:!0,subtree:!0});function s(d){const g={};return d.integrity&&(g.integrity=d.integrity),d.referrerPolicy&&(g.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?g.credentials="include":d.crossOrigin==="anonymous"?g.credentials="omit":g.credentials="same-origin",g}function c(d){if(d.ep)return;d.ep=!0;const g=s(d);fetch(d.href,g)}})();var C5=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function TR(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Y$t={exports:{}},Nse={},J$t={exports:{}},Os={};/**
|
||||
* @license React
|
||||
* react.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var gz=Symbol.for("react.element"),bCn=Symbol.for("react.portal"),mCn=Symbol.for("react.fragment"),wCn=Symbol.for("react.strict_mode"),yCn=Symbol.for("react.profiler"),vCn=Symbol.for("react.provider"),ECn=Symbol.for("react.context"),SCn=Symbol.for("react.forward_ref"),TCn=Symbol.for("react.suspense"),ACn=Symbol.for("react.memo"),_Cn=Symbol.for("react.lazy"),KLt=Symbol.iterator;function xCn(n){return n===null||typeof n!="object"?null:(n=KLt&&n[KLt]||n["@@iterator"],typeof n=="function"?n:null)}var X$t={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Z$t=Object.assign,Q$t={};function DM(n,i,s){this.props=n,this.context=i,this.refs=Q$t,this.updater=s||X$t}DM.prototype.isReactComponent={};DM.prototype.setState=function(n,i){if(typeof n!="object"&&typeof n!="function"&&n!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,n,i,"setState")};DM.prototype.forceUpdate=function(n){this.updater.enqueueForceUpdate(this,n,"forceUpdate")};function eBt(){}eBt.prototype=DM.prototype;function xLe(n,i,s){this.props=n,this.context=i,this.refs=Q$t,this.updater=s||X$t}var kLe=xLe.prototype=new eBt;kLe.constructor=xLe;Z$t(kLe,DM.prototype);kLe.isPureReactComponent=!0;var YLt=Array.isArray,tBt=Object.prototype.hasOwnProperty,NLe={current:null},nBt={key:!0,ref:!0,__self:!0,__source:!0};function rBt(n,i,s){var c,d={},g=null,b=null;if(i!=null)for(c in i.ref!==void 0&&(b=i.ref),i.key!==void 0&&(g=""+i.key),i)tBt.call(i,c)&&!nBt.hasOwnProperty(c)&&(d[c]=i[c]);var w=arguments.length-2;if(w===1)d.children=s;else if(1<w){for(var E=Array(w),S=0;S<w;S++)E[S]=arguments[S+2];d.children=E}if(n&&n.defaultProps)for(c in w=n.defaultProps,w)d[c]===void 0&&(d[c]=w[c]);return{$$typeof:gz,type:n,key:g,ref:b,props:d,_owner:NLe.current}}function kCn(n,i){return{$$typeof:gz,type:n.type,key:i,ref:n.ref,props:n.props,_owner:n._owner}}function CLe(n){return typeof n=="object"&&n!==null&&n.$$typeof===gz}function NCn(n){var i={"=":"=0",":":"=2"};return"$"+n.replace(/[=:]/g,function(s){return i[s]})}var JLt=/\/+/g;function aCe(n,i){return typeof n=="object"&&n!==null&&n.key!=null?NCn(""+n.key):i.toString(36)}function Fie(n,i,s,c,d){var g=typeof n;(g==="undefined"||g==="boolean")&&(n=null);var b=!1;if(n===null)b=!0;else switch(g){case"string":case"number":b=!0;break;case"object":switch(n.$$typeof){case gz:case bCn:b=!0}}if(b)return b=n,d=d(b),n=c===""?"."+aCe(b,0):c,YLt(d)?(s="",n!=null&&(s=n.replace(JLt,"$&/")+"/"),Fie(d,i,s,"",function(S){return S})):d!=null&&(CLe(d)&&(d=kCn(d,s+(!d.key||b&&b.key===d.key?"":(""+d.key).replace(JLt,"$&/")+"/")+n)),i.push(d)),1;if(b=0,c=c===""?".":c+":",YLt(n))for(var w=0;w<n.length;w++){g=n[w];var E=c+aCe(g,w);b+=Fie(g,i,s,E,d)}else if(E=xCn(n),typeof E=="function")for(n=E.call(n),w=0;!(g=n.next()).done;)g=g.value,E=c+aCe(g,w++),b+=Fie(g,i,s,E,d);else if(g==="object")throw i=String(n),Error("Objects are not valid as a React child (found: "+(i==="[object Object]"?"object with keys {"+Object.keys(n).join(", ")+"}":i)+"). If you meant to render a collection of children, use an array instead.");return b}function Wre(n,i,s){if(n==null)return n;var c=[],d=0;return Fie(n,c,"","",function(g){return i.call(s,g,d++)}),c}function CCn(n){if(n._status===-1){var i=n._result;i=i(),i.then(function(s){(n._status===0||n._status===-1)&&(n._status=1,n._result=s)},function(s){(n._status===0||n._status===-1)&&(n._status=2,n._result=s)}),n._status===-1&&(n._status=0,n._result=i)}if(n._status===1)return n._result.default;throw n._result}var qg={current:null},$ie={transition:null},ICn={ReactCurrentDispatcher:qg,ReactCurrentBatchConfig:$ie,ReactCurrentOwner:NLe};function iBt(){throw Error("act(...) is not supported in production builds of React.")}Os.Children={map:Wre,forEach:function(n,i,s){Wre(n,function(){i.apply(this,arguments)},s)},count:function(n){var i=0;return Wre(n,function(){i++}),i},toArray:function(n){return Wre(n,function(i){return i})||[]},only:function(n){if(!CLe(n))throw Error("React.Children.only expected to receive a single React element child.");return n}};Os.Component=DM;Os.Fragment=mCn;Os.Profiler=yCn;Os.PureComponent=xLe;Os.StrictMode=wCn;Os.Suspense=TCn;Os.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ICn;Os.act=iBt;Os.cloneElement=function(n,i,s){if(n==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+n+".");var c=Z$t({},n.props),d=n.key,g=n.ref,b=n._owner;if(i!=null){if(i.ref!==void 0&&(g=i.ref,b=NLe.current),i.key!==void 0&&(d=""+i.key),n.type&&n.type.defaultProps)var w=n.type.defaultProps;for(E in i)tBt.call(i,E)&&!nBt.hasOwnProperty(E)&&(c[E]=i[E]===void 0&&w!==void 0?w[E]:i[E])}var E=arguments.length-2;if(E===1)c.children=s;else if(1<E){w=Array(E);for(var S=0;S<E;S++)w[S]=arguments[S+2];c.children=w}return{$$typeof:gz,type:n.type,key:d,ref:g,props:c,_owner:b}};Os.createCoLine truncated
|
||||
* @license React
|
||||
* react-jsx-runtime.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var RCn=H,OCn=Symbol.for("react.element"),DCn=Symbol.for("react.fragment"),LCn=Object.prototype.hasOwnProperty,MCn=RCn.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,PCn={key:!0,ref:!0,__self:!0,__source:!0};function oBt(n,i,s){var c,d={},g=null,b=null;s!==void 0&&(g=""+s),i.key!==void 0&&(g=""+i.key),i.ref!==void 0&&(b=i.ref);for(c in i)LCn.call(i,c)&&!PCn.hasOwnProperty(c)&&(d[c]=i[c]);if(n&&n.defaultProps)for(c in i=n.defaultProps,i)d[c]===void 0&&(d[c]=i[c]);return{$$typeof:OCn,type:n,key:g,ref:b,props:d,_owner:MCn.current}}Nse.Fragment=DCn;Nse.jsx=oBt;Nse.jsxs=oBt;Y$t.exports=Nse;var I=Y$t.exports,doe={},sBt={exports:{}},Gm={},aBt={exports:{}},uBt={};/**
|
||||
* @license React
|
||||
* scheduler.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/(function(n){function i(Ae,xe){var We=Ae.length;Ae.push(xe);e:for(;0<We;){var dt=We-1>>>1,Ue=Ae[dt];if(0<d(Ue,xe))Ae[dt]=xe,Ae[We]=Ue,We=dt;else break e}}function s(Ae){return Ae.length===0?null:Ae[0]}function c(Ae){if(Ae.length===0)return null;var xe=Ae[0],We=Ae.pop();if(We!==xe){Ae[0]=We;e:for(var dt=0,Ue=Ae.length,bt=Ue>>>1;dt<bt;){var kt=2*(dt+1)-1,ht=Ae[kt],Xt=kt+1,vt=Ae[Xt];if(0>d(ht,We))Xt<Ue&&0>d(vt,ht)?(Ae[dt]=vt,Ae[Xt]=We,dt=Xt):(Ae[dt]=ht,Ae[kt]=We,dt=kt);else if(Xt<Ue&&0>d(vt,We))Ae[dt]=vt,Ae[Xt]=We,dt=Xt;else break e}}return xe}function d(Ae,xe){var We=Ae.sortIndex-xe.sortIndex;return We!==0?We:Ae.id-xe.id}if(typeof performance=="object"&&typeof performance.now=="function"){var g=performance;n.unstable_now=function(){return g.now()}}else{var b=Date,w=b.now();n.unstable_now=function(){return b.now()-w}}var E=[],S=[],x=1,A=null,C=3,R=!1,L=!1,D=!1,B=typeof setTimeout=="function"?setTimeout:null,$=typeof clearTimeout=="function"?clearTimeout:null,j=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function P(Ae){for(var xe=s(S);xe!==null;){if(xe.callback===null)c(S);else if(xe.startTime<=Ae)c(S),xe.sortIndex=xe.expirationTime,i(E,xe);else break;xe=s(S)}}function G(Ae){if(D=!1,P(Ae),!L)if(s(E)!==null)L=!0,Se(ee);else{var xe=s(S);xe!==null&&Le(G,xe.startTime-Ae)}}function ee(Ae,xe){L=!1,D&&(D=!1,$(ie),ie=-1),R=!0;var We=C;try{for(P(xe),A=s(E);A!==null&&(!(A.expirationTime>xe)||Ae&&!le());){var dt=A.callback;if(typeof dt=="function"){A.callback=null,C=A.priorityLevel;var Ue=dt(A.expirationTime<=xe);xe=n.unstable_now(),typeof Ue=="function"?A.callback=Ue:A===s(E)&&c(E),P(xe)}else c(E);A=s(E)}if(A!==null)var bt=!0;else{var kt=s(S);kt!==null&&Le(G,kt.startTime-xe),bt=!1}return bt}finally{A=null,C=We,R=!1}}var re=!1,Q=null,ie=-1,pe=5,me=-1;function le(){return!(n.unstable_now()-me<pe)}function fe(){if(Q!==null){var Ae=n.unstable_now();me=Ae;var xe=!0;try{xe=Q(!0,Ae)}finally{xe?K():(re=!1,Q=null)}}else re=!1}var K;if(typeof j=="function")K=function(){j(fe)};else if(typeof MessageChannel<"u"){var he=new MessageChannel,Oe=he.port2;he.port1.onmessage=fe,K=function(){Oe.postMessage(null)}}else K=function(){B(fe,0)};function Se(Ae){Q=Ae,re||(re=!0,K())}function Le(Ae,xe){ie=B(function(){Ae(n.unstable_now())},xe)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(Ae){Ae.callback=null},n.unstable_continueExecution=function(){L||R||(L=!0,Se(ee))},n.unstable_forceFrameRate=function(Ae){0>Ae||125<Ae?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):pe=0<Ae?Math.floor(1e3/Ae):5},n.unstable_getCurrentPriorityLevel=function(){return C},n.unstable_getFirstCallbackNode=function(){return s(E)},n.unstable_next=function(Ae){switch(C){case 1:case 2:case 3:var xe=3;break;default:xe=C}var We=C;C=xe;try{return Ae()}finally{C=We}},n.unstable_pauseExecution=function(){},n.unstable_requestPaint=function(){},n.unstable_runWithPriority=function(Ae,xe){switch(Ae){case 1:case 2:case 3:case 4:case 5:break;default:Ae=3}var We=C;C=Ae;try{return xe()}finally{C=We}},n.unstable_scheduleCallback=function(Ae,xe,We){var dt=n.unstable_now();switch(typeof We=="object"&&We!==null?(We=We.delay,We=typeof We=="number"&&0<We?dt+We:dt):We=dt,Ae){case 1:var Ue=-1;break;case 2:Ue=250;break;case 5:Ue=1073741823;break;case 4:Ue=1e4;break;default:Ue=5e3}return Ue=We+Ue,Ae={id:x++,callback:xe,priorityLevel:Ae,startTime:We,expirationTime:Ue,sortIndex:-1},We>dt?(Ae.sortIndex=We,i(S,Ae),s(E)===null&&Ae===s(S)&&(D?($(ie),ie=-1):D=!0,Le(G,We-dt))):(Ae.sortIndex=Ue,i(E,Ae),L||R||(L=!0,Se(ee))),Ae},n.unstable_shouldYield=le,n.unstable_wrapCallback=function(Ae){var xe=C;return function(){var We=C;C=xe;try{return Ae.apply(this,arguments)}finally{C=We}}}})(uBt);aBt.exports=uBt;var jCn=aBt.exports;/**
|
||||
* @license React
|
||||
* react-dom.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var FCn=H,Hm=jCn;function ir(n){for(var i="https://reactjs.org/docs/error-decoder.html?invariant="+n,s=1;s<arguments.length;s++)i+="&args[]="+encodeURIComponent(arguments[s]);return"Minified React error #"+n+"; visit "+i+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var cBt=new Set,xH={};function AR(n,i){dM(n,i),dM(n+"Capture",i)}function dM(n,i){for(xH[n]=i,n=0;n<i.length;n++)cBt.add(i[n])}var gA=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),c6e=Object.prototype.hasOwnProperty,$Cn=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,XLt={},ZLt={};function BCn(n){return c6e.call(ZLt,n)?!0:c6e.call(XLt,n)?!1:$Cn.test(n)?ZLt[n]=!0:(XLt[n]=!0,!1)}function UCn(n,i,s,c){if(s!==null&&s.type===0)return!1;switch(typeof i){case"function":case"symbol":return!0;case"boolean":return c?!1:s!==null?!s.acceptsBooleans:(n=n.toLowerCase().slice(0,5),n!=="data-"&&n!=="aria-");default:return!1}}function HCn(n,i,s,c){if(i===null||typeof i>"u"||UCn(n,i,s,c))return!0;if(c)return!1;if(s!==null)switch(s.type){case 3:return!i;case 4:return i===!1;case 5:return isNaN(i);case 6:return isNaN(i)||1>i}return!1}function Vg(n,i,s,c,d,g,b){this.acceptsBooleans=i===2||i===3||i===4,this.attributeName=c,this.attributeNamespace=d,this.mustUseProperty=s,this.propertyName=n,this.type=i,this.sanitizeURL=g,this.removeEmptyString=b}var Uh={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(n){Uh[n]=new Vg(n,0,!1,n,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(n){var i=n[0];Uh[i]=new Vg(i,1,!1,n[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(n){Uh[n]=new Vg(n,2,!1,n.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(n){Uh[n]=new Vg(n,2,!1,n,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(n){Uh[n]=new Vg(n,3,!1,n.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(n){Uh[n]=new Vg(n,3,!0,n,null,!1,!1)});["capture","download"].forEach(function(n){Uh[n]=new Vg(n,4,!1,n,null,!1,!1)});["cols","rows","size","span"].forEach(function(n){Uh[n]=new Vg(n,6,!1,n,null,!1,!1)});["rowSpan","start"].forEach(function(n){Uh[n]=new Vg(n,5,!1,n.toLowerCase(),null,!1,!1)});var RLe=/[\-:]([a-z])/g;function OLe(n){return n[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(n){var i=n.replace(RLe,OLe);Uh[i]=new Vg(i,1,!1,n,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(n){var i=n.replace(RLe,OLe);Uh[i]=new Vg(i,1,!1,n,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(n){var i=n.replace(RLe,OLe);Uh[i]=new Vg(i,1,!1,n,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(n){Uh[n]=new Vg(n,1,!1,n.toLowerCase(),null,!1,!1)});Uh.xlinkHref=new Vg("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(n){Uh[n]=new Vg(n,1,!1,n.toLowerCase(),null,!0,!0)});function DLe(n,i,s,c){var d=Uh.hasOwnProperty(i)?Uh[i]:null;(d!==null?d.type!==0:c||!(2<i.
Line truncated
|
||||
`+uCe+n}var cCe=!1;function lCe(n,i){if(!n||cCe)return"";cCe=!0;var s=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(i)if(i=function(){throw Error()},Object.defineProperty(i.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(i,[])}catch(S){var c=S}Reflect.construct(n,[],i)}else{try{i.call()}catch(S){c=S}n.call(i.prototype)}else{try{throw Error()}catch(S){c=S}n()}}catch(S){if(S&&c&&typeof S.stack=="string"){for(var d=S.stack.split(`
|
||||
`),g=c.stack.split(`
|
||||
`),b=d.length-1,w=g.length-1;1<=b&&0<=w&&d[b]!==g[w];)w--;for(;1<=b&&0<=w;b--,w--)if(d[b]!==g[w]){if(b!==1||w!==1)do if(b--,w--,0>w||d[b]!==g[w]){var E=`
|
||||
`+d[b].replace(" at new "," at ");return n.displayName&&E.includes("<anonymous>")&&(E=E.replace("<anonymous>",n.displayName)),E}while(1<=b&&0<=w);break}}}finally{cCe=!1,Error.prepareStackTrace=s}return(n=n?n.displayName||n.name:"")?VU(n):""}function zCn(n){switch(n.tag){case 5:return VU(n.type);case 16:return VU("Lazy");case 13:return VU("Suspense");case 19:return VU("SuspenseList");case 0:case 2:case 15:return n=lCe(n.type,!1),n;case 11:return n=lCe(n.type.render,!1),n;case 1:return n=lCe(n.type,!0),n;default:return""}}function h6e(n){if(n==null)return null;if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n;switch(n){case R5:return"Fragment";case I5:return"Portal";case l6e:return"Profiler";case LLe:return"StrictMode";case d6e:return"Suspense";case f6e:return"SuspenseList"}if(typeof n=="object")switch(n.$$typeof){case dBt:return(n.displayName||"Context")+".Consumer";case lBt:return(n._context.displayName||"Context")+".Provider";case MLe:var i=n.render;return n=n.displayName,n||(n=i.displayName||i.name||"",n=n!==""?"ForwardRef("+n+")":"ForwardRef"),n;case PLe:return i=n.displayName||null,i!==null?i:h6e(n.type)||"Memo";case Pk:i=n._payload,n=n._init;try{return h6e(n(i))}catch{}}return null}function GCn(n){var i=n.type;switch(n.tag){case 24:return"Cache";case 9:return(i.displayName||"Context")+".Consumer";case 10:return(i._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return n=i.render,n=n.displayName||n.name||"",i.displayName||(n!==""?"ForwardRef("+n+")":"ForwardRef");case 7:return"Fragment";case 5:return i;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return h6e(i);case 8:return i===LLe?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof i=="function")return i.displayName||i.name||null;if(typeof i=="string")return i}return null}function nN(n){switch(typeof n){case"boolean":case"number":case"string":case"undefined":return n;case"object":return n;default:return""}}function hBt(n){var i=n.type;return(n=n.nodeName)&&n.toLowerCase()==="input"&&(i==="checkbox"||i==="radio")}function qCn(n){var i=hBt(n)?"checked":"value",s=Object.getOwnPropertyDescriptor(n.constructor.prototype,i),c=""+n[i];if(!n.hasOwnProperty(i)&&typeof s<"u"&&typeof s.get=="function"&&typeof s.set=="function"){var d=s.get,g=s.set;return Object.defineProperty(n,i,{configurable:!0,get:function(){return d.call(this)},set:function(b){c=""+b,g.call(this,b)}}),Object.defineProperty(n,i,{enumerable:s.enumerable}),{getValue:function(){return c},setValue:function(b){c=""+b},stopTracking:function(){n._valueTracker=null,delete n[i]}}}}function Yre(n){n._valueTracker||(n._valueTracker=qCn(n))}function pBt(n){if(!n)return!1;var i=n._valueTracker;if(!i)return!0;var s=i.getValue(),c="";return n&&(c=hBt(n)?n.checked?"true":"false":n.value),n=c,n!==s?(i.setValue(n),!0):!1}function foe(n){if(n=n||(typeof document<"u"?document:void 0),typeof n>"u")return null;try{return n.activeElement||n.body}catch{return n.body}}function p6e(n,i){var s=i.checked;return fl({},i,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:s??n._wrapperState.initialChecked})}function e5t(n,i){var s=i.defaultValue==null?"":i.defaultValue,c=i.checked!=null?i.checked:i.defaultChecked;s=nN(i.value!=null?i.value:s),n._wrapperState={initialChecked:c,initialValue:s,controlled:i.type==="checkbox"||i.type==="radio"?i.checked!=null:i.value!=null}}function gBt(n,i){i=i.checked,i!=null&&DLe(n,"checked",i,!1)}function g6e(n,i){gBt(n,i);var s=nN(i.value),c=i.type;if(s!=null)c==="number"?(s===0&&n.value===""||n.value!=s)&&(n.value=""+s):n.value!==""+s&&(n.value=""+s);else if(c==="submit"||c==="reset"){n.removeAttribute("value");return}i.hasOwnProperty("value")?b6e(n,i.type,s):i.hasOwnProperty("defaultValue")&&b6e(n,i.type,nN(i.defaultValue)),i.checked==null&&i.defaultChecked!=null&&(n.defaultChecked=!!i.defaultChecked)}function t5t(n,i,s){if(i.hasOwnProperty("value")||i.hasOwnProperty("defaultValue")){var c=i.type;if(!(c!=="submit"&&c!=="reset"||i.value!==void 0&&i.value!==null))return;i=""+n._wrapperState.initialValue,s||i===n.value||(n.value=i),n.defaultValue=i}s=n.name,s!==""&&(n.name=""),n.defaultChecked=!!n._wrapperState.initialChecked,s!==""&&(n.name=s)}function b6e(n,i,s){(i!=="number"||foe(n.ownerDocument)!==n)&&(s==null?n.defaultValue=""+n._wrapperState.initialValue:n.defaultValue!==""+s&&(n.defaultValue=""+s))}var WU=Array.isArray;function Y5(n,i,s,c){if(n=n.options,i){i={};for(var d=0;d<s.length;d++)i["$"+s[d]]=!0;for(s=0;s<n.length;s++)d=i.hasOwnProperty("$"+n[s].value),n[s].selected!==d&&(n[s].selected=d),d&&c&&(n[s].defaultSelected=!0)}else{for(s=""+nN(s),i=null,d=0;d<n.length;d++){if(n[d].value===s){n[d].selected=!0,c&&(n[d].defaultSelected=!0);return}i!==null||n[d].disabled||(i=n[d])}i!==null&&(i.s
Line truncated
|
||||
`).replace(t4n,"")}function rie(n,i,s){if(i=A5t(i),A5t(n)!==i&&s)throw Error(ir(425))}function voe(){}var I6e=null,R6e=null;function O6e(n,i){return n==="textarea"||n==="noscript"||typeof i.children=="string"||typeof i.children=="number"||typeof i.dangerouslySetInnerHTML=="object"&&i.dangerouslySetInnerHTML!==null&&i.dangerouslySetInnerHTML.__html!=null}var D6e=typeof setTimeout=="function"?setTimeout:void 0,n4n=typeof clearTimeout=="function"?clearTimeout:void 0,_5t=typeof Promise=="function"?Promise:void 0,r4n=typeof queueMicrotask=="function"?queueMicrotask:typeof _5t<"u"?function(n){return _5t.resolve(null).then(n).catch(i4n)}:D6e;function i4n(n){setTimeout(function(){throw n})}function TCe(n,i){var s=i,c=0;do{var d=s.nextSibling;if(n.removeChild(s),d&&d.nodeType===8)if(s=d.data,s==="/$"){if(c===0){n.removeChild(d),RH(i);return}c--}else s!=="$"&&s!=="$?"&&s!=="$!"||c++;s=d}while(s);RH(i)}function Yk(n){for(;n!=null;n=n.nextSibling){var i=n.nodeType;if(i===1||i===3)break;if(i===8){if(i=n.data,i==="$"||i==="$!"||i==="$?")break;if(i==="/$")return null}}return n}function x5t(n){n=n.previousSibling;for(var i=0;n;){if(n.nodeType===8){var s=n.data;if(s==="$"||s==="$!"||s==="$?"){if(i===0)return n;i--}else s==="/$"&&i++}n=n.previousSibling}return null}var MM=Math.random().toString(36).slice(2),R2="__reactFiber$"+MM,PH="__reactProps$"+MM,bA="__reactContainer$"+MM,L6e="__reactEvents$"+MM,o4n="__reactListeners$"+MM,s4n="__reactHandles$"+MM;function Y4(n){var i=n[R2];if(i)return i;for(var s=n.parentNode;s;){if(i=s[bA]||s[R2]){if(s=i.alternate,i.child!==null||s!==null&&s.child!==null)for(n=x5t(n);n!==null;){if(s=n[R2])return s;n=x5t(n)}return i}n=s,s=n.parentNode}return null}function wz(n){return n=n[R2]||n[bA],!n||n.tag!==5&&n.tag!==6&&n.tag!==13&&n.tag!==3?null:n}function M5(n){if(n.tag===5||n.tag===6)return n.stateNode;throw Error(ir(33))}function Dse(n){return n[PH]||null}var M6e=[],P5=-1;function wN(n){return{current:n}}function dc(n){0>P5||(n.current=M6e[P5],M6e[P5]=null,P5--)}function Wu(n,i){P5++,M6e[P5]=n.current,n.current=i}var rN={},Up=wN(rN),cb=wN(!1),oR=rN;function fM(n,i){var s=n.type.contextTypes;if(!s)return rN;var c=n.stateNode;if(c&&c.__reactInternalMemoizedUnmaskedChildContext===i)return c.__reactInternalMemoizedMaskedChildContext;var d={},g;for(g in s)d[g]=i[g];return c&&(n=n.stateNode,n.__reactInternalMemoizedUnmaskedChildContext=i,n.__reactInternalMemoizedMaskedChildContext=d),d}function lb(n){return n=n.childContextTypes,n!=null}function Eoe(){dc(cb),dc(Up)}function k5t(n,i,s){if(Up.current!==rN)throw Error(ir(168));Wu(Up,i),Wu(cb,s)}function rUt(n,i,s){var c=n.stateNode;if(i=i.childContextTypes,typeof c.getChildContext!="function")return s;c=c.getChildContext();for(var d in c)if(!(d in i))throw Error(ir(108,GCn(n)||"Unknown",d));return fl({},s,c)}function Soe(n){return n=(n=n.stateNode)&&n.__reactInternalMemoizedMergedChildContext||rN,oR=Up.current,Wu(Up,n),Wu(cb,cb.current),!0}function N5t(n,i,s){var c=n.stateNode;if(!c)throw Error(ir(169));s?(n=rUt(n,i,oR),c.__reactInternalMemoizedMergedChildContext=n,dc(cb),dc(Up),Wu(Up,n)):dc(cb),Wu(cb,s)}var oA=null,Lse=!1,ACe=!1;function iUt(n){oA===null?oA=[n]:oA.push(n)}function a4n(n){Lse=!0,iUt(n)}function yN(){if(!ACe&&oA!==null){ACe=!0;var n=0,i=cu;try{var s=oA;for(cu=1;n<s.length;n++){var c=s[n];do c=c(!0);while(c!==null)}oA=null,Lse=!1}catch(d){throw oA!==null&&(oA=oA.slice(n+1)),CBt(FLe,yN),d}finally{cu=i,ACe=!1}}return null}var j5=[],F5=0,Toe=null,Aoe=0,bw=[],mw=0,sR=null,uA=1,cA="";function q4(n,i){j5[F5++]=Aoe,j5[F5++]=Toe,Toe=n,Aoe=i}function oUt(n,i,s){bw[mw++]=uA,bw[mw++]=cA,bw[mw++]=sR,sR=n;var c=uA;n=cA;var d=32-Dv(c)-1;c&=~(1<<d),s+=1;var g=32-Dv(i)+d;if(30<g){var b=d-d%5;g=(c&(1<<b)-1).toString(32),c>>=b,d-=b,uA=1<<32-Dv(i)+d|s<<d|c,cA=g+n}else uA=1<<g|s<<d|c,cA=n}function WLe(n){n.return!==null&&(q4(n,1),oUt(n,1,0))}function KLe(n){for(;n===Toe;)Toe=j5[--F5],j5[F5]=null,Aoe=j5[--F5],j5[F5]=null;for(;n===sR;)sR=bw[--mw],bw[mw]=null,cA=bw[--mw],bw[mw]=null,uA=bw[--mw],bw[mw]=null}var Bm=null,Fm=null,Dc=!1,Cv=null;function sUt(n,i){var s=yw(5,null,null,0);s.elementType="DELETED",s.stateNode=i,s.return=n,i=n.deletions,i===null?(n.deletions=[s],n.flags|=16):i.push(s)}function C5t(n,i){switch(n.tag){case 5:var s=n.type;return i=i.nodeType!==1||s.toLowerCase()!==i.nodeName.toLowerCase()?null:i,i!==null?(n.stateNode=i,Bm=n,Fm=Yk(i.firstChild),!0):!1;case 6:return i=n.pendingProps===""||i.nodeType!==3?null:i,i!==null?(n.stateNode=i,Bm=n,Fm=null,!0):!1;case 13:return i=i.nodeType!==8?null:i,i!==null?(s=sR!==null?{id:uA,overflow:cA}:null,n.memoizedState={dehydrated:i,treeContext:s,retryLane:1073741824},s=yw(18,null,null,0),s.stateNode=i,s.return=n,n.child=s,Bm=n,Fm=null,!0):!1;default:return!1}}function P6e(n){return(n.mode&1)!==0&&(n.flags&128)===0}function j6e(n){if(Dc){var i=Fm;if(i){var s=i;if(!C5t(n,i)){if(P6e(n))throw Error(ir(418));i=Yk(s.nextSibling);var c=Bm;i&&C5t(n,i)?sUt(c,s):(n.flags=n.flags&-4097|2,Dc=!1,Bm=n)}}else{if(P6e(n))thr
Line truncated
|
||||
Error generating stack: `+g.message+`
|
||||
`+g.stack}return{value:n,source:i,stack:d,digest:null}}function CCe(n,i,s){return{value:n,source:null,stack:s??null,digest:i??null}}function U6e(n,i){try{console.error(i.value)}catch(s){setTimeout(function(){throw s})}}var b4n=typeof WeakMap=="function"?WeakMap:Map;function DUt(n,i,s){s=hA(-1,s),s.tag=3,s.payload={element:null};var c=i.value;return s.callback=function(){Ooe||(Ooe=!0,X6e=c),U6e(n,i)},s}function LUt(n,i,s){s=hA(-1,s),s.tag=3;var c=n.type.getDerivedStateFromError;if(typeof c=="function"){var d=i.value;s.payload=function(){return c(d)},s.callback=function(){U6e(n,i)}}var g=n.stateNode;return g!==null&&typeof g.componentDidCatch=="function"&&(s.callback=function(){U6e(n,i),typeof c!="function"&&(Xk===null?Xk=new Set([this]):Xk.add(this));var b=i.stack;this.componentDidCatch(i.value,{componentStack:b!==null?b:""})}),s}function F5t(n,i,s){var c=n.pingCache;if(c===null){c=n.pingCache=new b4n;var d=new Set;c.set(i,d)}else d=c.get(i),d===void 0&&(d=new Set,c.set(i,d));d.has(s)||(d.add(s),n=I4n.bind(null,n,i,s),i.then(n,n))}function $5t(n){do{var i;if((i=n.tag===13)&&(i=n.memoizedState,i=i!==null?i.dehydrated!==null:!0),i)return n;n=n.return}while(n!==null);return null}function B5t(n,i,s,c,d){return n.mode&1?(n.flags|=65536,n.lanes=d,n):(n===i?n.flags|=65536:(n.flags|=128,s.flags|=131072,s.flags&=-52805,s.tag===1&&(s.alternate===null?s.tag=17:(i=hA(-1,1),i.tag=2,Jk(s,i,1))),s.lanes|=1),n)}var m4n=AA.ReactCurrentOwner,sb=!1;function Bg(n,i,s,c){i.child=n===null?cUt(i,null,s,c):pM(i,n.child,s,c)}function U5t(n,i,s,c,d){s=s.render;var g=i.ref;return Q5(i,d),c=o5e(n,i,s,c,g,d),s=s5e(),n!==null&&!sb?(i.updateQueue=n.updateQueue,i.flags&=-2053,n.lanes&=~d,wA(n,i,d)):(Dc&&s&&WLe(i),i.flags|=1,Bg(n,i,c,d),i.child)}function H5t(n,i,s,c,d){if(n===null){var g=s.type;return typeof g=="function"&&!b5e(g)&&g.defaultProps===void 0&&s.compare===null&&s.defaultProps===void 0?(i.tag=15,i.type=g,MUt(n,i,g,c,d)):(n=Yie(s.type,null,c,i,i.mode,d),n.ref=i.ref,n.return=i,i.child=n)}if(g=n.child,!(n.lanes&d)){var b=g.memoizedProps;if(s=s.compare,s=s!==null?s:DH,s(b,c)&&n.ref===i.ref)return wA(n,i,d)}return i.flags|=1,n=Qk(g,c),n.ref=i.ref,n.return=i,i.child=n}function MUt(n,i,s,c,d){if(n!==null){var g=n.memoizedProps;if(DH(g,c)&&n.ref===i.ref)if(sb=!1,i.pendingProps=c=g,(n.lanes&d)!==0)n.flags&131072&&(sb=!0);else return i.lanes=n.lanes,wA(n,i,d)}return H6e(n,i,s,c,d)}function PUt(n,i,s){var c=i.pendingProps,d=c.children,g=n!==null?n.memoizedState:null;if(c.mode==="hidden")if(!(i.mode&1))i.memoizedState={baseLanes:0,cachePool:null,transitions:null},Wu(U5,Lm),Lm|=s;else{if(!(s&1073741824))return n=g!==null?g.baseLanes|s:s,i.lanes=i.childLanes=1073741824,i.memoizedState={baseLanes:n,cachePool:null,transitions:null},i.updateQueue=null,Wu(U5,Lm),Lm|=n,null;i.memoizedState={baseLanes:0,cachePool:null,transitions:null},c=g!==null?g.baseLanes:s,Wu(U5,Lm),Lm|=c}else g!==null?(c=g.baseLanes|s,i.memoizedState=null):c=s,Wu(U5,Lm),Lm|=c;return Bg(n,i,d,s),i.child}function jUt(n,i){var s=i.ref;(n===null&&s!==null||n!==null&&n.ref!==s)&&(i.flags|=512,i.flags|=2097152)}function H6e(n,i,s,c,d){var g=lb(s)?oR:Up.current;return g=fM(i,g),Q5(i,d),s=o5e(n,i,s,c,g,d),c=s5e(),n!==null&&!sb?(i.updateQueue=n.updateQueue,i.flags&=-2053,n.lanes&=~d,wA(n,i,d)):(Dc&&c&&WLe(i),i.flags|=1,Bg(n,i,s,d),i.child)}function z5t(n,i,s,c,d){if(lb(s)){var g=!0;Soe(i)}else g=!1;if(Q5(i,d),i.stateNode===null)Vie(n,i),OUt(i,s,c),B6e(i,s,c,d),c=!0;else if(n===null){var b=i.stateNode,w=i.memoizedProps;b.props=w;var E=b.context,S=s.contextType;typeof S=="object"&&S!==null?S=Tw(S):(S=lb(s)?oR:Up.current,S=fM(i,S));var x=s.getDerivedStateFromProps,A=typeof x=="function"||typeof b.getSnapshotBeforeUpdate=="function";A||typeof b.UNSAFE_componentWillReceiveProps!="function"&&typeof b.componentWillReceiveProps!="function"||(w!==c||E!==S)&&j5t(i,b,c,S),jk=!1;var C=i.memoizedState;b.state=C,koe(i,c,b,d),E=i.memoizedState,w!==c||C!==E||cb.current||jk?(typeof x=="function"&&($6e(i,s,x,c),E=i.memoizedState),(w=jk||P5t(i,s,w,c,C,E,S))?(A||typeof b.UNSAFE_componentWillMount!="function"&&typeof b.componentWillMount!="function"||(typeof b.componentWillMount=="function"&&b.componentWillMount(),typeof b.UNSAFE_componentWillMount=="function"&&b.UNSAFE_componentWillMount()),typeof b.componentDidMount=="function"&&(i.flags|=4194308)):(typeof b.componentDidMount=="function"&&(i.flags|=4194308),i.memoizedProps=c,i.memoizedState=E),b.props=c,b.state=E,b.context=S,c=w):(typeof b.componentDidMount=="function"&&(i.flags|=4194308),c=!1)}else{b=i.stateNode,dUt(n,i),w=i.memoizedProps,S=i.type===i.elementType?w:xv(i.type,w),b.props=S,A=i.pendingProps,C=b.context,E=s.contextType,typeof E=="object"&&E!==null?E=Tw(E):(E=lb(s)?oR:Up.current,E=fM(i,E));var R=s.getDerivedStateFromProps;(x=typeof R=="function"||typeof b.getSnapshotBeforeUpdate=="function")||typeof b.UNSAFE_componentWillReceiveProps!="function"&&typeof b.componentWillReceiveProps!="function"||(w!==A||C!==E)&&j5t(i,b,c,E),jk=!1,C=i.memoized
Line truncated
|
||||
* @license React
|
||||
* use-sync-external-store-shim.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var wM=H;function vRn(n,i){return n===i&&(n!==0||1/n===1/i)||n!==n&&i!==i}var ERn=typeof Object.is=="function"?Object.is:vRn,SRn=wM.useState,TRn=wM.useEffect,ARn=wM.useLayoutEffect,_Rn=wM.useDebugValue;function xRn(n,i){var s=i(),c=SRn({inst:{value:s,getSnapshot:i}}),d=c[0].inst,g=c[1];return ARn(function(){d.value=s,d.getSnapshot=i,PCe(d)&&g({inst:d})},[n,s,i]),TRn(function(){return PCe(d)&&g({inst:d}),n(function(){PCe(d)&&g({inst:d})})},[n]),_Rn(s),s}function PCe(n){var i=n.getSnapshot;n=n.value;try{var s=i();return!ERn(n,s)}catch{return!0}}function kRn(n,i){return i()}var NRn=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?kRn:xRn;bHt.useSyncExternalStore=wM.useSyncExternalStore!==void 0?wM.useSyncExternalStore:NRn;gHt.exports=bHt;var mHt=gHt.exports;const CRn=(n,i)=>lR(i)?i:cRn(i)&&lR(i.defaultValue)?i.defaultValue:Array.isArray(n)?n[n.length-1]:n,IRn={t:CRn,ready:!1},RRn=()=>()=>{},ps=(n,i={})=>{var pe,me,le;const{i18n:s}=i,{i18n:c,defaultNS:d}=H.useContext(pHt)||{},g=s||c||mRn();g&&!g.reportNamespaces&&(g.reportNamespaces=new yRn),g||dHt(g,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const b=H.useMemo(()=>{var fe;return{...gRn(),...(fe=g==null?void 0:g.options)==null?void 0:fe.react,...i}},[g,i]),{useSuspense:w,keyPrefix:E}=b,S=n||d||((pe=g==null?void 0:g.options)==null?void 0:pe.defaultNS),x=lR(S)?[S]:S||["translation"],A=H.useMemo(()=>x,x);(le=(me=g==null?void 0:g.reportNamespaces)==null?void 0:me.addUsedNamespaces)==null||le.call(me,A);const C=H.useRef(0),R=H.useCallback(fe=>{if(!g)return RRn;const{bindI18n:K,bindI18nStore:he}=b,Oe=()=>{C.current+=1,fe()};return K&&g.on(K,Oe),he&&g.store.on(he,Oe),()=>{K&&K.split(" ").forEach(Se=>g.off(Se,Oe)),he&&he.split(" ").forEach(Se=>g.store.off(Se,Oe))}},[g,b]),L=H.useRef(),D=H.useCallback(()=>{if(!g)return IRn;const fe=!!(g.isInitialized||g.initializedStoreOnce)&&A.every(Ae=>uRn(Ae,g,b)),K=i.lng||g.language,he=C.current,Oe=L.current;if(Oe&&Oe.ready===fe&&Oe.lng===K&&Oe.keyPrefix===E&&Oe.revision===he)return Oe;const Le={t:g.getFixedT(K,b.nsMode==="fallback"?A:A[0],E),ready:fe,lng:K,keyPrefix:E,revision:he};return L.current=Le,Le},[g,A,E,b,i.lng]),[B,$]=H.useState(0),{t:j,ready:P}=mHt.useSyncExternalStore(R,D,D);H.useEffect(()=>{if(g&&!P&&!w){const fe=()=>$(K=>K+1);i.lng?mMt(g,i.lng,A,fe):iDe(g,A,fe)}},[g,i.lng,A,P,w,B]);const G=g||{},ee=H.useRef(null),re=H.useRef(),Q=fe=>{const K=Object.getOwnPropertyDescriptors(fe);K.__original&&delete K.__original;const he=Object.create(Object.getPrototypeOf(fe),K);if(!Object.prototype.hasOwnProperty.call(he,"__original"))try{Object.defineProperty(he,"__original",{value:fe,writable:!1,enumerable:!1,configurable:!1})}catch{}return he},ie=H.useMemo(()=>{const fe=G,K=fe==null?void 0:fe.language;let he=fe;fe&&(ee.current&&ee.current.__original===fe?re.current!==K?(he=Q(fe),ee.current=he,re.current=K):he=ee.current:(he=Q(fe),ee.current=he,re.current=K));const Oe=[j,he,P];return Oe.t=j,Oe.i18n=he,Oe.ready=P,Oe},[j,G,P,G.resolvedLanguage,G.language,G.languages]);if(g&&w&&!P)throw new Promise(fe=>{const K=()=>fe();i.lng?mMt(g,i.lng,A,K):iDe(g,A,K)});return ie};function wMt({i18n:n,defaultNS:i,children:s}){const c=H.useMemo(()=>({i18n:n,defaultNS:i}),[n,i]);return H.createElement(pHt.Provider,{value:c},s)}function Bd(n){if(typeof n=="string"||typeof n=="number")return""+n;let i="";if(Array.isArray(n))for(let s=0,c;s<n.length;s++)(c=Bd(n[s]))!==""&&(i+=(i&&" ")+c);else for(let s in n)n[s]&&(i+=(i&&" ")+s);return i}var ORn={value:()=>{}};function qse(){for(var n=0,i=arguments.length,s={},c;n<i;++n){if(!(c=arguments[n]+"")||c in s||/[\s.]/.test(c))throw new Error("illegal type: "+c);s[c]=[]}return new Xie(s)}function Xie(n){this._=n}function DRn(n,i){return n.trim().split(/^|\s+/).map(function(s){var c="",d=s.indexOf(".");if(d>=0&&(c=s.slice(d+1),s=s.slice(0,d)),s&&!i.hasOwnProperty(s))throw new Error("unknown type: "+s);return{type:s,name:c}})}Xie.prototype=qse.prototype={constructor:Xie,on:function(n,i){var s=this._,c=DRn(n+"",s),d,g=-1,b=c.length;if(arguments.length<2){for(;++g<b;)if((d=(n=c[g]).type)&&(d=LRn(s[d],n.name)))return d;return}if(i!=null&&typeof i!="function")throw new Error("invalid callback: "+i);for(;++g<b;)if(d=(n=c[g]).type)s[d]=yMt(s[d],n.name,i);else if(i==null)for(d in s)s[d]=yMt(s[d],n.name,null);return this},copy:function(){var n={},i=this._;for(var s in i)n[s]=i[s].slice();return new Xie(n)},call:function(n,i){if((d=arguments.length-2)>0)for(var s=new Array(d),c=0,d,g;c<d;++c)s[c]=arguments[c+2];if(!this._.hasOwnProperty(n))throw new Error("unknown type: "+n);for(g=this._[n],c=0,d=g.length;c<d;++c)g[c].value.apply(i,s)},apply:function(n,i,s){if(!this._.hasOwnProperty(n))throw new Error("unknown type: "+n);for(var c=this._[n],d=0,g=c.length;d<g;++d)c[d].value.apply(i,s)}};function LRn(n,i){for(var s=0,c=n.length,d;s<c;++s)if((d=n[s]).name===i)return d.value}function yMt(n,i,s){for(var c=0,d=n.length;Line truncated
|
||||
* @license React
|
||||
* use-sync-external-store-shim/with-selector.production.js
|
||||
*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/var Qse=H,c5n=mHt;function l5n(n,i){return n===i&&(n!==0||1/n===1/i)||n!==n&&i!==i}var d5n=typeof Object.is=="function"?Object.is:l5n,f5n=c5n.useSyncExternalStore,h5n=Qse.useRef,p5n=Qse.useEffect,g5n=Qse.useMemo,b5n=Qse.useDebugValue;_zt.useSyncExternalStoreWithSelector=function(n,i,s,c,d){var g=h5n(null);if(g.current===null){var b={hasValue:!1,value:null};g.current=b}else b=g.current;g=g5n(function(){function E(R){if(!S){if(S=!0,x=R,R=c(R),d!==void 0&&b.hasValue){var L=b.value;if(d(L,R))return A=L}return A=R}if(L=A,d5n(x,R))return L;var D=c(R);return d!==void 0&&d(L,D)?(x=R,L):(x=R,A=D)}var S=!1,x,A,C=s===void 0?null:s;return[function(){return E(i())},C===null?void 0:function(){return E(C())}]},[i,s,c,d]);var w=f5n(n,g[0],g[1]);return p5n(function(){b.hasValue=!0,b.value=w},[w]),b5n(w),w};Azt.exports=_zt;var m5n=Azt.exports;const w5n=TR(m5n),y5n={},XMt=n=>{let i;const s=new Set,c=(x,A)=>{const C=typeof x=="function"?x(i):x;if(!Object.is(C,i)){const R=i;i=A??(typeof C!="object"||C===null)?C:Object.assign({},i,C),s.forEach(L=>L(i,R))}},d=()=>i,E={setState:c,getState:d,getInitialState:()=>S,subscribe:x=>(s.add(x),()=>s.delete(x)),destroy:()=>{(y5n?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),s.clear()}},S=i=n(c,d,E);return E},v5n=n=>n?XMt(n):XMt,{useDebugValue:E5n}=Hn,{useSyncExternalStoreWithSelector:S5n}=w5n,T5n=n=>n;function xzt(n,i=T5n,s){const c=S5n(n.subscribe,n.getState,n.getServerState||n.getInitialState,i,s);return E5n(c),c}const ZMt=(n,i)=>{const s=v5n(n),c=(d,g=i)=>xzt(s,d,g);return Object.assign(c,s),c},A5n=(n,i)=>n?ZMt(n,i):ZMt;function Lc(n,i){if(Object.is(n,i))return!0;if(typeof n!="object"||n===null||typeof i!="object"||i===null)return!1;if(n instanceof Map&&i instanceof Map){if(n.size!==i.size)return!1;for(const[c,d]of n)if(!Object.is(d,i.get(c)))return!1;return!0}if(n instanceof Set&&i instanceof Set){if(n.size!==i.size)return!1;for(const c of n)if(!i.has(c))return!1;return!0}const s=Object.keys(n);if(s.length!==Object.keys(i).length)return!1;for(const c of s)if(!Object.prototype.hasOwnProperty.call(i,c)||!Object.is(n[c],i[c]))return!1;return!0}const eae=H.createContext(null),_5n=eae.Provider,kzt=z2.error001();function Js(n,i){const s=H.useContext(eae);if(s===null)throw new Error(kzt);return xzt(s,n,i)}function Mc(){const n=H.useContext(eae);if(n===null)throw new Error(kzt);return H.useMemo(()=>({getState:n.getState,setState:n.setState,subscribe:n.subscribe}),[n])}const QMt={display:"none"},x5n={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},Nzt="react-flow__node-desc",Czt="react-flow__edge-desc",k5n="react-flow__aria-live",N5n=n=>n.ariaLiveMessage,C5n=n=>n.ariaLabelConfig;function I5n({rfId:n}){const i=Js(N5n);return I.jsx("div",{id:`${k5n}-${n}`,"aria-live":"assertive","aria-atomic":"true",style:x5n,children:i})}function R5n({rfId:n,disableKeyboardA11y:i}){const s=Js(C5n);return I.jsxs(I.Fragment,{children:[I.jsx("div",{id:`${Nzt}-${n}`,style:QMt,children:i?s["node.a11yDescription.default"]:s["node.a11yDescription.keyboardDisabled"]}),I.jsx("div",{id:`${Czt}-${n}`,style:QMt,children:s["edge.a11yDescription.default"]}),!i&&I.jsx(I5n,{rfId:n})]})}const gR=H.forwardRef(({position:n="top-left",children:i,className:s,style:c,...d},g)=>{const b=`${n}`.split("-");return I.jsx("div",{className:Bd(["react-flow__panel",s,...b]),style:c,ref:g,...d,children:i})});gR.displayName="Panel";function O5n({proOptions:n,position:i="bottom-right"}){return n!=null&&n.hideAttribution?null:I.jsx(gR,{position:i,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:I.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const D5n=n=>{const i=[],s=[];for(const[,c]of n.nodeLookup)c.selected&&i.push(c.internals.userNode);for(const[,c]of n.edgeLookup)c.selected&&s.push(c);return{selectedNodes:i,selectedEdges:s}},wie=n=>n.id;function L5n(n,i){return Lc(n.selectedNodes.map(wie),i.selectedNodes.map(wie))&&Lc(n.selectedEdges.map(wie),i.selectedEdges.map(wie))}function M5n({onSelectionChange:n}){const i=Mc(),{selectedNodes:s,selectedEdges:c}=Js(D5n,L5n);return H.useEffect(()=>{const d={nodes:s,edges:c};n==null||n(d),i.getState().onSelectionChangeHandlers.forEach(g=>g(d))},[s,c,n]),null}const P5n=n=>!!n.onSelectionChangeHandlers;function j5n({onSelectionChange:n}){const i=Js(P5n);return n||i?I.jsx(M5n,{onSelectionChange:n}):null}const Izt=[0,0],F5n={x:0,y:0,zoom:1},$5n=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodLine truncated
|
||||
`).replace(`
|
||||
|
||||
`,`
|
||||
+`).split(`
|
||||
`)),x=S.reduce((A,C)=>A.concat(...C),[]);return[S,x]}return[[],[]]},[n]);return H.useEffect(()=>{const E=(i==null?void 0:i.target)??r9t,S=(i==null?void 0:i.actInsideInputWithModifier)??!0;if(n!==null){const x=R=>{var B,$;if(d.current=R.ctrlKey||R.metaKey||R.shiftKey||R.altKey,(!d.current||d.current&&!S)&&szt(R))return!1;const D=o9t(R.code,w);if(g.current.add(R[D]),i9t(b,g.current,!1)){const j=(($=(B=R.composedPath)==null?void 0:B.call(R))==null?void 0:$[0])||R.target,P=(j==null?void 0:j.nodeName)==="BUTTON"||(j==null?void 0:j.nodeName)==="A";i.preventDefault!==!1&&(d.current||!P)&&R.preventDefault(),c(!0)}},A=R=>{const L=o9t(R.code,w);i9t(b,g.current,!0)?(c(!1),g.current.clear()):g.current.delete(R[L]),R.key==="Meta"&&g.current.clear(),d.current=!1},C=()=>{g.current.clear(),c(!1)};return E==null||E.addEventListener("keydown",x),E==null||E.addEventListener("keyup",A),window.addEventListener("blur",C),window.addEventListener("contextmenu",C),()=>{E==null||E.removeEventListener("keydown",x),E==null||E.removeEventListener("keyup",A),window.removeEventListener("blur",C),window.removeEventListener("contextmenu",C)}}},[n,c]),s}function i9t(n,i,s){return n.filter(c=>s||c.length===i.size).some(c=>c.every(d=>i.has(d)))}function o9t(n,i){return i.includes(n)?"code":"key"}const z5n=()=>{const n=Mc();return H.useMemo(()=>({zoomIn:i=>{const{panZoom:s}=n.getState();return s?s.scaleBy(1.2,{duration:i==null?void 0:i.duration}):Promise.resolve(!1)},zoomOut:i=>{const{panZoom:s}=n.getState();return s?s.scaleBy(1/1.2,{duration:i==null?void 0:i.duration}):Promise.resolve(!1)},zoomTo:(i,s)=>{const{panZoom:c}=n.getState();return c?c.scaleTo(i,{duration:s==null?void 0:s.duration}):Promise.resolve(!1)},getZoom:()=>n.getState().transform[2],setViewport:async(i,s)=>{const{transform:[c,d,g],panZoom:b}=n.getState();return b?(await b.setViewport({x:i.x??c,y:i.y??d,zoom:i.zoom??g},s),Promise.resolve(!0)):Promise.resolve(!1)},getViewport:()=>{const[i,s,c]=n.getState().transform;return{x:i,y:s,zoom:c}},setCenter:async(i,s,c)=>n.getState().setCenter(i,s,c),fitBounds:async(i,s)=>{const{width:c,height:d,minZoom:g,maxZoom:b,panZoom:w}=n.getState(),E=I5e(i,c,d,g,b,(s==null?void 0:s.padding)??.1);return w?(await w.setViewport(E,{duration:s==null?void 0:s.duration,ease:s==null?void 0:s.ease,interpolate:s==null?void 0:s.interpolate}),Promise.resolve(!0)):Promise.resolve(!1)},screenToFlowPosition:(i,s={})=>{const{transform:c,snapGrid:d,snapToGrid:g,domNode:b}=n.getState();if(!b)return i;const{x:w,y:E}=b.getBoundingClientRect(),S={x:i.x-w,y:i.y-E},x=s.snapGrid??d,A=s.snapToGrid??g;return _z(S,c,A,x)},flowToScreenPosition:i=>{const{transform:s,domNode:c}=n.getState();if(!c)return i;const{x:d,y:g}=c.getBoundingClientRect(),b=Voe(i,s);return{x:b.x+d,y:b.y+g}}}),[])};function Rzt(n,i){const s=[],c=new Map,d=[];for(const g of n)if(g.type==="add"){d.push(g);continue}else if(g.type==="remove"||g.type==="replace")c.set(g.id,[g]);else{const b=c.get(g.id);b?b.push(g):c.set(g.id,[g])}for(const g of i){const b=c.get(g.id);if(!b){s.push(g);continue}if(b[0].type==="remove")continue;if(b[0].type==="replace"){s.push({...b[0].item});continue}const w={...g};for(const E of b)G5n(E,w);s.push(w)}return d.length&&d.forEach(g=>{g.index!==void 0?s.splice(g.index,0,{...g.item}):s.push({...g.item})}),s}function G5n(n,i){switch(n.type){case"select":{i.selected=n.selected;break}case"position":{typeof n.position<"u"&&(i.position=n.position),typeof n.dragging<"u"&&(i.dragging=n.dragging);break}case"dimensions":{typeof n.dimensions<"u"&&(i.measured={...n.dimensions},n.setAttributes&&((n.setAttributes===!0||n.setAttributes==="width")&&(i.width=n.dimensions.width),(n.setAttributes===!0||n.setAttributes==="height")&&(i.height=n.dimensions.height))),typeof n.resizing=="boolean"&&(i.resizing=n.resizing);break}}}function Ozt(n,i){return Rzt(n,i)}function Dzt(n,i){return Rzt(n,i)}function W4(n,i){return{id:n,type:"select",selected:i}}function z5(n,i=new Set,s=!1){const c=[];for(const[d,g]of n){const b=i.has(d);!(g.selected===void 0&&!b)&&g.selected!==b&&(s&&(g.selected=b),c.push(W4(g.id,b)))}return c}function s9t({items:n=[],lookup:i}){var d;const s=[],c=new Map(n.map(g=>[g.id,g]));for(const[g,b]of n.entries()){const w=i.get(b.id),E=((d=w==null?void 0:w.internals)==null?void 0:d.userNode)??w;E!==void 0&&E!==b&&s.push({id:b.id,item:b,type:"replace"}),E===void 0&&s.push({item:b,type:"add",index:g})}for(const[g]of i)c.get(g)===void 0&&s.push({id:g,type:"remove"});return s}function a9t(n){return{id:n.id,type:"remove"}}const u9t=n=>dLn(n),q5n=n=>ZHt(n);function Lzt(n){return H.forwardRef(n)}const V5n=typeof window<"u"?H.useLayoutEffect:H.useEffect;function c9t(n){const[i,s]=H.useState(BigInt(0)),[c]=H.useState(()=>W5n(()=>s(d=>d+BigInt(1))));return V5n(()=>{const d=c.get();d.length&&(n(d),c.reset())},[i]),c}function W5n(n){let i=[];return{get:()=>i,reset:()=>{i=[]},push:s=>{i.push(s),n()}}}const Mzt=H.createContext(null);function K5n({children:n}){const i=Mc(),s=H.useCallback(w=>{const{nodes
Line truncated
|
||||
M${ie.x},${ie.y}h${ie.width}v${ie.height}h${-ie.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}aGt.displayName="MiniMap";const P9n=H.memo(aGt),j9n=n=>i=>n?`${Math.max(1/i.transform[2],1)}`:void 0,F9n={[_M.Line]:"right",[_M.Handle]:"bottom-right"};function $9n({nodeId:n,position:i,variant:s=_M.Handle,className:c,style:d=void 0,children:g,color:b,minWidth:w=10,minHeight:E=10,maxWidth:S=Number.MAX_VALUE,maxHeight:x=Number.MAX_VALUE,keepAspectRatio:A=!1,resizeDirection:C,autoScale:R=!0,shouldResize:L,onResizeStart:D,onResize:B,onResizeEnd:$}){const j=Fzt(),P=typeof n=="string"?n:j,G=Mc(),ee=H.useRef(null),re=s===_M.Handle,Q=Js(H.useCallback(j9n(re&&R),[re,R]),Lc),ie=H.useRef(null),pe=i??F9n[s];H.useEffect(()=>{if(!(!ee.current||!P))return ie.current||(ie.current=u5n({domNode:ee.current,nodeId:P,getStoreItems:()=>{const{nodeLookup:le,transform:fe,snapGrid:K,snapToGrid:he,nodeOrigin:Oe,domNode:Se}=G.getState();return{nodeLookup:le,transform:fe,snapGrid:K,snapToGrid:he,nodeOrigin:Oe,paneDomNode:Se}},onChange:(le,fe)=>{const{triggerNodeChanges:K,nodeLookup:he,parentLookup:Oe,nodeOrigin:Se}=G.getState(),Le=[],Ae={x:le.x,y:le.y},xe=he.get(P);if(xe&&xe.expandParent&&xe.parentId){const We=xe.origin??Se,dt=le.width??xe.measured.width??0,Ue=le.height??xe.measured.height??0,bt={id:xe.id,parentId:xe.parentId,rect:{width:dt,height:Ue,...izt({x:le.x??xe.position.x,y:le.y??xe.position.y},{width:dt,height:Ue},xe.parentId,he,We)}},kt=P5e([bt],he,Oe,Se);Le.push(...kt),Ae.x=le.x?Math.max(We[0]*dt,le.x):void 0,Ae.y=le.y?Math.max(We[1]*Ue,le.y):void 0}if(Ae.x!==void 0&&Ae.y!==void 0){const We={id:P,type:"position",position:{...Ae}};Le.push(We)}if(le.width!==void 0&&le.height!==void 0){const dt={id:P,type:"dimensions",resizing:!0,setAttributes:C?C==="horizontal"?"width":"height":!0,dimensions:{width:le.width,height:le.height}};Le.push(dt)}for(const We of fe){const dt={...We,type:"position"};Le.push(dt)}K(Le)},onEnd:({width:le,height:fe})=>{const K={id:P,type:"dimensions",resizing:!1,dimensions:{width:le,height:fe}};G.getState().triggerNodeChanges([K])}})),ie.current.update({controlPosition:pe,boundaries:{minWidth:w,minHeight:E,maxWidth:S,maxHeight:x},keepAspectRatio:A,resizeDirection:C,onResizeStart:D,onResize:B,onResizeEnd:$,shouldResize:L}),()=>{var le;(le=ie.current)==null||le.destroy()}},[pe,w,E,S,x,A,D,B,$,L]);const me=pe.split("-");return I.jsx("div",{className:Bd(["react-flow__resize-control","nodrag",...me,s,c]),ref:ee,style:{...d,scale:Q,...b&&{[re?"backgroundColor":"borderColor"]:b}},children:g})}H.memo($9n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const uGt=(...n)=>n.filter((i,s,c)=>!!i&&i.trim()!==""&&c.indexOf(i)===s).join(" ").trim();/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const B9n=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const U9n=n=>n.replace(/^([A-Z])|[\s-_]+(\w)/g,(i,s,c)=>c?c.toUpperCase():s.toLowerCase());/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const S9t=n=>{const i=U9n(n);return i.charAt(0).toUpperCase()+i.slice(1)};/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/var H9n={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const z9n=n=>{for(const i in n)if(i.startsWith("aria-")||i==="role"||i==="title")return!0;return!1};/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const G9n=H.forwardRef(({color:n="currentColor",size:i=24,strokeWidth:s=2,absoluteStrokeWidth:c,className:d="",children:g,iconNode:b,...w},E)=>H.createElement("svg",{ref:E,...H9n,width:i,height:i,stroke:n,strokeWidth:c?Number(s)*24/Number(i):s,className:uGt("lucide",d),...!g&&!z9n(w)&&{"aria-hidden":"true"},...w},[...b.map(([S,x])=>H.createElement(S,x)),...Array.isArray(g)?g:[g]]));/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const _i=(n,i)=>{const s=H.forwardRef(({className:c,...d},g)=>H.createElement(G9n,{ref:g,iconNode:i,className:uGt(`lucide-${B9n(S9t(n))}`,`lucide-${n}`,c),...d}));return s.displayName=S9t(n),s};/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const q9n=[["rect",{width:"6",height:"16",x:"4",y:"2",rx:"2",key:"z5wdxg"}],["rect",{width:"6",height:"9",x:"14",y:"9",rx:"2",key:"um7a8w"}],["path",{d:"M22 22H2",key:"19qnx5"}]],V9n=_i("align-end-horizontal",q9n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const W9n=[["rect",{width:"16",height:"6",x:"2",y:"4",rx:"2",key:"10wcwx"}],["rect",{width:"9",height:"6",x:"9",y:"14",rx:"2",key:"4p5bwg"}],["path",{d:"M22 22V2",key:"12ipfv"}]],K9n=_i("align-end-vertical",W9n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Y9n=[["rect",{width:"6",height:"16",x:"4",y:"6",rx:"2",key:"1n4dg1"}],["rect",{width:"6",height:"9",x:"14",y:"6",rx:"2",key:"17khns"}],["path",{d:"M22 2H2",key:"fhrpnj"}]],J9n=_i("align-start-horizontal",Y9n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const X9n=[["rect",{width:"9",height:"6",x:"6",y:"14",rx:"2",key:"lpm2y7"}],["rect",{width:"16",height:"6",x:"6",y:"4",rx:"2",key:"rdj6ps"}],["path",{d:"M2 2v20",key:"1ivd8o"}]],Z9n=_i("align-start-vertical",X9n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Q9n=[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]],e8n=_i("arrow-down",Q9n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const t8n=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],n8n=_i("arrow-left",t8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const r8n=[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]],i8n=_i("arrow-up-down",r8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const o8n=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],s8n=_i("arrow-up",o8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const a8n=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M4.929 4.929 19.07 19.071",key:"196cmz"}]],iN=_i("ban",a8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const u8n=[["path",{d:"m16 22-1-4",key:"1ow2iv"}],["path",{d:"M19 14a1 1 0 0 0 1-1v-1a2 2 0 0 0-2-2h-3a1 1 0 0 1-1-1V4a2 2 0 0 0-4 0v5a1 1 0 0 1-1 1H6a2 2 0 0 0-2 2v1a1 1 0 0 0 1 1",key:"11gii7"}],["path",{d:"M19 14H5l-1.973 6.767A1 1 0 0 0 4 22h16a1 1 0 0 0 .973-1.233z",key:"bju7h4"}],["path",{d:"m8 22 1-4",key:"s3unb"}]],c8n=_i("brush-cleaning",u8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const l8n=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],oN=_i("check",l8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const d8n=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],nae=_i("chevron-down",d8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const f8n=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],h8n=_i("chevron-right",f8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const p8n=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],g8n=_i("chevron-up",p8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const b8n=[["path",{d:"m7 15 5 5 5-5",key:"1hf1tw"}],["path",{d:"m7 9 5-5 5 5",key:"sgt6xg"}]],cGt=_i("chevrons-up-down",b8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const m8n=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],_w=_i("circle-alert",m8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const w8n=[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]],lGt=_i("circle-check-big",w8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const y8n=[["path",{d:"M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z",key:"kmsa83"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],v8n=_i("circle-play",y8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const E8n=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],S8n=_i("circle",E8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const T8n=[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}]],A8n=_i("clipboard",T8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const _8n=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 6v6l4 2",key:"mmk7yg"}]],F5e=_i("clock",_8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const x8n=[["line",{x1:"15",x2:"15",y1:"12",y2:"18",key:"1p7wdc"}],["line",{x1:"12",x2:"18",y1:"15",y2:"15",key:"1nscbv"}],["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],k8n=_i("copy-plus",x8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const N8n=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],$5e=_i("copy",N8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const C8n=[["path",{d:"M12 8v8",key:"napkw2"}],["path",{d:"M2.7 10.3a2.41 2.41 0 0 0 0 3.41l7.59 7.59a2.41 2.41 0 0 0 3.41 0l7.59-7.59a2.41 2.41 0 0 0 0-3.41L13.7 2.71a2.41 2.41 0 0 0-3.41 0z",key:"1ey20j"}],["path",{d:"M8 12h8",key:"1wcyev"}]],dGt=_i("diamond-plus",C8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const I8n=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],T9t=_i("download",I8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const R8n=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],O8n=_i("external-link",R8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const D8n=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}]],L8n=_i("file-code",D8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const M8n=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M12 18v-6",key:"17g6i2"}],["path",{d:"m9 15 3 3 3-3",key:"1npd3o"}]],P8n=_i("file-down",M8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const j8n=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"m15 15-3-3-3 3",key:"15xj92"}]],F8n=_i("file-up",j8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const $8n=[["path",{d:"m6 14 1.45-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.55 6a2 2 0 0 1-1.94 1.5H4a2 2 0 0 1-2-2V5c0-1.1.9-2 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H18a2 2 0 0 1 2 2v2",key:"1nmvlm"}],["circle",{cx:"14",cy:"15",r:"1",key:"1gm4qj"}]],B8n=_i("folder-open-dot",$8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const U8n=[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]],fGt=_i("git-branch",U8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const H8n=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],z8n=_i("history",H8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const G8n=[["path",{d:"M5 22h14",key:"ehvnwv"}],["path",{d:"M5 2h14",key:"pdyrp9"}],["path",{d:"M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22",key:"1d314k"}],["path",{d:"M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2",key:"1vvvr6"}]],hGt=_i("hourglass",G8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const q8n=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],V8n=_i("layers",q8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const W8n=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],QH=_i("loader-circle",W8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const K8n=[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]],Y8n=_i("menu",K8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const J8n=[["path",{d:"M14 4.1 12 6",key:"ita8i4"}],["path",{d:"m5.1 8-2.9-.8",key:"1go3kf"}],["path",{d:"m6 12-1.9 2",key:"mnht97"}],["path",{d:"M7.2 2.2 8 5.1",key:"1cfko1"}],["path",{d:"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z",key:"s0h3yz"}]],X8n=_i("mouse-pointer-click",J8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const Z8n=[["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z",key:"2d38gg"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],Q8n=_i("octagon-x",Z8n);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const ePn=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]],rae=_i("play",ePn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const tPn=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],iae=_i("plus",tPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const nPn=[["path",{d:"m15 14 5-5-5-5",key:"12vg1m"}],["path",{d:"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13",key:"6uklza"}]],rPn=_i("redo-2",nPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const iPn=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],pGt=_i("rotate-ccw",iPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const oPn=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],gGt=_i("save",oPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const sPn=[["circle",{cx:"6",cy:"6",r:"3",key:"1lh9wr"}],["path",{d:"M8.12 8.12 12 12",key:"1alkpv"}],["path",{d:"M20 4 8.12 15.88",key:"xgtan2"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M14.8 14.8 20 20",key:"ptml3r"}]],aPn=_i("scissors",sPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const uPn=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],bGt=_i("search",uPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const cPn=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],lPn=_i("settings",cPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const dPn=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],mGt=_i("square",dPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const fPn=[["circle",{cx:"9",cy:"12",r:"3",key:"u3jwor"}],["rect",{width:"20",height:"14",x:"2",y:"5",rx:"7",key:"g7kal2"}]],A9t=_i("toggle-left",fPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const hPn=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],PM=_i("trash-2",hPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const pPn=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],_9t=_i("triangle-alert",pPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const gPn=[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]],bPn=_i("undo-2",gPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const mPn=[["path",{d:"m19 5 3-3",key:"yk6iyv"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z",key:"1snsnr"}]],wPn=_i("unplug",mPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const yPn=[["path",{d:"M12 3v12",key:"1x0j5s"}],["path",{d:"m17 8-5-5-5 5",key:"7q97r8"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}]],vPn=_i("upload",yPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const EPn=[["path",{d:"M8 21s-4-3-4-9 4-9 4-9",key:"uto9ud"}],["path",{d:"M16 3s4 3 4 9-4 9-4 9",key:"4w2vsq"}],["line",{x1:"15",x2:"9",y1:"9",y2:"15",key:"f7djnv"}],["line",{x1:"9",x2:"15",y1:"9",y2:"15",key:"1shsy8"}]],wGt=_i("variable",EPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const SPn=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],TPn=_i("wifi",SPn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const APn=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],oae=_i("x",APn);/**
|
||||
* @license lucide-react v0.577.0 - ISC
|
||||
*
|
||||
* This source code is licensed under the ISC license.
|
||||
* See the LICENSE file in the root directory of this source tree.
|
||||
*/const _Pn=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],yGt=_i("zap",_Pn),xPn=H.createContext(null),VCe={didCatch:!1,error:null};let kPn=class extends H.Component{constructor(i){super(i),this.resetErrorBoundary=this.resetErrorBoundary.bind(this),this.state=VCe}static getDerivedStateFromError(i){return{didCatch:!0,error:i}}resetErrorBoundary(...i){var c,d;const{error:s}=this.state;s!==null&&((d=(c=this.props).onReset)==null||d.call(c,{args:i,reason:"imperative-api"}),this.setState(VCe))}componentDidCatch(i,s){var c,d;(d=(c=this.props).onError)==null||d.call(c,i,s)}componentDidUpdate(i,s){var g,b;const{didCatch:c}=this.state,{resetKeys:d}=this.props;c&&s.error!==null&&NPn(i.resetKeys,d)&&((b=(g=this.props).onReset)==null||b.call(g,{next:d,prev:i.resetKeys,reason:"keys"}),this.setState(VCe))}render(){const{children:i,fallbackRender:s,FallbackComponent:c,fallback:d}=this.props,{didCatch:g,error:b}=this.state;let w=i;if(g){const E={error:b,resetErrorBoundary:this.resetErrorBoundary};if(typeof s=="function")w=s(E);else if(c)w=H.createElement(c,E);else if(d!==void 0)w=d;else throw b}return H.createElement(xPn.Provider,{value:{didCatch:g,error:b,resetErrorBoundary:this.resetErrorBoundary}},w)}};function NPn(n=[],i=[]){return n.length!==i.length||n.some((s,c)=>!Object.is(s,i[c]))}function CPn(n){if(typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.type="text/css",i.appendChild(s),s.styleSheet?s.styleSheet.cssText=n:s.appendChild(document.createTextNode(n))}const IPn=n=>{switch(n){case"success":return DPn;case"info":return MPn;case"warning":return LPn;case"error":return PPn;default:return null}},RPn=Array(12).fill(0),OPn=({visible:n,className:i})=>Hn.createElement("div",{className:["sonner-loading-wrapper",i].filter(Boolean).join(" "),"data-visible":n},Hn.createElement("div",{className:"sonner-spinner"},RPn.map((s,c)=>Hn.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${c}`})))),DPn=Hn.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Hn.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),LPn=Hn.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},Hn.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),MPn=Hn.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Hn.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),PPn=Hn.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Hn.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),jPn=Hn.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},Hn.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),Hn.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),FPn=()=>{const[n,i]=Hn.useState(document.hidden);return Hn.useEffect(()=>{const s=()=>{i(document.hidden)};return document.addEventListener("visibilitychange",s),()=>window.removeEventListener("visibilitychange",s)},[]),n};let yDe=1;class $Pn{constructor(){this.subscribe=i=>(this.subscribers.push(i),()=>{const s=this.subscribers.indexOf(i);this.subscribers.splice(s,1)}),this.publish=i=>{this.subscribers.forEach(s=>s(i))},this.addToast=i=>{this.publish(i),this.toasts=[...this.toasts,i]},this.create=i=>{var s;const{message:c,...d}=i,g=typeof(i==null?void 0:i.id)=="number"||((s=i.id)==null?void 0:s.length)>0?i.id:yDe++,b=this.toasts.find(E=>E.id===g),w=i.dismissible===void 0?!0:i.dismissible;return this.dismissedToasts.has(g)&&this.dismissedToasts.delete(g),b?this.toasts=this.toasts.map(E=>E.id===g?(this.publish({...E,...i,id:g,title:c}),{...E,...i,id:g,dismissible:w,title:c}):E):this.addToast({title:c,...d,dismissible:w,id:g}),g},this.dismiss=i=>(i?(this.dismissedToasts.add(i),requestAnimaLine truncated
|
||||
.`.concat(qjn,` {
|
||||
overflow: hidden `).concat(c,`;
|
||||
padding-right: `).concat(w,"px ").concat(c,`;
|
||||
}
|
||||
body[`).concat(rM,`] {
|
||||
overflow: hidden `).concat(c,`;
|
||||
overscroll-behavior: contain;
|
||||
`).concat([i&&"position: relative ".concat(c,";"),s==="margin"&&`
|
||||
padding-left: `.concat(d,`px;
|
||||
padding-top: `).concat(g,`px;
|
||||
padding-right: `).concat(b,`px;
|
||||
margin-left:0;
|
||||
margin-top:0;
|
||||
margin-right: `).concat(w,"px ").concat(c,`;
|
||||
`),s==="padding"&&"padding-right: ".concat(w,"px ").concat(c,";")].filter(Boolean).join(""),`
|
||||
}
|
||||
|
||||
.`).concat(noe,` {
|
||||
right: `).concat(w,"px ").concat(c,`;
|
||||
}
|
||||
|
||||
.`).concat(roe,` {
|
||||
margin-right: `).concat(w,"px ").concat(c,`;
|
||||
}
|
||||
|
||||
.`).concat(noe," .").concat(noe,` {
|
||||
right: 0 `).concat(c,`;
|
||||
}
|
||||
|
||||
.`).concat(roe," .").concat(roe,` {
|
||||
margin-right: 0 `).concat(c,`;
|
||||
}
|
||||
|
||||
body[`).concat(rM,`] {
|
||||
`).concat(Vjn,": ").concat(w,`px;
|
||||
}
|
||||
`)},$9t=function(){var n=parseInt(document.body.getAttribute(rM)||"0",10);return isFinite(n)?n:0},d7n=function(){H.useEffect(function(){return document.body.setAttribute(rM,($9t()+1).toString()),function(){var n=$9t()-1;n<=0?document.body.removeAttribute(rM):document.body.setAttribute(rM,n.toString())}},[])},f7n=function(n){var i=n.noRelative,s=n.noImportant,c=n.gapMode,d=c===void 0?"margin":c;d7n();var g=H.useMemo(function(){return u7n(d)},[d]);return H.createElement(c7n,{styles:l7n(g,!i,d,s?"":"!important")})},SDe=!1;if(typeof window<"u")try{var Sie=Object.defineProperty({},"passive",{get:function(){return SDe=!0,!0}});window.addEventListener("test",Sie,Sie),window.removeEventListener("test",Sie,Sie)}catch{SDe=!1}var w5=SDe?{passive:!1}:!1,h7n=function(n){return n.tagName==="TEXTAREA"},CGt=function(n,i){if(!(n instanceof Element))return!1;var s=window.getComputedStyle(n);return s[i]!=="hidden"&&!(s.overflowY===s.overflowX&&!h7n(n)&&s[i]==="visible")},p7n=function(n){return CGt(n,"overflowY")},g7n=function(n){return CGt(n,"overflowX")},B9t=function(n,i){var s=i.ownerDocument,c=i;do{typeof ShadowRoot<"u"&&c instanceof ShadowRoot&&(c=c.host);var d=IGt(n,c);if(d){var g=RGt(n,c),b=g[1],w=g[2];if(b>w)return!0}c=c.parentNode}while(c&&c!==s.body);return!1},b7n=function(n){var i=n.scrollTop,s=n.scrollHeight,c=n.clientHeight;return[i,s,c]},m7n=function(n){var i=n.scrollLeft,s=n.scrollWidth,c=n.clientWidth;return[i,s,c]},IGt=function(n,i){return n==="v"?p7n(i):g7n(i)},RGt=function(n,i){return n==="v"?b7n(i):m7n(i)},w7n=function(n,i){return n==="h"&&i==="rtl"?-1:1},y7n=function(n,i,s,c,d){var g=w7n(n,window.getComputedStyle(i).direction),b=g*c,w=s.target,E=i.contains(w),S=!1,x=b>0,A=0,C=0;do{if(!w)break;var R=RGt(n,w),L=R[0],D=R[1],B=R[2],$=D-B-g*L;(L||$)&&IGt(n,w)&&(A+=$,C+=L);var j=w.parentNode;w=j&&j.nodeType===Node.DOCUMENT_FRAGMENT_NODE?j.host:j}while(!E&&w!==document.body||E&&(i.contains(w)||i===w));return(x&&Math.abs(A)<1||!x&&Math.abs(C)<1)&&(S=!0),S},Tie=function(n){return"changedTouches"in n?[n.changedTouches[0].clientX,n.changedTouches[0].clientY]:[0,0]},U9t=function(n){return[n.deltaX,n.deltaY]},H9t=function(n){return n&&"current"in n?n.current:n},v7n=function(n,i){return n[0]===i[0]&&n[1]===i[1]},E7n=function(n){return`
|
||||
.block-interactivity-`.concat(n,` {pointer-events: none;}
|
||||
.allow-interactivity-`).concat(n,` {pointer-events: all;}
|
||||
`)},S7n=0,y5=[];function T7n(n){var i=H.useRef([]),s=H.useRef([0,0]),c=H.useRef(),d=H.useState(S7n++)[0],g=H.useState(NGt)[0],b=H.useRef(n);H.useEffect(function(){b.current=n},[n]),H.useEffect(function(){if(n.inert){document.body.classList.add("block-interactivity-".concat(d));var D=Gjn([n.lockRef.current],(n.shards||[]).map(H9t),!0).filter(Boolean);return D.forEach(function(B){return B.classList.add("allow-interactivity-".concat(d))}),function(){document.body.classList.remove("block-interactivity-".concat(d)),D.forEach(function(B){return B.classList.remove("allow-interactivity-".concat(d))})}}},[n.inert,n.lockRef.current,n.shards]);var w=H.useCallback(function(D,B){if("touches"in D&&D.touches.length===2||D.type==="wheel"&&D.ctrlKey)return!b.current.allowPinchZoom;var $=Tie(D),j=s.current,P="deltaX"in D?D.deltaX:j[0]-$[0],G="deltaY"in D?D.deltaY:j[1]-$[1],ee,re=D.target,Q=Math.abs(P)>Math.abs(G)?"h":"v";if("touches"in D&&Q==="h"&&re.type==="range")return!1;var ie=window.getSelection(),pe=ie&&ie.anchorNode,me=pe?pe===re||pe.contains(re):!1;if(me)return!1;var le=B9t(Q,re);if(!le)return!0;if(le?ee=Q:(ee=Q==="v"?"h":"v",le=B9t(Q,re)),!le)return!1;if(!c.current&&"changedTouches"in D&&(P||G)&&(c.current=ee),!ee)return!0;var fe=c.current||ee;return y7n(fe,B,D,fe==="h"?P:G)},[]),E=H.useCallback(function(D){var B=D;if(!(!y5.length||y5[y5.length-1]!==g)){var $="deltaY"in B?U9t(B):Tie(B),j=i.current.filter(function(ee){return ee.name===B.type&&(ee.target===B.target||B.target===ee.shadowParent)&&v7n(ee.delta,$)})[0];if(j&&j.should){B.cancelable&&B.preventDefault();return}if(!j){var P=(b.current.shards||[]).map(H9t).filter(Boolean).filter(function(ee){return ee.contains(B.target)}),G=P.length>0?w(B,P[0]):!b.current.noIsolation;G&&B.cancelable&&B.preventDefault()}}},[]),S=H.useCallback(function(D,B,$,j){var P={name:D,delta:B,target:$,should:j,shadowParent:A7n($)};i.current.push(P),setTimeout(function(){i.current=i.current.filter(function(G){return G!==P})},1)},[]),x=H.useCallback(function(D){s.current=Tie(D),c.current=void 0},[]),A=H.useCallback(function(D){S(D.type,U9t(D),D.target,w(D,n.lockRef.current))},[]),C=H.useCallback(function(D){S(D.type,Tie(D),D.target,w(D,n.lockRef.current))},[]);H.useEffect(function(){return y5.push(g),n.setCallbacks({onScrollCapture:A,onWheelCapture:A,onTouchMoveCapture:C}),document.addEventListener("wheel",E,w5),document.addEventListener("touchmove",E,w5),document.addEventListener("touchstart",x,w5),function(){y5=y5.filter(function(D){return D!==g}),document.removeEventListener("wheel",E,w5),document.removeEventListener("touchmove",E,w5),document.removeEventListener("touchstart",x,w5)}},[]);var R=n.removeScrollBar,L=n.inert;return H.createElement(H.Fragment,null,L?H.createElement(g,{styles:E7n(d)}):null,R?H.createElement(f7n,{noRelative:n.noRelative,gapMode:n.gapMode}):null)}function A7n(n){for(var i=null;n!==null;)n instanceof ShadowRoot&&(i=n.host,n=n.host),n=n.parentNode;return i}const _7n=Qjn(kGt,T7n);var Iz=H.forwardRef(function(n,i){return H.createElement(aae,O2({},n,{ref:i,sideCar:_7n}))});Iz.classNames=aae.classNames;var x7n=function(n){if(typeof document>"u")return null;var i=Array.isArray(n)?n[0]:n;return i.ownerDocument.body},v5=new WeakMap,Aie=new WeakMap,_ie={},tIe=0,OGt=function(n){return n&&(n.host||OGt(n.parentNode))},k7n=function(n,i){return i.map(function(s){if(n.contains(s))return s;var c=OGt(s);return c&&n.contains(c)?c:(console.error("aria-hidden",s,"in not contained inside",n,". Doing nothing"),null)}).filter(function(s){return!!s})},N7n=function(n,i,s,c){var d=k7n(i,Array.isArray(n)?n:[n]);_ie[s]||(_ie[s]=new WeakMap);var g=_ie[s],b=[],w=new Set,E=new Set(d),S=function(A){!A||w.has(A)||(w.add(A),S(A.parentNode))};d.forEach(S);var x=function(A){!A||E.has(A)||Array.prototype.forEach.call(A.children,function(C){if(w.has(C))x(C);else try{var R=C.getAttribute(c),L=R!==null&&R!=="false",D=(v5.get(C)||0)+1,B=(g.get(C)||0)+1;v5.set(C,D),g.set(C,B),b.push(C),D===1&&L&&Aie.set(C,!0),B===1&&C.setAttribute(s,"true"),L||C.setAttribute(c,"true")}catch($){console.error("aria-hidden: cannot operate on ",C,$)}})};return x(i),w.clear(),tIe++,function(){b.forEach(function(A){var C=v5.get(A)-1,R=g.get(A)-1;v5.set(A,C),g.set(A,R),C||(Aie.has(A)||A.removeAttribute(c),Aie.delete(A)),R||A.removeAttribute(s)}),tIe--,tIe||(v5=new WeakMap,v5=new WeakMap,Aie=new WeakMap,_ie={})}},uae=function(n,i,s){s===void 0&&(s="data-aria-hidden");var c=Array.from(Array.isArray(n)?n:[n]),d=x7n(n);return d?(c.push.apply(c,Array.from(d.querySelectorAll("[aria-live], script"))),N7n(c,d,s,"aria-hidden")):function(){return null}};function C7n(n){const i=I7n(n),s=H.forwardRef((c,d)=>{const{children:g,...b}=c,w=H.Children.toArray(g),E=w.find(O7n);if(E){const S=E.props.children,x=w.map(A=>A===E?H.Children.count(S)>1?H.Children.only(null):H.isValidElement(S)?S.props.children:null:A);return I.jsx(i,{...b,ref:d,children:H.isValidElement(S)?H.cloneElement(S,void 0,x):null})}return I.jsx(i,{...b,ref:d,children:g})});retu
Line truncated
|
||||
|
||||
If you want to hide the \`${i.titleName}\`, you can wrap it with our VisuallyHidden component.
|
||||
|
||||
For more information, see https://radix-ui.com/primitives/docs/components/${i.docsSlug}`;return H.useEffect(()=>{n&&(document.getElementById(n)||console.error(s))},[s,n]),null},z7n="DialogDescriptionWarning",G7n=({contentRef:n,descriptionId:i})=>{const c=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${WGt(z7n).contentName}}.`;return H.useEffect(()=>{var g;const d=(g=n.current)==null?void 0:g.getAttribute("aria-describedby");i&&d&&(document.getElementById(i)||console.warn(c))},[c,n,i]),null},KGt=LGt,YGt=jGt,z5e=FGt,G5e=$Gt,JGt=UGt,XGt=zGt,q7n=qGt,V7n=Symbol.for("react.lazy"),Joe=ILe[" use ".trim().toString()];function W7n(n){return typeof n=="object"&&n!==null&&"then"in n}function ZGt(n){return n!=null&&typeof n=="object"&&"$$typeof"in n&&n.$$typeof===V7n&&"_payload"in n&&W7n(n._payload)}function lae(n){const i=Y7n(n),s=H.forwardRef((c,d)=>{let{children:g,...b}=c;ZGt(g)&&typeof Joe=="function"&&(g=Joe(g._payload));const w=H.Children.toArray(g),E=w.find(X7n);if(E){const S=E.props.children,x=w.map(A=>A===E?H.Children.count(S)>1?H.Children.only(null):H.isValidElement(S)?S.props.children:null:A);return I.jsx(i,{...b,ref:d,children:H.isValidElement(S)?H.cloneElement(S,void 0,x):null})}return I.jsx(i,{...b,ref:d,children:g})});return s.displayName=`${n}.Slot`,s}var K7n=lae("Slot");function Y7n(n){const i=H.forwardRef((s,c)=>{let{children:d,...g}=s;if(ZGt(d)&&typeof Joe=="function"&&(d=Joe(d._payload)),H.isValidElement(d)){const b=Q7n(d),w=Z7n(g,d.props);return d.type!==H.Fragment&&(w.ref=c?zg(c,b):b),H.cloneElement(d,w)}return H.Children.count(d)>1?H.Children.only(null):null});return i.displayName=`${n}.SlotClone`,i}var J7n=Symbol("radix.slottable");function X7n(n){return H.isValidElement(n)&&typeof n.type=="function"&&"__radixId"in n.type&&n.type.__radixId===J7n}function Z7n(n,i){const s={...i};for(const c in i){const d=n[c],g=i[c];/^on[A-Z]/.test(c)?d&&g?s[c]=(...w)=>{const E=g(...w);return d(...w),E}:d&&(s[c]=d):c==="style"?s[c]={...d,...g}:c==="className"&&(s[c]=[d,g].filter(Boolean).join(" "))}return{...n,...s}}function Q7n(n){var c,d;let i=(c=Object.getOwnPropertyDescriptor(n.props,"ref"))==null?void 0:c.get,s=i&&"isReactWarning"in i&&i.isReactWarning;return s?n.ref:(i=(d=Object.getOwnPropertyDescriptor(n,"ref"))==null?void 0:d.get,s=i&&"isReactWarning"in i&&i.isReactWarning,s?n.props.ref:n.props.ref||n.ref)}var eFn=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],vN=eFn.reduce((n,i)=>{const s=lae(`Primitive.${i}`),c=H.forwardRef((d,g)=>{const{asChild:b,...w}=d,E=b?s:i;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),I.jsx(E,{...w,ref:g})});return c.displayName=`Primitive.${i}`,{...n,[i]:c}},{}),BU='[cmdk-group=""]',nIe='[cmdk-group-items=""]',tFn='[cmdk-group-heading=""]',QGt='[cmdk-item=""]',z9t=`${QGt}:not([aria-disabled="true"])`,TDe="cmdk-item-select",A5="data-value",nFn=(n,i,s)=>ljn(n,i,s),eqt=H.createContext(void 0),Rz=()=>H.useContext(eqt),tqt=H.createContext(void 0),q5e=()=>H.useContext(tqt),nqt=H.createContext(void 0),rqt=H.forwardRef((n,i)=>{let s=_5(()=>{var Ue,bt;return{search:"",value:(bt=(Ue=n.value)!=null?Ue:n.defaultValue)!=null?bt:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),c=_5(()=>new Set),d=_5(()=>new Map),g=_5(()=>new Map),b=_5(()=>new Set),w=iqt(n),{label:E,children:S,value:x,onValueChange:A,filter:C,shouldFilter:R,loop:L,disablePointerSelection:D=!1,vimBindings:B=!0,...$}=n,j=Bh(),P=Bh(),G=Bh(),ee=H.useRef(null),re=hFn();mR(()=>{if(x!==void 0){let Ue=x.trim();s.current.value=Ue,Q.emit()}},[x]),mR(()=>{re(6,K)},[]);let Q=H.useMemo(()=>({subscribe:Ue=>(b.current.add(Ue),()=>b.current.delete(Ue)),snapshot:()=>s.current,setState:(Ue,bt,kt)=>{var ht,Xt,vt,Ct;if(!Object.is(s.current[Ue],bt)){if(s.current[Ue]=bt,Ue==="search")fe(),me(),re(1,le);else if(Ue==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let Ft=document.getElementById(G);Ft?Ft.focus():(ht=document.getElementById(j))==null||ht.focus()}if(re(7,()=>{var Ft;s.current.selectedItemId=(Ft=he())==null?void 0:Ft.id,Q.emit()}),kt||re(5,K),((Xt=w.current)==null?void 0:Xt.value)!==void 0){let Ft=bt??"";(Ct=(vt=w.current).onValueChange)==null||Ct.call(vt,Ft);return}}Q.emit()}},emit:()=>{b.current.forEach(Ue=>Ue())}}),[]),ie=H.useMemo(()=>({value:(Ue,bt,kt)=>{var ht;bt!==((ht=g.current.get(Ue))==null?void 0:ht.value)&&(g.current.set(Ue,{value:bt,keywords:kt}),s.current.filtered.items.set(Ue,pe(bt,kt)),re(2,()=>{me(),Q.emit()}))},item:(Ue,bt)=>(c.current.add(Ue),bt&&(d.current.has(bt)?d.current.get(bt).add(Ue):d.current.set(bt,new Set([Ue]))),re(3,()=>{fe(),me(),s.current.value||le(),Q.emit()}),()=>{g.current.delete(Ue),c.current.delete(Ue),s.current.filtered.items.delete(Ue);let kt=he();re(4,()=>{fe(),(kt==null?void 0:kt.getAttribute("id"))===Ue&&le(),Q.emit()})}),group:Ue=>(d.current.has(Ue)||d.current.set(Ue,new Set),()=>{g.current.delete(Ue)
Line truncated
|
||||
`).filter(b=>b),d=Math.min(...c.map(b=>b.length-b.trimStart().length)),g=c.map(b=>b.slice(d)).map(b=>" ".repeat(this.indent*2)+b);for(const b of g)this.content.push(b)}compile(){const i=Function,s=this==null?void 0:this.args,d=[...((this==null?void 0:this.content)??[""]).map(g=>` ${g}`)];return new i(...s,d.join(`
|
||||
`))}}const RHn={major:4,minor:3,patch:5},Ku=cn("$ZodType",(n,i)=>{var d;var s;n??(n={}),n._zod.def=i,n._zod.bag=n._zod.bag||{},n._zod.version=RHn;const c=[...n._zod.def.checks??[]];n._zod.traits.has("$ZodCheck")&&c.unshift(n);for(const g of c)for(const b of g._zod.onattach)b(n);if(c.length===0)(s=n._zod).deferred??(s.deferred=[]),(d=n._zod.deferred)==null||d.push(()=>{n._zod.run=n._zod.parse});else{const g=(w,E,S)=>{let x=G5(w),A;for(const C of E){if(C._zod.def.when){if(!C._zod.def.when(w))continue}else if(x)continue;const R=w.issues.length,L=C._zod.check(w);if(L instanceof Promise&&(S==null?void 0:S.async)===!1)throw new sM;if(A||L instanceof Promise)A=(A??Promise.resolve()).then(async()=>{await L,w.issues.length!==R&&(x||(x=G5(w,R)))});else{if(w.issues.length===R)continue;x||(x=G5(w,R))}}return A?A.then(()=>w):w},b=(w,E,S)=>{if(G5(w))return w.aborted=!0,w;const x=g(E,c,S);if(x instanceof Promise){if(S.async===!1)throw new sM;return x.then(A=>n._zod.parse(A,S))}return n._zod.parse(x,S)};n._zod.run=(w,E)=>{if(E.skipChecks)return n._zod.parse(w,E);if(E.direction==="backward"){const x=n._zod.parse({value:w.value,issues:[]},{...E,skipChecks:!0});return x instanceof Promise?x.then(A=>b(A,w,E)):b(x,w,E)}const S=n._zod.parse(w,E);if(S instanceof Promise){if(E.async===!1)throw new sM;return S.then(x=>g(x,c,E))}return g(S,c,E)}}Ys(n,"~standard",()=>({validate:g=>{var b;try{const w=PUn(n,g);return w.success?{value:w.data}:{issues:(b=w.error)==null?void 0:b.issues}}catch{return jUn(n,g).then(E=>{var S;return E.success?{value:E.data}:{issues:(S=E.error)==null?void 0:S.issues}})}},vendor:"zod",version:1}))}),hMe=cn("$ZodString",(n,i)=>{var s;Ku.init(n,i),n._zod.pattern=[...((s=n==null?void 0:n._zod.bag)==null?void 0:s.patterns)??[]].pop()??fHn(n._zod.bag),n._zod.parse=(c,d)=>{if(i.coerce)try{c.value=String(c.value)}catch{}return typeof c.value=="string"||c.issues.push({expected:"string",code:"invalid_type",input:c.value,inst:n}),c}}),Pc=cn("$ZodStringFormat",(n,i)=>{Nae.init(n,i),hMe.init(n,i)}),OHn=cn("$ZodGUID",(n,i)=>{i.pattern??(i.pattern=QUn),Pc.init(n,i)}),DHn=cn("$ZodUUID",(n,i)=>{if(i.version){const c={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[i.version];if(c===void 0)throw new Error(`Invalid UUID version: "${i.version}"`);i.pattern??(i.pattern=f8t(c))}else i.pattern??(i.pattern=f8t());Pc.init(n,i)}),LHn=cn("$ZodEmail",(n,i)=>{i.pattern??(i.pattern=eHn),Pc.init(n,i)}),MHn=cn("$ZodURL",(n,i)=>{Pc.init(n,i),n._zod.check=s=>{try{const c=s.value.trim(),d=new URL(c);i.hostname&&(i.hostname.lastIndex=0,i.hostname.test(d.hostname)||s.issues.push({code:"invalid_format",format:"url",note:"Invalid hostname",pattern:i.hostname.source,input:s.value,inst:n,continue:!i.abort})),i.protocol&&(i.protocol.lastIndex=0,i.protocol.test(d.protocol.endsWith(":")?d.protocol.slice(0,-1):d.protocol)||s.issues.push({code:"invalid_format",format:"url",note:"Invalid protocol",pattern:i.protocol.source,input:s.value,inst:n,continue:!i.abort})),i.normalize?s.value=d.href:s.value=c;return}catch{s.issues.push({code:"invalid_format",format:"url",input:s.value,inst:n,continue:!i.abort})}}}),PHn=cn("$ZodEmoji",(n,i)=>{i.pattern??(i.pattern=nHn()),Pc.init(n,i)}),jHn=cn("$ZodNanoID",(n,i)=>{i.pattern??(i.pattern=XUn),Pc.init(n,i)}),FHn=cn("$ZodCUID",(n,i)=>{i.pattern??(i.pattern=VUn),Pc.init(n,i)}),$Hn=cn("$ZodCUID2",(n,i)=>{i.pattern??(i.pattern=WUn),Pc.init(n,i)}),BHn=cn("$ZodULID",(n,i)=>{i.pattern??(i.pattern=KUn),Pc.init(n,i)}),UHn=cn("$ZodXID",(n,i)=>{i.pattern??(i.pattern=YUn),Pc.init(n,i)}),HHn=cn("$ZodKSUID",(n,i)=>{i.pattern??(i.pattern=JUn),Pc.init(n,i)}),zHn=cn("$ZodISODateTime",(n,i)=>{i.pattern??(i.pattern=dHn(i)),Pc.init(n,i)}),GHn=cn("$ZodISODate",(n,i)=>{i.pattern??(i.pattern=cHn),Pc.init(n,i)}),qHn=cn("$ZodISOTime",(n,i)=>{i.pattern??(i.pattern=lHn(i)),Pc.init(n,i)}),VHn=cn("$ZodISODuration",(n,i)=>{i.pattern??(i.pattern=ZUn),Pc.init(n,i)}),WHn=cn("$ZodIPv4",(n,i)=>{i.pattern??(i.pattern=rHn),Pc.init(n,i),n._zod.bag.format="ipv4"}),KHn=cn("$ZodIPv6",(n,i)=>{i.pattern??(i.pattern=iHn),Pc.init(n,i),n._zod.bag.format="ipv6",n._zod.check=s=>{try{new URL(`http://[${s.value}]`)}catch{s.issues.push({code:"invalid_format",format:"ipv6",input:s.value,inst:n,continue:!i.abort})}}}),YHn=cn("$ZodCIDRv4",(n,i)=>{i.pattern??(i.pattern=oHn),Pc.init(n,i)}),JHn=cn("$ZodCIDRv6",(n,i)=>{i.pattern??(i.pattern=sHn),Pc.init(n,i),n._zod.check=s=>{const c=s.value.split("/");try{if(c.length!==2)throw new Error;const[d,g]=c;if(!g)throw new Error;const b=Number(g);if(`${b}`!==g)throw new Error;if(b<0||b>128)throw new Error;new URL(`http://[${d}]`)}catch{s.issues.push({code:"invalid_format",format:"cidrv6",input:s.value,inst:n,continue:!i.abort})}}});function yVt(n){if(n==="")return!0;if(n.length%4!==0)return!1;try{return atob(n),!0}catch{return!1}}const XHn=cn("$ZodBase64",(n,i)=>{i.pattern??(i.pattern=aHn),Pc.init(n,i),n._zod.bag.contentEncoding="base64",n._zod.check=s=>{yVt(s.value)||s.issues.push({code:"invalid_format",format:"base64",input:s.value,inst:
Line truncated
|
||||
if (${ee}.issues.length) {
|
||||
if (${re} in input) {
|
||||
payload.issues = payload.issues.concat(${ee}.issues.map(iss => ({
|
||||
...iss,
|
||||
path: iss.path ? [${re}, ...iss.path] : [${re}]
|
||||
})));
|
||||
}
|
||||
}
|
||||
|
||||
if (${ee}.value === undefined) {
|
||||
if (${re} in input) {
|
||||
newResult[${re}] = undefined;
|
||||
}
|
||||
} else {
|
||||
newResult[${re}] = ${ee}.value;
|
||||
}
|
||||
|
||||
`):R.write(`
|
||||
if (${ee}.issues.length) {
|
||||
payload.issues = payload.issues.concat(${ee}.issues.map(iss => ({
|
||||
...iss,
|
||||
path: iss.path ? [${re}, ...iss.path] : [${re}]
|
||||
})));
|
||||
}
|
||||
|
||||
if (${ee}.value === undefined) {
|
||||
if (${re} in input) {
|
||||
newResult[${re}] = undefined;
|
||||
}
|
||||
} else {
|
||||
newResult[${re}] = ${ee}.value;
|
||||
}
|
||||
|
||||
`)}R.write("payload.value = newResult;"),R.write("return payload;");const j=R.compile();return(G,ee)=>j(C,G,ee)};let g;const b=iz,w=!oVt.jitless,S=w&&TUn.value,x=i.catchall;let A;n._zod.parse=(C,R)=>{A??(A=c.value);const L=C.value;return b(L)?w&&S&&(R==null?void 0:R.async)===!1&&R.jitless!==!0?(g||(g=d(i.shape)),C=g(C,R),x?SVt([],L,C,R,A,n):C):s(C,R):(C.issues.push({expected:"object",code:"invalid_type",input:L,inst:n}),C)}});function p8t(n,i,s,c){for(const g of n)if(g.issues.length===0)return i.value=g.value,i;const d=n.filter(g=>!G5(g));return d.length===1?(i.value=d[0].value,d[0]):(i.issues.push({code:"invalid_union",input:i.value,inst:s,errors:n.map(g=>g.issues.map(b=>pN(b,c,hN())))}),i)}const TVt=cn("$ZodUnion",(n,i)=>{Ku.init(n,i),Ys(n._zod,"optin",()=>i.options.some(d=>d._zod.optin==="optional")?"optional":void 0),Ys(n._zod,"optout",()=>i.options.some(d=>d._zod.optout==="optional")?"optional":void 0),Ys(n._zod,"values",()=>{if(i.options.every(d=>d._zod.values))return new Set(i.options.flatMap(d=>Array.from(d._zod.values)))}),Ys(n._zod,"pattern",()=>{if(i.options.every(d=>d._zod.pattern)){const d=i.options.map(g=>g._zod.pattern);return new RegExp(`^(${d.map(g=>cMe(g.source)).join("|")})$`)}});const s=i.options.length===1,c=i.options[0]._zod.run;n._zod.parse=(d,g)=>{if(s)return c(d,g);let b=!1;const w=[];for(const E of i.options){const S=E._zod.run({value:d.value,issues:[]},g);if(S instanceof Promise)w.push(S),b=!0;else{if(S.issues.length===0)return S;w.push(S)}}return b?Promise.all(w).then(E=>p8t(E,d,n,g)):p8t(w,d,n,g)}}),fzn=cn("$ZodDiscriminatedUnion",(n,i)=>{i.inclusive=!1,TVt.init(n,i);const s=n._zod.parse;Ys(n._zod,"propValues",()=>{const d={};for(const g of i.options){const b=g._zod.propValues;if(!b||Object.keys(b).length===0)throw new Error(`Invalid discriminated union option at index "${i.options.indexOf(g)}"`);for(const[w,E]of Object.entries(b)){d[w]||(d[w]=new Set);for(const S of E)d[w].add(S)}}return d});const c=_ae(()=>{var b;const d=i.options,g=new Map;for(const w of d){const E=(b=w._zod.propValues)==null?void 0:b[i.discriminator];if(!E||E.size===0)throw new Error(`Invalid discriminated union option at index "${i.options.indexOf(w)}"`);for(const S of E){if(g.has(S))throw new Error(`Duplicate discriminator value "${String(S)}"`);g.set(S,w)}}return g});n._zod.parse=(d,g)=>{const b=d.value;if(!iz(b))return d.issues.push({code:"invalid_type",expected:"object",input:b,inst:n}),d;const w=c.value.get(b==null?void 0:b[i.discriminator]);return w?w._zod.run(d,g):i.unionFallback?s(d,g):(d.issues.push({code:"invalid_union",errors:[],note:"No matching discriminator",discriminator:i.discriminator,input:b,path:[i.discriminator],inst:n}),d)}}),hzn=cn("$ZodIntersection",(n,i)=>{Ku.init(n,i),n._zod.parse=(s,c)=>{const d=s.value,g=i.left._zod.run({value:d,issues:[]},c),b=i.right._zod.run({value:d,issues:[]},c);return g instanceof Promise||b instanceof Promise?Promise.all([g,b]).then(([E,S])=>g8t(s,E,S)):g8t(s,g,b)}});function MDe(n,i){if(n===i)return{valid:!0,data:n};if(n instanceof Date&&i instanceof Date&&+n==+i)return{valid:!0,data:n};if(NM(n)&&NM(i)){const s=Object.keys(i),c=Object.keys(n).filter(g=>s.indexOf(g)!==-1),d={...n,...i};for(const g of c){const b=MDe(n[g],i[g]);if(!b.valid)return{valid:!1,mergeErrorPath:[g,...b.mergeErrorPath]};d[g]=b.data}return{valid:!0,data:d}}if(Array.isArray(n)&&Array.isArray(i)){if(n.length!==i.length)return{valid:!1,mergeErrorPath:[]};const s=[];for(let c=0;c<n.length;c++){const d=n[c],g=i[c],b=MDe(d,g);if(!b.valid)return{valid:!1,mergeErrorPath:[c,...b.mergeErrorPath]};s.push(b.data)}return{valid:!0,data:s}}return{valid:!1,mergeErrorPath:[]}}function g8t(n,i,s){const c=new Map;let d;for(const w of i.issues)if(w.code==="unrecognized_keys"){d??(d=w);for(const E of w.keys)c.has(E)||c.set(E,{}),c.get(E).l=!0}else n.issues.push(w);for(const w of s.issues)if(w.code==="unrecognized_keys")for(const E of w.keys)c.has(E)||c.set(E,{}),c.get(E).r=!0;else n.issues.push(w);const g=[...c].filter(([,w])=>w.l&&w.r).map(([w])=>w);if(g.length&&d&&n.issues.push({...d,keys:g}),G5(n))return n;const b=MDe(i.value,s.value);if(!b.valid)throw new Error(`Unmergable intersection. Error path: ${JSON.stringify(b.mergeErrorPath)}`);return n.value=b.data,n}const pzn=cn("$ZodRecord",(n,i)=>{Ku.init(n,i),n._zod.parse=(s,c)=>{const d=s.value;if(!NM(d))return s.issues.push({expected:"record",code:"invalid_type",input:d,inst:n}),s;const g=[],b=i.keyType._zod.values;if(b){s.value={};const w=new Set;for(const S of b)if(typeof S=="string"||typeof S=="number"||typeof S=="symbol"){w.add(typeof S=="number"?S.toString():S);const x=i.valueType._zod.run({value:d[S],issues:[]},c);x instanceof Promise?g.push(x.then(A=>{A.issues.length&&s.issues.push(...q5(S,A.issues)),s.value[S]=A.value})):(x.issues.length&&s.issues.push(...q5(S,x.issues)),s.value[S]=x.value)}let E;for(const S in d)w.has(S)||(E=E??[],E.push(S));E&&E.length>0&&s.issues.push({code:"unrecognized_keys",input:d,inst:n,keys:E})}else{s.value={};for
Line truncated
|
||||
|
||||
Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(const x of n.seen.entries()){const A=x[1];if(i===x[0]){g(x);continue}if(n.external){const R=(E=n.external.registry.get(x[0]))==null?void 0:E.id;if(i!==x[0]&&R){g(x);continue}}if((S=n.metadataRegistry.get(x[0]))==null?void 0:S.id){g(x);continue}if(A.cycle){g(x);continue}if(A.count>1&&n.reused==="ref"){g(x);continue}}}function CVt(n,i){var b,w,E;const s=n.seen.get(i);if(!s)throw new Error("Unprocessed schema. This is a bug in Zod.");const c=S=>{const x=n.seen.get(S);if(x.ref===null)return;const A=x.def??x.schema,C={...A},R=x.ref;if(x.ref=null,R){c(R);const D=n.seen.get(R),B=D.schema;if(B.$ref&&(n.target==="draft-07"||n.target==="draft-04"||n.target==="openapi-3.0")?(A.allOf=A.allOf??[],A.allOf.push(B)):Object.assign(A,B),Object.assign(A,C),S._zod.parent===R)for(const j in A)j==="$ref"||j==="allOf"||j in C||delete A[j];if(B.$ref)for(const j in A)j==="$ref"||j==="allOf"||j in D.def&&JSON.stringify(A[j])===JSON.stringify(D.def[j])&&delete A[j]}const L=S._zod.parent;if(L&&L!==R){c(L);const D=n.seen.get(L);if(D!=null&&D.schema.$ref&&(A.$ref=D.schema.$ref,D.def))for(const B in A)B==="$ref"||B==="allOf"||B in D.def&&JSON.stringify(A[B])===JSON.stringify(D.def[B])&&delete A[B]}n.override({zodSchema:S,jsonSchema:A,path:x.path??[]})};for(const S of[...n.seen.entries()].reverse())c(S[0]);const d={};if(n.target==="draft-2020-12"?d.$schema="https://json-schema.org/draft/2020-12/schema":n.target==="draft-07"?d.$schema="http://json-schema.org/draft-07/schema#":n.target==="draft-04"?d.$schema="http://json-schema.org/draft-04/schema#":n.target,(b=n.external)!=null&&b.uri){const S=(w=n.external.registry.get(i))==null?void 0:w.id;if(!S)throw new Error("Schema is missing an `id` property");d.$id=n.external.uri(S)}Object.assign(d,s.def??s.schema);const g=((E=n.external)==null?void 0:E.defs)??{};for(const S of n.seen.entries()){const x=S[1];x.def&&x.defId&&(g[x.defId]=x.def)}n.external||Object.keys(g).length>0&&(n.target==="draft-2020-12"?d.$defs=g:d.definitions=g);try{const S=JSON.parse(JSON.stringify(d));return Object.defineProperty(S,"~standard",{value:{...i["~standard"],jsonSchema:{input:sse(i,"input",n.processors),output:sse(i,"output",n.processors)}},enumerable:!1,writable:!1}),S}catch{throw new Error("Error converting schema to JSON.")}}function $g(n,i){const s=i??{seen:new Set};if(s.seen.has(n))return!1;s.seen.add(n);const c=n._zod.def;if(c.type==="transform")return!0;if(c.type==="array")return $g(c.element,s);if(c.type==="set")return $g(c.valueType,s);if(c.type==="lazy")return $g(c.getter(),s);if(c.type==="promise"||c.type==="optional"||c.type==="nonoptional"||c.type==="nullable"||c.type==="readonly"||c.type==="default"||c.type==="prefault")return $g(c.innerType,s);if(c.type==="intersection")return $g(c.left,s)||$g(c.right,s);if(c.type==="record"||c.type==="map")return $g(c.keyType,s)||$g(c.valueType,s);if(c.type==="pipe")return $g(c.in,s)||$g(c.out,s);if(c.type==="object"){for(const d in c.shape)if($g(c.shape[d],s))return!0;return!1}if(c.type==="union"){for(const d of c.options)if($g(d,s))return!0;return!1}if(c.type==="tuple"){for(const d of c.items)if($g(d,s))return!0;return!!(c.rest&&$g(c.rest,s))}return!1}const AGn=(n,i={})=>s=>{const c=kVt({...s,processors:i});return gd(n,c),NVt(c,n),CVt(c,n)},sse=(n,i,s={})=>c=>{const{libraryOptions:d,target:g}=c??{},b=kVt({...d??{},target:g,io:i,processors:s});return gd(n,b),NVt(b,n),CVt(b,n)},_Gn={guid:"uuid",url:"uri",datetime:"date-time",json_string:"json-string",regex:""},xGn=(n,i,s,c)=>{const d=s;d.type="string";const{minimum:g,maximum:b,format:w,patterns:E,contentEncoding:S}=n._zod.bag;if(typeof g=="number"&&(d.minLength=g),typeof b=="number"&&(d.maxLength=b),w&&(d.format=_Gn[w]??w,d.format===""&&delete d.format,w==="time"&&delete d.format),S&&(d.contentEncoding=S),E&&E.size>0){const x=[...E];x.length===1?d.pattern=x[0].source:x.length>1&&(d.allOf=[...x.map(A=>({...i.target==="draft-07"||i.target==="draft-04"||i.target==="openapi-3.0"?{type:"string"}:{},pattern:A.source}))])}},kGn=(n,i,s,c)=>{const d=s,{minimum:g,maximum:b,format:w,multipleOf:E,exclusiveMaximum:S,exclusiveMinimum:x}=n._zod.bag;typeof w=="string"&&w.includes("int")?d.type="integer":d.type="number",typeof x=="number"&&(i.target==="draft-04"||i.target==="openapi-3.0"?(d.minimum=x,d.exclusiveMinimum=!0):d.exclusiveMinimum=x),typeof g=="number"&&(d.minimum=g,typeof x=="number"&&i.target!=="draft-04"&&(x>=g?delete d.minimum:delete d.exclusiveMinimum)),typeof S=="number"&&(i.target==="draft-04"||i.target==="openapi-3.0"?(d.maximum=S,d.exclusiveMaximum=!0):d.exclusiveMaximum=S),typeof b=="number"&&(d.maximum=b,typeof S=="number"&&i.target!=="draft-04"&&(S<=b?delete d.maximum:delete d.exclusiveMaximum)),typeof E=="number"&&(d.multipleOf=E)},NGn=(n,i,s,c)=>{s.type="boolean"},CGn=(n,i,s,c)=>{i.target==="openapi-3.0"?(s.type="string",s.nullable=!0,s.enum=[null]):s.type="null"},IGn=(n,i,s,c)=>{s.not={}},RGn=(n,i,s,c)=>{},OGn=(n,i,s,c)=Line truncated
|
||||
|
||||
`+n.mark.snippet),c+" "+s):c}function sz(n,i){Error.call(this),this.name="YAMLException",this.reason=n,this.mark=i,this.message=xWt(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}sz.prototype=Object.create(Error.prototype);sz.prototype.constructor=sz;sz.prototype.toString=function(i){return this.name+": "+xWt(this,i)};var ib=sz;function FOe(n,i,s,c,d){var g="",b="",w=Math.floor(d/2)-1;return c-i>w&&(g=" ... ",i=c-w+g.length),s-c>w&&(b=" ...",s=c+w-b.length),{str:g+n.slice(i,s).replace(/\t/g,"→")+b,pos:c-i+g.length}}function $Oe(n,i){return vf.repeat(" ",i-n.length)+n}function bJn(n,i){if(i=Object.create(i||null),!n.buffer)return null;i.maxLength||(i.maxLength=79),typeof i.indent!="number"&&(i.indent=1),typeof i.linesBefore!="number"&&(i.linesBefore=3),typeof i.linesAfter!="number"&&(i.linesAfter=2);for(var s=/\r?\n|\r|\0/g,c=[0],d=[],g,b=-1;g=s.exec(n.buffer);)d.push(g.index),c.push(g.index+g[0].length),n.position<=g.index&&b<0&&(b=c.length-2);b<0&&(b=c.length-1);var w="",E,S,x=Math.min(n.line+i.linesAfter,d.length).toString().length,A=i.maxLength-(i.indent+x+3);for(E=1;E<=i.linesBefore&&!(b-E<0);E++)S=FOe(n.buffer,c[b-E],d[b-E],n.position-(c[b]-c[b-E]),A),w=vf.repeat(" ",i.indent)+$Oe((n.line-E+1).toString(),x)+" | "+S.str+`
|
||||
`+w;for(S=FOe(n.buffer,c[b],d[b],n.position,A),w+=vf.repeat(" ",i.indent)+$Oe((n.line+1).toString(),x)+" | "+S.str+`
|
||||
`,w+=vf.repeat("-",i.indent+x+3+S.pos)+`^
|
||||
`,E=1;E<=i.linesAfter&&!(b+E>=d.length);E++)S=FOe(n.buffer,c[b+E],d[b+E],n.position-(c[b]-c[b+E]),A),w+=vf.repeat(" ",i.indent)+$Oe((n.line+E+1).toString(),x)+" | "+S.str+`
|
||||
`;return w.replace(/\n$/,"")}var mJn=bJn,wJn=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],yJn=["scalar","sequence","mapping"];function vJn(n){var i={};return n!==null&&Object.keys(n).forEach(function(s){n[s].forEach(function(c){i[String(c)]=s})}),i}function EJn(n,i){if(i=i||{},Object.keys(i).forEach(function(s){if(wJn.indexOf(s)===-1)throw new ib('Unknown option "'+s+'" is met in definition of "'+n+'" YAML type.')}),this.options=i,this.tag=n,this.kind=i.kind||null,this.resolve=i.resolve||function(){return!0},this.construct=i.construct||function(s){return s},this.instanceOf=i.instanceOf||null,this.predicate=i.predicate||null,this.represent=i.represent||null,this.representName=i.representName||null,this.defaultStyle=i.defaultStyle||null,this.multi=i.multi||!1,this.styleAliases=vJn(i.styleAliases||null),yJn.indexOf(this.kind)===-1)throw new ib('Unknown kind "'+this.kind+'" is specified for "'+n+'" YAML type.')}var Bp=EJn;function SFt(n,i){var s=[];return n[i].forEach(function(c){var d=s.length;s.forEach(function(g,b){g.tag===c.tag&&g.kind===c.kind&&g.multi===c.multi&&(d=b)}),s[d]=c}),s}function SJn(){var n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},i,s;function c(d){d.multi?(n.multi[d.kind].push(d),n.multi.fallback.push(d)):n[d.kind][d.tag]=n.fallback[d.tag]=d}for(i=0,s=arguments.length;i<s;i+=1)arguments[i].forEach(c);return n}function jDe(n){return this.extend(n)}jDe.prototype.extend=function(i){var s=[],c=[];if(i instanceof Bp)c.push(i);else if(Array.isArray(i))c=c.concat(i);else if(i&&(Array.isArray(i.implicit)||Array.isArray(i.explicit)))i.implicit&&(s=s.concat(i.implicit)),i.explicit&&(c=c.concat(i.explicit));else throw new ib("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");s.forEach(function(g){if(!(g instanceof Bp))throw new ib("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(g.loadKind&&g.loadKind!=="scalar")throw new ib("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(g.multi)throw new ib("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),c.forEach(function(g){if(!(g instanceof Bp))throw new ib("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var d=Object.create(jDe.prototype);return d.implicit=(this.implicit||[]).concat(s),d.explicit=(this.explicit||[]).concat(c),d.compiledImplicit=SFt(d,"implicit"),d.compiledExplicit=SFt(d,"explicit"),d.compiledTypeMap=SJn(d.compiledImplicit,d.compiledExplicit),d};var TJn=jDe,AJn=new Bp("tag:yaml.org,2002:str",{kind:"scalar",construct:function(n){return n!==null?n:""}}),_Jn=new Bp("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(n){return n!==null?n:[]}}),xJn=new Bp("tag:yaml.org,2002:map",{kind:"mapping",construct:function(n){return n!==null?n:{}}}),kJn=new TJn({explicit:[AJn,_Jn,xJn]});function NJn(n){if(n===null)return!0;var i=n.length;return i===1&&n==="~"||i===4&&(n==="null"||n==="Null"||n==="NULL")}function CJn(){return null}function IJn(n){return n===null}var RJn=new Bp("tag:yaml.org,2002:null",{kind:"scalar",resolve:NJn,construct:CJn,predicate:IJn,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});function OJn(n){if(n===null)return!1;var i=n.length;return i===4&&(n==="true"||n==="True"||n==="TRUE")||i===5&&(n==="false"||n==="False"||n==="FALSE")}function DJn(n){return n==="true"||n==="True"||n==="TRUE"}function LJn(n){return Object.prototype.toString.call(n)==="[object Boolean]"}var MJn=new Bp("tag:yaml.org,2002:bool",{kind:"scalar",resolve:OJn,construct:DJn,predicate:LJn,represent:{lowercase:function(n){return n?"true":"false"},uppercase:function(n){return n?"TRUE":"FALSE"},camelcase:function(n){return n?"True":"False"}},defaultStyle:"lowercase"});function PJn(n){return 48<=n&&n<=57||65<=n&&n<=70||97<=n&&n<=102}function jJn(n){return 48<=n&&n<=55}function FJn(n){return 48<=n&&n<=57}function $Jn(n){if(n===null)return!1;var i=n.length,s=0,c=!1,d;if(!i)return!1;if(d=n[s],(d==="-"||d==="+")&&(d=n[++s]),d==="0"){if(s+1===i)return!0;if(d=n[++s],d==="b"){for(s++;s<i;s++)if(d=n[s],d!=="_"){if(d!=="0"&&d!=="1")return!1;c=!0}return c&&d!=="_"}if(d==="x"){for(s++;s<i;s++)if(d=n[s],d!=="_"){if(!PJn(n.charCodeAt(s)))return!1;c=!0}return c&&d!=="_"}if(d==="o"){for(s++;s<i;s++)if(d=n[s],d!=="_"){if(!jJn(n.charCodeAt(s)))return!1;c=!0}return c&&d!=="_"}}if(d==="_")return!1;for(;s<i;s++)if(d=n[s],d!=="_"){if(!FJn(n.charCodeAt(s)))return!1;c=!0}return!(!c||d==="_")}function BJn(n){var i=n,s=1,c;if(i.indexOf("_")!==-1&&(i=i.replace(/_/g,"")),c=i[0],(c==="-"||c==="+")&&(c==="-"&&(s=-1),i=i.slice(1),c=i[0]),i==="0")retur
Line truncated
|
||||
\r`;function iXn(n){if(n===null)return!1;var i,s,c=0,d=n.length,g=PMe;for(s=0;s<d;s++)if(i=g.indexOf(n.charAt(s)),!(i>64)){if(i<0)return!1;c+=6}return c%8===0}function oXn(n){var i,s,c=n.replace(/[\r\n=]/g,""),d=c.length,g=PMe,b=0,w=[];for(i=0;i<d;i++)i%4===0&&i&&(w.push(b>>16&255),w.push(b>>8&255),w.push(b&255)),b=b<<6|g.indexOf(c.charAt(i));return s=d%4*6,s===0?(w.push(b>>16&255),w.push(b>>8&255),w.push(b&255)):s===18?(w.push(b>>10&255),w.push(b>>2&255)):s===12&&w.push(b>>4&255),new Uint8Array(w)}function sXn(n){var i="",s=0,c,d,g=n.length,b=PMe;for(c=0;c<g;c++)c%3===0&&c&&(i+=b[s>>18&63],i+=b[s>>12&63],i+=b[s>>6&63],i+=b[s&63]),s=(s<<8)+n[c];return d=g%3,d===0?(i+=b[s>>18&63],i+=b[s>>12&63],i+=b[s>>6&63],i+=b[s&63]):d===2?(i+=b[s>>10&63],i+=b[s>>4&63],i+=b[s<<2&63],i+=b[64]):d===1&&(i+=b[s>>2&63],i+=b[s<<4&63],i+=b[64],i+=b[64]),i}function aXn(n){return Object.prototype.toString.call(n)==="[object Uint8Array]"}var uXn=new Bp("tag:yaml.org,2002:binary",{kind:"scalar",resolve:iXn,construct:oXn,predicate:aXn,represent:sXn}),cXn=Object.prototype.hasOwnProperty,lXn=Object.prototype.toString;function dXn(n){if(n===null)return!0;var i=[],s,c,d,g,b,w=n;for(s=0,c=w.length;s<c;s+=1){if(d=w[s],b=!1,lXn.call(d)!=="[object Object]")return!1;for(g in d)if(cXn.call(d,g))if(!b)b=!0;else return!1;if(!b)return!1;if(i.indexOf(g)===-1)i.push(g);else return!1}return!0}function fXn(n){return n!==null?n:[]}var hXn=new Bp("tag:yaml.org,2002:omap",{kind:"sequence",resolve:dXn,construct:fXn}),pXn=Object.prototype.toString;function gXn(n){if(n===null)return!0;var i,s,c,d,g,b=n;for(g=new Array(b.length),i=0,s=b.length;i<s;i+=1){if(c=b[i],pXn.call(c)!=="[object Object]"||(d=Object.keys(c),d.length!==1))return!1;g[i]=[d[0],c[d[0]]]}return!0}function bXn(n){if(n===null)return[];var i,s,c,d,g,b=n;for(g=new Array(b.length),i=0,s=b.length;i<s;i+=1)c=b[i],d=Object.keys(c),g[i]=[d[0],c[d[0]]];return g}var mXn=new Bp("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:gXn,construct:bXn}),wXn=Object.prototype.hasOwnProperty;function yXn(n){if(n===null)return!0;var i,s=n;for(i in s)if(wXn.call(s,i)&&s[i]!==null)return!1;return!0}function vXn(n){return n!==null?n:{}}var EXn=new Bp("tag:yaml.org,2002:set",{kind:"mapping",resolve:yXn,construct:vXn}),CWt=XJn.extend({implicit:[tXn,rXn],explicit:[uXn,hXn,mXn,EXn]}),bN=Object.prototype.hasOwnProperty,lse=1,IWt=2,RWt=3,dse=4,BOe=1,SXn=2,TFt=3,TXn=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,AXn=/[\x85\u2028\u2029]/,_Xn=/[,\[\]\{\}]/,OWt=/^(?:!|!!|![a-z\-]+!)$/i,DWt=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function AFt(n){return Object.prototype.toString.call(n)}function U2(n){return n===10||n===13}function rR(n){return n===9||n===32}function ub(n){return n===9||n===32||n===10||n===13}function V5(n){return n===44||n===91||n===93||n===123||n===125}function xXn(n){var i;return 48<=n&&n<=57?n-48:(i=n|32,97<=i&&i<=102?i-97+10:-1)}function kXn(n){return n===120?2:n===117?4:n===85?8:0}function NXn(n){return 48<=n&&n<=57?n-48:-1}function _Ft(n){return n===48?"\0":n===97?"\x07":n===98?"\b":n===116||n===9?" ":n===110?`
|
||||
`:n===118?"\v":n===102?"\f":n===114?"\r":n===101?"\x1B":n===32?" ":n===34?'"':n===47?"/":n===92?"\\":n===78?"
":n===95?" ":n===76?"\u2028":n===80?"\u2029":""}function CXn(n){return n<=65535?String.fromCharCode(n):String.fromCharCode((n-65536>>10)+55296,(n-65536&1023)+56320)}function LWt(n,i,s){i==="__proto__"?Object.defineProperty(n,i,{configurable:!0,enumerable:!0,writable:!0,value:s}):n[i]=s}var MWt=new Array(256),PWt=new Array(256);for(var E5=0;E5<256;E5++)MWt[E5]=_Ft(E5)?1:0,PWt[E5]=_Ft(E5);function IXn(n,i){this.input=n,this.filename=i.filename||null,this.schema=i.schema||CWt,this.onWarning=i.onWarning||null,this.legacy=i.legacy||!1,this.json=i.json||!1,this.listener=i.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=n.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function jWt(n,i){var s={name:n.filename,buffer:n.input.slice(0,-1),position:n.position,line:n.line,column:n.position-n.lineStart};return s.snippet=mJn(s),new ib(i,s)}function ki(n,i){throw jWt(n,i)}function fse(n,i){n.onWarning&&n.onWarning.call(null,jWt(n,i))}var xFt={YAML:function(i,s,c){var d,g,b;i.version!==null&&ki(i,"duplication of %YAML directive"),c.length!==1&&ki(i,"YAML directive accepts exactly one argument"),d=/^([0-9]+)\.([0-9]+)$/.exec(c[0]),d===null&&ki(i,"ill-formed argument of the YAML directive"),g=parseInt(d[1],10),b=parseInt(d[2],10),g!==1&&ki(i,"unacceptable YAML version of the document"),i.version=c[0],i.checkLineBreaks=b<2,b!==1&&b!==2&&fse(i,"unsupported YAML version of the document")},TAG:function(i,s,c){var d,g;c.length!==2&&ki(i,"TAG directive accepts exactly two arguments"),d=c[0],g=c[1],OWt.test(d)||ki(i,"ill-formed tag handle (first argument) of the TAG directive"),bN.call(i.tagMap,d)&&ki(i,'there is a previously declared suffix for "'+d+'" tag handle'),DWt.test(g)||ki(i,"ill-formed tag prefix (second argument) of the TAG directive");try{g=decodeURIComponent(g)}catch{ki(i,"tag prefix is malformed: "+g)}i.tagMap[d]=g}};function eN(n,i,s,c){var d,g,b,w;if(i<s){if(w=n.input.slice(i,s),c)for(d=0,g=w.length;d<g;d+=1)b=w.charCodeAt(d),b===9||32<=b&&b<=1114111||ki(n,"expected valid JSON character");else TXn.test(w)&&ki(n,"the stream contains non-printable characters");n.result+=w}}function kFt(n,i,s,c){var d,g,b,w;for(vf.isObject(s)||ki(n,"cannot merge mappings; the provided source object is unacceptable"),d=Object.keys(s),b=0,w=d.length;b<w;b+=1)g=d[b],bN.call(i,g)||(LWt(i,g,s[g]),c[g]=!0)}function W5(n,i,s,c,d,g,b,w,E){var S,x;if(Array.isArray(d))for(d=Array.prototype.slice.call(d),S=0,x=d.length;S<x;S+=1)Array.isArray(d[S])&&ki(n,"nested arrays are not supported inside keys"),typeof d=="object"&&AFt(d[S])==="[object Object]"&&(d[S]="[object Object]");if(typeof d=="object"&&AFt(d)==="[object Object]"&&(d="[object Object]"),d=String(d),i===null&&(i={}),c==="tag:yaml.org,2002:merge")if(Array.isArray(g))for(S=0,x=g.length;S<x;S+=1)kFt(n,i,g[S],s);else kFt(n,i,g,s);else!n.json&&!bN.call(s,d)&&bN.call(i,d)&&(n.line=b||n.line,n.lineStart=w||n.lineStart,n.position=E||n.position,ki(n,"duplicated mapping key")),LWt(i,d,g),delete s[d];return i}function jMe(n){var i;i=n.input.charCodeAt(n.position),i===10?n.position++:i===13?(n.position++,n.input.charCodeAt(n.position)===10&&n.position++):ki(n,"a line break is expected"),n.line+=1,n.lineStart=n.position,n.firstTabInLine=-1}function $d(n,i,s){for(var c=0,d=n.input.charCodeAt(n.position);d!==0;){for(;rR(d);)d===9&&n.firstTabInLine===-1&&(n.firstTabInLine=n.position),d=n.input.charCodeAt(++n.position);if(i&&d===35)do d=n.input.charCodeAt(++n.position);while(d!==10&&d!==13&&d!==0);if(U2(d))for(jMe(n),d=n.input.charCodeAt(n.position),c++,n.lineIndent=0;d===32;)n.lineIndent++,d=n.input.charCodeAt(++n.position);else break}return s!==-1&&c!==0&&n.lineIndent<s&&fse(n,"deficient indentation"),c}function Hae(n){var i=n.position,s;return s=n.input.charCodeAt(i),!!((s===45||s===46)&&s===n.input.charCodeAt(i+1)&&s===n.input.charCodeAt(i+2)&&(i+=3,s=n.input.charCodeAt(i),s===0||ub(s)))}function FMe(n,i){i===1?n.result+=" ":i>1&&(n.result+=vf.repeat(`
|
||||
`,i-1))}function RXn(n,i,s){var c,d,g,b,w,E,S,x,A=n.kind,C=n.result,R;if(R=n.input.charCodeAt(n.position),ub(R)||V5(R)||R===35||R===38||R===42||R===33||R===124||R===62||R===39||R===34||R===37||R===64||R===96||(R===63||R===45)&&(d=n.input.charCodeAt(n.position+1),ub(d)||s&&V5(d)))return!1;for(n.kind="scalar",n.result="",g=b=n.position,w=!1;R!==0;){if(R===58){if(d=n.input.charCodeAt(n.position+1),ub(d)||s&&V5(d))break}else if(R===35){if(c=n.input.charCodeAt(n.position-1),ub(c))break}else{if(n.position===n.lineStart&&Hae(n)||s&&V5(R))break;if(U2(R))if(E=n.line,S=n.lineStart,x=n.lineIndent,$d(n,!1,-1),n.lineIndent>=i){w=!0,R=n.input.charCodeAt(n.position);continue}else{n.position=b,n.line=E,n.lineStart=S,n.lineIndent=x;break}}w&&(eN(n,g,b,!1),FMe(n,n.line-E),g=b=n.position,w=!1),rR(R)||(b=n.position+1),R=n.input.charCodeAt(++n.position)}return eN(n,g,b,!1),n.result?!0:(n.kind=A,n.result=C,!1)}function OXn(n,i){var s,c,d;if(s=n.input.charCodeAt(n.position),s!==39)return!1;for(n.kind="scalar",n.result="",n.position++,c=d=n.position;(s=n.input.charCodeAt(n.position))!==0;)if(s===39)if(eN(n,c,n.position,!0),s=n.input.charCodeAt(++n.position),s===39)c=n.position,n.position++,d=n.position;else return!0;else U2(s)?(eN(n,c,d,!0),FMe(n,$d(n,!1,i)),c=d=n.position):n.position===n.lineStart&&Hae(n)?ki(n,"unexpected end of the document within a single quoted scalar"):(n.position++,d=n.position);ki(n,"unexpected end of the stream within a single quoted scalar")}function DXn(n,i){var s,c,d,g,b,w;if(w=n.input.charCodeAt(n.position),w!==34)return!1;for(n.kind="scalar",n.result="",n.position++,s=c=n.position;(w=n.input.charCodeAt(n.position))!==0;){if(w===34)return eN(n,s,n.position,!0),n.position++,!0;if(w===92){if(eN(n,s,n.position,!0),w=n.input.charCodeAt(++n.position),U2(w))$d(n,!1,i);else if(w<256&&MWt[w])n.result+=PWt[w],n.position++;else if((b=kXn(w))>0){for(d=b,g=0;d>0;d--)w=n.input.charCodeAt(++n.position),(b=xXn(w))>=0?g=(g<<4)+b:ki(n,"expected hexadecimal character");n.result+=CXn(g),n.position++}else ki(n,"unknown escape sequence");s=c=n.position}else U2(w)?(eN(n,s,c,!0),FMe(n,$d(n,!1,i)),s=c=n.position):n.position===n.lineStart&&Hae(n)?ki(n,"unexpected end of the document within a double quoted scalar"):(n.position++,c=n.position)}ki(n,"unexpected end of the stream within a double quoted scalar")}function LXn(n,i){var s=!0,c,d,g,b=n.tag,w,E=n.anchor,S,x,A,C,R,L=Object.create(null),D,B,$,j;if(j=n.input.charCodeAt(n.position),j===91)x=93,R=!1,w=[];else if(j===123)x=125,R=!0,w={};else return!1;for(n.anchor!==null&&(n.anchorMap[n.anchor]=w),j=n.input.charCodeAt(++n.position);j!==0;){if($d(n,!0,i),j=n.input.charCodeAt(n.position),j===x)return n.position++,n.tag=b,n.anchor=E,n.kind=R?"mapping":"sequence",n.result=w,!0;s?j===44&&ki(n,"expected the node content, but found ','"):ki(n,"missed comma between flow collection entries"),B=D=$=null,A=C=!1,j===63&&(S=n.input.charCodeAt(n.position+1),ub(S)&&(A=C=!0,n.position++,$d(n,!0,i))),c=n.line,d=n.lineStart,g=n.position,IM(n,i,lse,!1,!0),B=n.tag,D=n.result,$d(n,!0,i),j=n.input.charCodeAt(n.position),(C||n.line===c)&&j===58&&(A=!0,j=n.input.charCodeAt(++n.position),$d(n,!0,i),IM(n,i,lse,!1,!0),$=n.result),R?W5(n,w,L,B,D,$,c,d,g):A?w.push(W5(n,null,L,B,D,$,c,d,g)):w.push(D),$d(n,!0,i),j=n.input.charCodeAt(n.position),j===44?(s=!0,j=n.input.charCodeAt(++n.position)):s=!1}ki(n,"unexpected end of the stream within a flow collection")}function MXn(n,i){var s,c,d=BOe,g=!1,b=!1,w=i,E=0,S=!1,x,A;if(A=n.input.charCodeAt(n.position),A===124)c=!1;else if(A===62)c=!0;else return!1;for(n.kind="scalar",n.result="";A!==0;)if(A=n.input.charCodeAt(++n.position),A===43||A===45)BOe===d?d=A===43?TFt:SXn:ki(n,"repeat of a chomping mode identifier");else if((x=NXn(A))>=0)x===0?ki(n,"bad explicit indentation width of a block scalar; it cannot be less than one"):b?ki(n,"repeat of an indentation width identifier"):(w=i+x-1,b=!0);else break;if(rR(A)){do A=n.input.charCodeAt(++n.position);while(rR(A));if(A===35)do A=n.input.charCodeAt(++n.position);while(!U2(A)&&A!==0)}for(;A!==0;){for(jMe(n),n.lineIndent=0,A=n.input.charCodeAt(n.position);(!b||n.lineIndent<w)&&A===32;)n.lineIndent++,A=n.input.charCodeAt(++n.position);if(!b&&n.lineIndent>w&&(w=n.lineIndent),U2(A)){E++;continue}if(n.lineIndent<w){d===TFt?n.result+=vf.repeat(`
|
||||
`,g?1+E:E):d===BOe&&g&&(n.result+=`
|
||||
`);break}for(c?rR(A)?(S=!0,n.result+=vf.repeat(`
|
||||
`,g?1+E:E)):S?(S=!1,n.result+=vf.repeat(`
|
||||
`,E+1)):E===0?g&&(n.result+=" "):n.result+=vf.repeat(`
|
||||
`,E):n.result+=vf.repeat(`
|
||||
`,g?1+E:E),g=!0,b=!0,E=0,s=n.position;!U2(A)&&A!==0;)A=n.input.charCodeAt(++n.position);eN(n,s,n.position,!1)}return!0}function NFt(n,i){var s,c=n.tag,d=n.anchor,g=[],b,w=!1,E;if(n.firstTabInLine!==-1)return!1;for(n.anchor!==null&&(n.anchorMap[n.anchor]=g),E=n.input.charCodeAt(n.position);E!==0&&(n.firstTabInLine!==-1&&(n.position=n.firstTabInLine,ki(n,"tab characters must not be used in indentation")),!(E!==45||(b=n.input.charCodeAt(n.position+1),!ub(b))));){if(w=!0,n.position++,$d(n,!0,-1)&&n.lineIndent<=i){g.push(null),E=n.input.charCodeAt(n.position);continue}if(s=n.line,IM(n,i,RWt,!1,!0),g.push(n.result),$d(n,!0,-1),E=n.input.charCodeAt(n.position),(n.line===s||n.lineIndent>i)&&E!==0)ki(n,"bad indentation of a sequence entry");else if(n.lineIndent<i)break}return w?(n.tag=c,n.anchor=d,n.kind="sequence",n.result=g,!0):!1}function PXn(n,i,s){var c,d,g,b,w,E,S=n.tag,x=n.anchor,A={},C=Object.create(null),R=null,L=null,D=null,B=!1,$=!1,j;if(n.firstTabInLine!==-1)return!1;for(n.anchor!==null&&(n.anchorMap[n.anchor]=A),j=n.input.charCodeAt(n.position);j!==0;){if(!B&&n.firstTabInLine!==-1&&(n.position=n.firstTabInLine,ki(n,"tab characters must not be used in indentation")),c=n.input.charCodeAt(n.position+1),g=n.line,(j===63||j===58)&&ub(c))j===63?(B&&(W5(n,A,C,R,L,null,b,w,E),R=L=D=null),$=!0,B=!0,d=!0):B?(B=!1,d=!0):ki(n,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),n.position+=1,j=c;else{if(b=n.line,w=n.lineStart,E=n.position,!IM(n,s,IWt,!1,!0))break;if(n.line===g){for(j=n.input.charCodeAt(n.position);rR(j);)j=n.input.charCodeAt(++n.position);if(j===58)j=n.input.charCodeAt(++n.position),ub(j)||ki(n,"a whitespace character is expected after the key-value separator within a block mapping"),B&&(W5(n,A,C,R,L,null,b,w,E),R=L=D=null),$=!0,B=!1,d=!1,R=n.tag,L=n.result;else if($)ki(n,"can not read an implicit mapping pair; a colon is missed");else return n.tag=S,n.anchor=x,!0}else if($)ki(n,"can not read a block mapping entry; a multiline key may not be an implicit key");else return n.tag=S,n.anchor=x,!0}if((n.line===g||n.lineIndent>i)&&(B&&(b=n.line,w=n.lineStart,E=n.position),IM(n,i,dse,!0,d)&&(B?L=n.result:D=n.result),B||(W5(n,A,C,R,L,D,b,w,E),R=L=D=null),$d(n,!0,-1),j=n.input.charCodeAt(n.position)),(n.line===g||n.lineIndent>i)&&j!==0)ki(n,"bad indentation of a mapping entry");else if(n.lineIndent<i)break}return B&&W5(n,A,C,R,L,null,b,w,E),$&&(n.tag=S,n.anchor=x,n.kind="mapping",n.result=A),$}function jXn(n){var i,s=!1,c=!1,d,g,b;if(b=n.input.charCodeAt(n.position),b!==33)return!1;if(n.tag!==null&&ki(n,"duplication of a tag property"),b=n.input.charCodeAt(++n.position),b===60?(s=!0,b=n.input.charCodeAt(++n.position)):b===33?(c=!0,d="!!",b=n.input.charCodeAt(++n.position)):d="!",i=n.position,s){do b=n.input.charCodeAt(++n.position);while(b!==0&&b!==62);n.position<n.length?(g=n.input.slice(i,n.position),b=n.input.charCodeAt(++n.position)):ki(n,"unexpected end of the stream within a verbatim tag")}else{for(;b!==0&&!ub(b);)b===33&&(c?ki(n,"tag suffix cannot contain exclamation marks"):(d=n.input.slice(i-1,n.position+1),OWt.test(d)||ki(n,"named tag handle cannot contain such characters"),c=!0,i=n.position+1)),b=n.input.charCodeAt(++n.position);g=n.input.slice(i,n.position),_Xn.test(g)&&ki(n,"tag suffix cannot contain flow indicator characters")}g&&!DWt.test(g)&&ki(n,"tag name cannot contain such characters: "+g);try{g=decodeURIComponent(g)}catch{ki(n,"tag name is malformed: "+g)}return s?n.tag=g:bN.call(n.tagMap,d)?n.tag=n.tagMap[d]+g:d==="!"?n.tag="!"+g:d==="!!"?n.tag="tag:yaml.org,2002:"+g:ki(n,'undeclared tag handle "'+d+'"'),!0}function FXn(n){var i,s;if(s=n.input.charCodeAt(n.position),s!==38)return!1;for(n.anchor!==null&&ki(n,"duplication of an anchor property"),s=n.input.charCodeAt(++n.position),i=n.position;s!==0&&!ub(s)&&!V5(s);)s=n.input.charCodeAt(++n.position);return n.position===i&&ki(n,"name of an anchor node must contain at least one character"),n.anchor=n.input.slice(i,n.position),!0}function $Xn(n){var i,s,c;if(c=n.input.charCodeAt(n.position),c!==42)return!1;for(c=n.input.charCodeAt(++n.position),i=n.position;c!==0&&!ub(c)&&!V5(c);)c=n.input.charCodeAt(++n.position);return n.position===i&&ki(n,"name of an alias node must contain at least one character"),s=n.input.slice(i,n.position),bN.call(n.anchorMap,s)||ki(n,'unidentified alias "'+s+'"'),n.result=n.anchorMap[s],$d(n,!0,-1),!0}function IM(n,i,s,c,d){var g,b,w,E=1,S=!1,x=!1,A,C,R,L,D,B;if(n.listener!==null&&n.listener("open",n),n.tag=null,n.anchor=null,n.kind=null,n.result=null,g=b=w=dse===s||RWt===s,c&&$d(n,!0,-1)&&(S=!0,n.lineIndent>i?E=1:n.lineIndent===i?E=0:n.lineIndent<i&&(E=-1)),E===1)for(;jXn(n)||FXn(n);)$d(n,!0,-1)?(S=!0,w=g,n.lineIndent>i?E=1:n.lineIndent===i?E=0:n.lineIndent<i&&(E=-1)):w=!1;if(w&&(w=S||d),(E===1||dse===s)&&(lse===s||IWt===s?D=i:D=i+1,B=n.position-n.lineStart,E===1?w&&(NFt(n,B)||PXn(n,B,D))||LXn(n,D)?x=!0:(b&&MXn(n,D)||OXn(n,D)||DXn(n,D)?x=!0:$Xn(n)?(x=!0,(n.tag!==null
Line truncated
|
||||
`),n.charCodeAt(0)===65279&&(n=n.slice(1)));var s=new IXn(n,i),c=n.indexOf("\0");for(c!==-1&&(s.position=c,ki(s,"null byte is not allowed in input")),s.input+="\0";s.input.charCodeAt(s.position)===32;)s.lineIndent+=1,s.position+=1;for(;s.position<s.length-1;)BXn(s);return s.documents}function HXn(n,i){var s=UXn(n,i);if(s.length!==0){if(s.length===1)return s[0];throw new ib("expected a single document in the stream, but found more")}}var zXn=HXn,GXn={load:zXn},FWt=Object.prototype.toString,$Wt=Object.prototype.hasOwnProperty,$Me=65279,qXn=9,az=10,VXn=13,WXn=32,KXn=33,YXn=34,FDe=35,JXn=37,XXn=38,ZXn=39,QXn=42,BWt=44,eZn=45,hse=58,tZn=61,nZn=62,rZn=63,iZn=64,UWt=91,HWt=93,oZn=96,zWt=123,sZn=124,GWt=125,qp={};qp[0]="\\0";qp[7]="\\a";qp[8]="\\b";qp[9]="\\t";qp[10]="\\n";qp[11]="\\v";qp[12]="\\f";qp[13]="\\r";qp[27]="\\e";qp[34]='\\"';qp[92]="\\\\";qp[133]="\\N";qp[160]="\\_";qp[8232]="\\L";qp[8233]="\\P";var aZn=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],uZn=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;function cZn(n,i){var s,c,d,g,b,w,E;if(i===null)return{};for(s={},c=Object.keys(i),d=0,g=c.length;d<g;d+=1)b=c[d],w=String(i[b]),b.slice(0,2)==="!!"&&(b="tag:yaml.org,2002:"+b.slice(2)),E=n.compiledTypeMap.fallback[b],E&&$Wt.call(E.styleAliases,w)&&(w=E.styleAliases[w]),s[b]=w;return s}function lZn(n){var i,s,c;if(i=n.toString(16).toUpperCase(),n<=255)s="x",c=2;else if(n<=65535)s="u",c=4;else if(n<=4294967295)s="U",c=8;else throw new ib("code point within a string may not be greater than 0xFFFFFFFF");return"\\"+s+vf.repeat("0",c-i.length)+i}var dZn=1,uz=2;function fZn(n){this.schema=n.schema||CWt,this.indent=Math.max(1,n.indent||2),this.noArrayIndent=n.noArrayIndent||!1,this.skipInvalid=n.skipInvalid||!1,this.flowLevel=vf.isNothing(n.flowLevel)?-1:n.flowLevel,this.styleMap=cZn(this.schema,n.styles||null),this.sortKeys=n.sortKeys||!1,this.lineWidth=n.lineWidth||80,this.noRefs=n.noRefs||!1,this.noCompatMode=n.noCompatMode||!1,this.condenseFlow=n.condenseFlow||!1,this.quotingType=n.quotingType==='"'?uz:dZn,this.forceQuotes=n.forceQuotes||!1,this.replacer=typeof n.replacer=="function"?n.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function CFt(n,i){for(var s=vf.repeat(" ",i),c=0,d=-1,g="",b,w=n.length;c<w;)d=n.indexOf(`
|
||||
`,c),d===-1?(b=n.slice(c),c=w):(b=n.slice(c,d+1),c=d+1),b.length&&b!==`
|
||||
`&&(g+=s),g+=b;return g}function $De(n,i){return`
|
||||
`+vf.repeat(" ",n.indent*i)}function hZn(n,i){var s,c,d;for(s=0,c=n.implicitTypes.length;s<c;s+=1)if(d=n.implicitTypes[s],d.resolve(i))return!0;return!1}function pse(n){return n===WXn||n===qXn}function cz(n){return 32<=n&&n<=126||161<=n&&n<=55295&&n!==8232&&n!==8233||57344<=n&&n<=65533&&n!==$Me||65536<=n&&n<=1114111}function IFt(n){return cz(n)&&n!==$Me&&n!==VXn&&n!==az}function RFt(n,i,s){var c=IFt(n),d=c&&!pse(n);return(s?c:c&&n!==BWt&&n!==UWt&&n!==HWt&&n!==zWt&&n!==GWt)&&n!==FDe&&!(i===hse&&!d)||IFt(i)&&!pse(i)&&n===FDe||i===hse&&d}function pZn(n){return cz(n)&&n!==$Me&&!pse(n)&&n!==eZn&&n!==rZn&&n!==hse&&n!==BWt&&n!==UWt&&n!==HWt&&n!==zWt&&n!==GWt&&n!==FDe&&n!==XXn&&n!==QXn&&n!==KXn&&n!==sZn&&n!==tZn&&n!==nZn&&n!==ZXn&&n!==YXn&&n!==JXn&&n!==iZn&&n!==oZn}function gZn(n){return!pse(n)&&n!==hse}function rH(n,i){var s=n.charCodeAt(i),c;return s>=55296&&s<=56319&&i+1<n.length&&(c=n.charCodeAt(i+1),c>=56320&&c<=57343)?(s-55296)*1024+c-56320+65536:s}function qWt(n){var i=/^\n* /;return i.test(n)}var VWt=1,BDe=2,WWt=3,KWt=4,x5=5;function bZn(n,i,s,c,d,g,b,w){var E,S=0,x=null,A=!1,C=!1,R=c!==-1,L=-1,D=pZn(rH(n,0))&&gZn(rH(n,n.length-1));if(i||b)for(E=0;E<n.length;S>=65536?E+=2:E++){if(S=rH(n,E),!cz(S))return x5;D=D&&RFt(S,x,w),x=S}else{for(E=0;E<n.length;S>=65536?E+=2:E++){if(S=rH(n,E),S===az)A=!0,R&&(C=C||E-L-1>c&&n[L+1]!==" ",L=E);else if(!cz(S))return x5;D=D&&RFt(S,x,w),x=S}C=C||R&&E-L-1>c&&n[L+1]!==" "}return!A&&!C?D&&!b&&!d(n)?VWt:g===uz?x5:BDe:s>9&&qWt(n)?x5:b?g===uz?x5:BDe:C?KWt:WWt}function mZn(n,i,s,c,d){n.dump=function(){if(i.length===0)return n.quotingType===uz?'""':"''";if(!n.noCompatMode&&(aZn.indexOf(i)!==-1||uZn.test(i)))return n.quotingType===uz?'"'+i+'"':"'"+i+"'";var g=n.indent*Math.max(1,s),b=n.lineWidth===-1?-1:Math.max(Math.min(n.lineWidth,40),n.lineWidth-g),w=c||n.flowLevel>-1&&s>=n.flowLevel;function E(S){return hZn(n,S)}switch(bZn(i,w,n.indent,b,E,n.quotingType,n.forceQuotes&&!c,d)){case VWt:return i;case BDe:return"'"+i.replace(/'/g,"''")+"'";case WWt:return"|"+OFt(i,n.indent)+DFt(CFt(i,g));case KWt:return">"+OFt(i,n.indent)+DFt(CFt(wZn(i,b),g));case x5:return'"'+yZn(i)+'"';default:throw new ib("impossible error: invalid scalar style")}}()}function OFt(n,i){var s=qWt(n)?String(i):"",c=n[n.length-1]===`
|
||||
`,d=c&&(n[n.length-2]===`
|
||||
`||n===`
|
||||
`),g=d?"+":c?"":"-";return s+g+`
|
||||
`}function DFt(n){return n[n.length-1]===`
|
||||
`?n.slice(0,-1):n}function wZn(n,i){for(var s=/(\n+)([^\n]*)/g,c=function(){var S=n.indexOf(`
|
||||
`);return S=S!==-1?S:n.length,s.lastIndex=S,LFt(n.slice(0,S),i)}(),d=n[0]===`
|
||||
`||n[0]===" ",g,b;b=s.exec(n);){var w=b[1],E=b[2];g=E[0]===" ",c+=w+(!d&&!g&&E!==""?`
|
||||
`:"")+LFt(E,i),d=g}return c}function LFt(n,i){if(n===""||n[0]===" ")return n;for(var s=/ [^ ]/g,c,d=0,g,b=0,w=0,E="";c=s.exec(n);)w=c.index,w-d>i&&(g=b>d?b:w,E+=`
|
||||
`+n.slice(d,g),d=g+1),b=w;return E+=`
|
||||
`,n.length-d>i&&b>d?E+=n.slice(d,b)+`
|
||||
`+n.slice(b+1):E+=n.slice(d),E.slice(1)}function yZn(n){for(var i="",s=0,c,d=0;d<n.length;s>=65536?d+=2:d++)s=rH(n,d),c=qp[s],!c&&cz(s)?(i+=n[d],s>=65536&&(i+=n[d+1])):i+=c||lZn(s);return i}function vZn(n,i,s){var c="",d=n.tag,g,b,w;for(g=0,b=s.length;g<b;g+=1)w=s[g],n.replacer&&(w=n.replacer.call(s,String(g),w)),(TA(n,i,w,!1,!1)||typeof w>"u"&&TA(n,i,null,!1,!1))&&(c!==""&&(c+=","+(n.condenseFlow?"":" ")),c+=n.dump);n.tag=d,n.dump="["+c+"]"}function MFt(n,i,s,c){var d="",g=n.tag,b,w,E;for(b=0,w=s.length;b<w;b+=1)E=s[b],n.replacer&&(E=n.replacer.call(s,String(b),E)),(TA(n,i+1,E,!0,!0,!1,!0)||typeof E>"u"&&TA(n,i+1,null,!0,!0,!1,!0))&&((!c||d!=="")&&(d+=$De(n,i)),n.dump&&az===n.dump.charCodeAt(0)?d+="-":d+="- ",d+=n.dump);n.tag=g,n.dump=d||"[]"}function EZn(n,i,s){var c="",d=n.tag,g=Object.keys(s),b,w,E,S,x;for(b=0,w=g.length;b<w;b+=1)x="",c!==""&&(x+=", "),n.condenseFlow&&(x+='"'),E=g[b],S=s[E],n.replacer&&(S=n.replacer.call(s,E,S)),TA(n,i,E,!1,!1)&&(n.dump.length>1024&&(x+="? "),x+=n.dump+(n.condenseFlow?'"':"")+":"+(n.condenseFlow?"":" "),TA(n,i,S,!1,!1)&&(x+=n.dump,c+=x));n.tag=d,n.dump="{"+c+"}"}function SZn(n,i,s,c){var d="",g=n.tag,b=Object.keys(s),w,E,S,x,A,C;if(n.sortKeys===!0)b.sort();else if(typeof n.sortKeys=="function")b.sort(n.sortKeys);else if(n.sortKeys)throw new ib("sortKeys must be a boolean or a function");for(w=0,E=b.length;w<E;w+=1)C="",(!c||d!=="")&&(C+=$De(n,i)),S=b[w],x=s[S],n.replacer&&(x=n.replacer.call(s,S,x)),TA(n,i+1,S,!0,!0,!0)&&(A=n.tag!==null&&n.tag!=="?"||n.dump&&n.dump.length>1024,A&&(n.dump&&az===n.dump.charCodeAt(0)?C+="?":C+="? "),C+=n.dump,A&&(C+=$De(n,i)),TA(n,i+1,x,!0,A)&&(n.dump&&az===n.dump.charCodeAt(0)?C+=":":C+=": ",C+=n.dump,d+=C));n.tag=g,n.dump=d||"{}"}function PFt(n,i,s){var c,d,g,b,w,E;for(d=s?n.explicitTypes:n.implicitTypes,g=0,b=d.length;g<b;g+=1)if(w=d[g],(w.instanceOf||w.predicate)&&(!w.instanceOf||typeof i=="object"&&i instanceof w.instanceOf)&&(!w.predicate||w.predicate(i))){if(s?w.multi&&w.representName?n.tag=w.representName(i):n.tag=w.tag:n.tag="?",w.represent){if(E=n.styleMap[w.tag]||w.defaultStyle,FWt.call(w.represent)==="[object Function]")c=w.represent(i,E);else if($Wt.call(w.represent,E))c=w.represent[E](i,E);else throw new ib("!<"+w.tag+'> tag resolver accepts not "'+E+'" style');n.dump=c}return!0}return!1}function TA(n,i,s,c,d,g,b){n.tag=null,n.dump=s,PFt(n,s,!1)||PFt(n,s,!0);var w=FWt.call(n.dump),E=c,S;c&&(c=n.flowLevel<0||n.flowLevel>i);var x=w==="[object Object]"||w==="[object Array]",A,C;if(x&&(A=n.duplicates.indexOf(s),C=A!==-1),(n.tag!==null&&n.tag!=="?"||C||n.indent!==2&&i>0)&&(d=!1),C&&n.usedDuplicates[A])n.dump="*ref_"+A;else{if(x&&C&&!n.usedDuplicates[A]&&(n.usedDuplicates[A]=!0),w==="[object Object]")c&&Object.keys(n.dump).length!==0?(SZn(n,i,n.dump,d),C&&(n.dump="&ref_"+A+n.dump)):(EZn(n,i,n.dump),C&&(n.dump="&ref_"+A+" "+n.dump));else if(w==="[object Array]")c&&n.dump.length!==0?(n.noArrayIndent&&!b&&i>0?MFt(n,i-1,n.dump,d):MFt(n,i,n.dump,d),C&&(n.dump="&ref_"+A+n.dump)):(vZn(n,i,n.dump),C&&(n.dump="&ref_"+A+" "+n.dump));else if(w==="[object String]")n.tag!=="?"&&mZn(n,n.dump,i,g,E);else{if(w==="[object Undefined]")return!1;if(n.skipInvalid)return!1;throw new ib("unacceptable kind of an object to dump "+w)}n.tag!==null&&n.tag!=="?"&&(S=encodeURI(n.tag[0]==="!"?n.tag.slice(1):n.tag).replace(/!/g,"%21"),n.tag[0]==="!"?S="!"+S:S.slice(0,18)==="tag:yaml.org,2002:"?S="!!"+S.slice(18):S="!<"+S+">",n.dump=S+" "+n.dump)}return!0}function TZn(n,i){var s=[],c=[],d,g;for(UDe(n,s,c),d=0,g=c.length;d<g;d+=1)i.duplicates.push(s[c[d]]);i.usedDuplicates=new Array(g)}function UDe(n,i,s){var c,d,g;if(n!==null&&typeof n=="object")if(d=i.indexOf(n),d!==-1)s.indexOf(d)===-1&&s.push(d);else if(i.push(n),Array.isArray(n))for(d=0,g=n.length;d<g;d+=1)UDe(n[d],i,s);else for(c=Object.keys(n),d=0,g=c.length;d<g;d+=1)UDe(n[c[d]],i,s)}function AZn(n,i){i=i||{};var s=new fZn(i);s.noRefs||TZn(n,s);var c=n;return s.replacer&&(c=s.replacer.call({"":c},"",c)),TA(s,0,c,!0,!0)?s.dump+`
|
||||
`:""}var _Zn=AZn,xZn={dump:_Zn},kZn=GXn.load,gse=xZn.dump;const Mh=[];for(let n=0;n<256;++n)Mh.push((n+256).toString(16).slice(1));function NZn(n,i=0){return(Mh[n[i+0]]+Mh[n[i+1]]+Mh[n[i+2]]+Mh[n[i+3]]+"-"+Mh[n[i+4]]+Mh[n[i+5]]+"-"+Mh[n[i+6]]+Mh[n[i+7]]+"-"+Mh[n[i+8]]+Mh[n[i+9]]+"-"+Mh[n[i+10]]+Mh[n[i+11]]+Mh[n[i+12]]+Mh[n[i+13]]+Mh[n[i+14]]+Mh[n[i+15]]).toLowerCase()}let UOe;const CZn=new Uint8Array(16);function IZn(){if(!UOe){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");UOe=crypto.getRandomValues.bind(crypto)}return UOe(CZn)}const RZn=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),jFt={randomUUID:RZn};function OZn(n,i,s){var d;n=n||{};const c=n.random??((d=n.rng)==null?void 0:d.call(n))??IZn();if(c.length<16)throw new Error("Random bytes length must be >= 16");return c[6]=c[6]&15|64,c[8]=c[8]&63|128,NZn(c)}function DZn(n,i,s){return jFt.randomUUID&&!n?jFt.randomUUID():OZn(n)}let LZn=0;function FFt(n,i){return`${n}_${Date.now()}_${i}_${LZn++}`}function MZn(){return DZn()}function PZn(n,i){return`e-${n}-${i}-${Date.now()}`}var YWt={exports:{}};(function(n,i){(function(s){n.exports=s()})(function(){return function(){function s(c,d,g){function b(S,x){if(!d[S]){if(!c[S]){var A=typeof QU=="function"&&QU;if(!x&&A)return A(S,!0);if(w)return w(S,!0);var C=new Error("Cannot find module '"+S+"'");throw C.code="MODULE_NOT_FOUND",C}var R=d[S]={exports:{}};c[S][0].call(R.exports,function(L){var D=c[S][1][L];return b(D||L)},R,R.exports,s,c,d,g)}return d[S].exports}for(var w=typeof QU=="function"&&QU,E=0;E<g.length;E++)b(g[E]);return b}return s}()({1:[function(s,c,d){Object.defineProperty(d,"__esModule",{value:!0}),d.default=void 0;function g(C){"@babel/helpers - typeof";return g=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R},g(C)}function b(C,R){if(!(C instanceof R))throw new TypeError("Cannot call a class as a function")}function w(C,R){for(var L=0;L<R.length;L++){var D=R[L];D.enumerable=D.enumerable||!1,D.configurable=!0,"value"in D&&(D.writable=!0),Object.defineProperty(C,S(D.key),D)}}function E(C,R,L){return R&&w(C.prototype,R),Object.defineProperty(C,"prototype",{writable:!1}),C}function S(C){var R=x(C,"string");return g(R)=="symbol"?R:R+""}function x(C,R){if(g(C)!="object"||!C)return C;var L=C[Symbol.toPrimitive];if(L!==void 0){var D=L.call(C,R);if(g(D)!="object")return D;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(C)}d.default=function(){function C(){var R=this,L=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},D=L.defaultLayoutOptions,B=D===void 0?{}:D,$=L.algorithms,j=$===void 0?["layered","stress","mrtree","radial","force","disco","sporeOverlap","sporeCompaction","rectpacking","vertiflex"]:$,P=L.workerFactory,G=L.workerUrl;if(b(this,C),this.defaultLayoutOptions=B,this.initialized=!1,typeof G>"u"&&typeof P>"u")throw new Error("Cannot construct an ELK without both 'workerUrl' and 'workerFactory'.");var ee=P;typeof G<"u"&&typeof P>"u"&&(ee=function(ie){return new Worker(ie)});var re=ee(G);if(typeof re.postMessage!="function")throw new TypeError("Created worker does not provide the required 'postMessage' function.");this.worker=new A(re),this.worker.postMessage({cmd:"register",algorithms:j}).then(function(Q){return R.initialized=!0}).catch(console.err)}return E(C,[{key:"layout",value:function(L){var D=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},B=D.layoutOptions,$=B===void 0?this.defaultLayoutOptions:B,j=D.logging,P=j===void 0?!1:j,G=D.measureExecutionTime,ee=G===void 0?!1:G;return L?this.worker.postMessage({cmd:"layout",graph:L,layoutOptions:$,options:{logging:P,measureExecutionTime:ee}}):Promise.reject(new Error("Missing mandatory parameter 'graph'."))}},{key:"knownLayoutAlgorithms",value:function(){return this.worker.postMessage({cmd:"algorithms"})}},{key:"knownLayoutOptions",value:function(){return this.worker.postMessage({cmd:"options"})}},{key:"knownLayoutCategories",value:function(){return this.worker.postMessage({cmd:"categories"})}},{key:"terminateWorker",value:function(){this.worker&&this.worker.terminate()}}])}();var A=function(){function C(R){var L=this;if(b(this,C),R===void 0)throw new Error("Missing mandatory parameter 'worker'.");this.resolvers={},this.worker=R,this.worker.onmessage=function(D){setTimeout(function(){L.receive(L,D)},0)}}return E(C,[{key:"postMessage",value:function(L){var D=this.id||0;this.id=D+1,L.id=D;var B=this;return new Promise(function($,j){B.resolvers[D]=function(P,G){P?(B.convertGwtStyleError(P),j(P)):$(G)},B.worker.postMessage(L)})}},{key:"receive",value:function(L,D){var B=D.data,$=L.resolvers[B.id];$&&(delete L.resolvers[B.id],B.error?$(B.error):$(null,B.data))}},{key:"terminate",value:function(){this.worker&&this.w
Line truncated
|
||||
`,Qa(co(e,t[0])))>=0;)++t[0]}function qdt(e,t){A2e=new Vm,tkt=t,vI=e,l(vI.b,68),kpe(vI,A2e,null),Ovt(vI)}function G3(){G3=K,uee=new Iq("XY",0),aee=new Iq("X",1),cee=new Iq("Y",2)}function Za(){Za=K,Nd=new Cq("TOP",0),M1=new Cq(px,1),rd=new Cq(vwe,2)}function lp(){lp=K,dL=new Pq(_d,0),ZE=new Pq("TOP",1),kT=new Pq(vwe,2)}function g6(){g6=K,Ute=new Ple("INPUT_ORDER",0),Hte=new Ple("PORT_DEGREE",1)}function m_(){m_=K,KEe=Ua(Hu,Hu,524287),Y_t=Ua(0,0,ED),YEe=qW(1),qW(2),JEe=qW(0)}function Bpe(e){var t;return t=HS(Vt(e,32)),t==null&&(Ha(e),t=HS(Vt(e,32))),t}function Upe(e){var t;return e.Lh()||(t=ln(e.Ah())-e.gi(),e.Xh().Kk(t)),e.wh()}function Vdt(e){(this.q?this.q:(At(),At(),xh)).zc(e.q?e.q:(At(),At(),xh))}function Wdt(e,t){va(e,t==null||V8((Mt(t),t))||isNaN((Mt(t),t))?0:(Mt(t),t))}function Kdt(e,t){gu(e,t==null||V8((Mt(t),t))||isNaN((Mt(t),t))?0:(Mt(t),t))}function Ydt(e,t){Hb(e,t==null||V8((Mt(t),t))||isNaN((Mt(t),t))?0:(Mt(t),t))}function Jdt(e,t){Ub(e,t==null||V8((Mt(t),t))||isNaN((Mt(t),t))?0:(Mt(t),t))}function Zdn(e,t){AS(l(l(e.f,19).mf((_n(),bk)),103))&&Tgt(She(l(e.f,19)),t)}function sK(e,t){var r;return r=Ur(e.d,t),r>=0?s7(e,r,!0,!0):O0(e,t,!0)}function uj(e,t){var r;return r=e.bd(t),r>=0?(e.ed(r),!0):!1}function aK(e,t,r){var o;return o=e.g[t],w3(e,t,e.Xi(t,r)),e.Pi(t,r,o),e.Li(),o}function uK(e){var t;return e.d!=e.r&&(t=Sl(e),e.e=!!t&&t.jk()==YAt,e.d=t),e.e}function cK(e,t){var r;for(kn(e),kn(t),r=!1;t.Ob();)r=r|e.Ec(t.Pb());return r}function bs(e,t){var r,o;return y1(e),o=new Epe(t,e.a),r=new Uit(o),new Et(e,r)}function Wd(e,t){var r;return r=l(Ht(e.e,t),395),r?(prt(e,r),r.e):null}function Qdn(e,t){var r,o,a;a=t.c.i,r=l(Ht(e.f,a),60),o=r.d.c-r.e.c,yge(t.a,o,0)}function bh(e,t,r){var o,a;for(o=10,a=0;a<r-1;a++)t<o&&(e.a+="0"),o*=10;e.a+=t}function Hpe(e,t){var r;for(++e.d,++e.c[t],r=t+1;r<e.a.length;)++e.a[r],r+=r&-r}function lK(e){var t;return t=e.b.c.length==0?null:ze(e.b,0),t!=null&&yK(e,0),t}function efn(e){switch(e.g){case 0:return sr;case 1:return Qi;default:return 0}}function tfn(e){return hbe(e,(m_(),JEe))<0?-ztn(k_(e)):e.l+e.m*fT+e.h*nm}function Xdt(e){var t,r;return t=e/60|0,r=e%60,r==0?""+t:""+t+":"+(""+r)}function ay(e,t){var r=e.a[t],o=(LK(),HQ)[typeof r];return o?o(r):n1e(typeof r)}function nfn(e,t){return ae(t,104)&&l(t,20).Bb&No?new oV(t,e):new A_(t,e)}function rfn(e,t){return ae(t,104)&&l(t,20).Bb&No?new oV(t,e):new A_(t,e)}function ifn(e,t,r){return yS(new Me(r.e.a+r.f.a/2,r.e.b+r.f.b/2),e)==(Mt(t),t)}function zpe(e){if(!e.c)throw Y(new vs);return e.e=e.a=e.c,e.c=e.c.c,++e.d,e.a.f}function Zdt(e){if(!e.e)throw Y(new vs);return e.c=e.a=e.e,e.e=e.e.e,--e.d,e.a.f}function Qdt(e,t,r,o){if(!e)throw Y(new jt(CC(t,Z(X(Ii,1),Rt,1,5,[r,o]))))}function eft(){eft=K,wDt=yn((He(),Z(X(Io,1),ea,64,0,[Is,Wt,Qt,dn,Kt])))}function tft(){tft=K,oDt=yn((vi(),Z(X(E4,1),Ce,87,0,[hf,fs,as,ff,il])))}function nft(){nft=K,$kt=yn((Vi(),Z(X(z2e,1),Ce,364,0,[id,kh,la,da,Ho])))}function q3(){q3=K,Wkt=new oG,Kkt=new s9,qkt=new sG,Vkt=new aG,Ykt=new uG}function cj(){cj=K,iee=new xle("EADES",0),w$=new xle("FRUCHTERMAN_REINGOLD",1)}function rft(e){this.g=e,this.f=new je,this.a=b.Math.min(this.g.c.c,this.g.d.c)}function ift(e,t,r,o){fr(),Km.call(this,26),this.c=e,this.a=t,this.d=r,this.b=o}function ofn(e,t){var r,o;for(o=t.c,r=o+1;r<=t.f;r++)e.a[r]>e.a[o]&&(o=r);return o}function oft(e){var t;for(++e.a,t=e.c.a.length;e.a<t;++e.a)if(e.c.b[e.a])return}function sfn(e,t){var r;return r=x0(e.e.c,t.e.c),r==0?yr(e.e.d,t.e.d):r}function sft(e){var t;return t=l(F(e,(Ie(),ew)),318),t?t.a==e:!1}function aft(e){var t;return t=l(F(e,(Ie(),ew)),318),t?t.i==e:!1}function uft(e,t){return t==(IV(),IV(),uxt)?e.toLocaleLowerCase():e.toLowerCase()}function b6(e){return e.__elementTypeCategory$==null?10:e.__elementTypeCategory$}function afn(e){var t,r;if(e.a){r=null;do t=e.a,e.a=null,r=_mt(t,r);while(e.a);e.a=r}}function ufn(e){var t,r;if(e.b){r=null;do t=e.b,e.b=null,r=_mt(t,r);while(e.b);e.b=r}}function cfn(e,t){var r;for(r=0;e.e!=e.i.gc();)xsn(t,rn(e),Re(r)),r!=sr&&++r}function dK(e,t){var r;return r=l(Ht(e.a,t),151),r||(r=new Q2,Jn(e.a,t,r)),r}function lfn(e,t,r){var o;return o=e.a.e[l(t.a,9).p]-e.a.e[l(r.a,9).p],go(GO(o))}function Nt(e,t){var r;return r=(e.i==null&&Ff(e),e.i),t>=0&&t<r.length?r[t]:null}function Gpe(e){return(e.i&2?"interface ":e.i&1?"":"class ")+(np(e),e.o)}function lj(e){return Ea(e,sr)>0?sr:Ea(e,Qi)<0?Qi:Dn(e)}function Kl(e,t,r){var o;if(t==null)throw Y(new rS);return o=op(e,t),xln(e,t,r),o}function cft(e,t){return Mt(t),Zfe(e),e.d.Ob()?(t.Ad(e.d.Pb()),!0):!1}function lft(e){this.b=new je,this.a=new je,this.c=new je,this.d=new je,this.e=e}function dft(e,t,r){G8.call(this),qpe(this),this.a=e,this.c=r,this.b=t.d,this.f=t.e}function dfn(){return zt(),Z(X(bee,1),Ce,252,0,[Xr,gi,mi,_a,ta,af,rL,AI])}function fft(){fft=K,gDt=yn((vE(),Z(X(_4,1),Ce,260,0,[V1,WL,KNe,A4,YNe])))}function hft(){hft=K,A6t=yn((Jd(),Z(X(cf,1),Ce,161,0,[xt,ri,Rd,Cg,Np])))}function pft(){pft=K,SNt=yn((yy(),Z(X(ENt,1),Ce,372,0,[sL,q$,V$,G$,z$])))}fun
Line truncated
|
||||
`)}return t&&(t.stack||r(e[eX]))}function C1e(e,t){switch(t){case 3:return e.f!=0;case 4:return e.g!=0;case 5:return e.i!=0;case 6:return e.j!=0}return Tge(e,t)}function I1e(e,t){switch(t){case 3:Ub(e,0);return;case 4:Hb(e,0);return;case 5:va(e,0);return;case 6:gu(e,0);return}r1e(e,t)}function s1n(e){switch(e.g){case 0:return new xze;case 1:return new kze;default:throw Y(new jt(MZ+(e.f!=null?e.f:""+e.g)))}}function Ngt(e){switch(e.g){case 0:return new _ze;case 1:return new Nze;default:throw Y(new jt(jX+(e.f!=null?e.f:""+e.g)))}}function a1n(e){switch(e.g){case 1:return new wze;case 2:return new sit;default:throw Y(new jt(MZ+(e.f!=null?e.f:""+e.g)))}}function Cgt(e){switch(e.g){case 0:return new Hce;case 1:return new $Ze;default:throw Y(new jt(FF+(e.f!=null?e.f:""+e.g)))}}function k0(e,t){switch(t.g){case 1:return _S(e.j,(bu(),J2e));case 2:return _S(e.j,(bu(),Z2e));default:return At(),At(),Co}}function Igt(e,t){var r,o;if(t){for(r=0;r<e.i;++r)if(o=l(e.g[r],374),o.kj(t))return!1;return Tn(e,t)}else return!1}function R1e(e){var t,r,o,a;for(t=new Eb,a=new Gv(e.b.Jc());a.b.Ob();)o=l(a.b.Pb(),697),r=wyn(o),Nsn(t,t.a.length,r);return t.a}function Yj(e){var t;return e.Db&64?iC(e):(t=new ml(iC(e)),t.a+=" (instanceClassName: ",Vo(t,e.D),t.a+=")",t.a)}function O1e(e,t){var r;return e.i>0&&(t.length<e.i&&(r=y6(rc(t).c,e.i),t=r),ua(e.g,0,t,0,e.i)),t.length>e.i&&ii(t,e.i,null),t}function u1n(e,t,r){var o,a;return o=ue(e.p[t.i.p])+ue(e.d[t.i.p])+t.n.b+t.a.b,a=ue(e.p[r.i.p])+ue(e.d[r.i.p])+r.n.b+r.a.b,a-o}function Ur(e,t){var r,o,a;if(r=(e.i==null&&Ff(e),e.i),o=t.Jj(),o!=-1){for(a=r.length;o<a;++o)if(r[o]==t)return o}return-1}function aY(e,t){var r,o,a;return e.f>0?(e.Zj(),o=t==null?0:Rr(t),a=(o&sr)%e.d.length,r=rwt(e,a,o,t),r!=-1):!1}function Jj(e){var t,r,o,a;for(a=0,r=0,o=e.length;r<o;r++)t=(Yt(r,e.length),e.charCodeAt(r)),t<64&&(a=Of(a,fh(1,t)));return a}function c1n(e){var t,r,o,a,u;for(r=l(e.g,686),o=e.i-1;o>=0;--o)for(t=r[o],a=0;a<o;++a)if(u=r[a],Zyt(e,t,u)){ZS(e,o);break}}function F6(e,t){var r,o,a,u;for(u=za(e.e.Ah(),t),r=l(e.g,123),a=0;a<e.i;++a)if(o=r[a],u.$l(o.Jk()))return!1;return!0}function Rgt(e,t){var r,o;if(o=new IA(e.a.$c(t,!0)),o.a.gc()<=1)throw Y(new rS);return r=o.a.ec().Jc(),r.Pb(),l(r.Pb(),41)}function l1n(e,t,r){var o,a;for(o=Gi(r,$o),a=0;Ea(o,0)!=0&&a<t;a++)o=Ao(o,Gi(e[a],$o)),e[a]=Dn(o),o=u0(o,32);return Dn(o)}function Xj(e,t){ude();var r,o;return r=jO((L9(),L9(),bI)),o=null,t==r&&(o=l(wa(WEe,e),622)),o||(o=new Mst(e),t==r&&ns(WEe,e,o)),o}function Ogt(e){qw();var t;return t=new So(l(e.e.mf((_n(),b2)),8)),e.B.Gc((Uu(),Tk))&&(t.a<=0&&(t.a=20),t.b<=0&&(t.b=20)),t}function d1n(e){nj(),l(e.mf((_n(),G1)),185).Gc((Uu(),hU))&&(l(e.mf(cv),185).Ec((xu(),KT)),l(e.mf(G1),185).Kc(hU))}function Dgt(e){var t,r;t=e.d==(eT(),Wx),r=xbe(e),t&&!r||!t&&r?Te(e.a,(Be(),Kf),(mh(),FL)):Te(e.a,(Be(),Kf),(mh(),jL))}function f1n(e){var t,r,o,a;for(o=Gyn(e),xi(o,rNt),a=e.d,a.c.length=0,r=new V(o);r.a<r.c.c.length;)t=l(q(r),458),li(a,t.b)}function uY(){uY=K,W9(),TB=(Be(),vm),MIt=Wl(Z(X(ore,1),tve,149,0,[vL,od,o2,ym,ev,_te,ok,sk,xte,GI,Qy,$1,tv]))}function h1n(e,t){var r;return r=l(Au(e,ju(new Qo,new ls,new Ni,Z(X(ru,1),Ce,132,0,[(Yc(),nu)]))),16),r.Oc(Iot(r.gc()))}function Td(e,t){var r,o,a;return e.f>0&&(e.Zj(),o=t==null?0:Rr(t),a=(o&sr)%e.d.length,r=mme(e,a,o,t),r)?r.kd():null}function Lgt(e,t){var r,o,a;return ae(t,45)?(r=l(t,45),o=r.jd(),a=py(e.Pc(),o),rp(a,r.kd())&&(a!=null||e.Pc()._b(o))):!1}function Pa(e,t,r){var o,a,u;return e.Nj()?(o=e.i,u=e.Oj(),D6(e,o,t),a=e.Gj(3,null,t,o,u),r?r.lj(a):r=a):D6(e,e.i,t),r}function p1n(e,t,r){var o,a;return o=new cp(e.e,4,10,(a=t.c,ae(a,89)?l(a,29):(_t(),Ml)),null,gg(e,t),!1),r?r.lj(o):r=o,r}function g1n(e,t,r){var o,a;return o=new cp(e.e,3,10,null,(a=t.c,ae(a,89)?l(a,29):(_t(),Ml)),gg(e,t),!1),r?r.lj(o):r=o,r}function Mgt(e){wy();var t;return(e.q?e.q:(At(),At(),xh))._b((Be(),ow))?t=l(F(e,ow),205):t=l(F(ji(e),zI),205),t}function v1(e){jf();var t,r;return r=Dn(e),t=Dn(Rb(e,32)),t!=0?new sct(r,t):r>10||r<0?new ap(1,r):txt[r]}function Pgt(e){if(e.b==null){for(;e.a.Ob();)if(e.b=e.a.Pb(),!l(e.b,52).Gh())return!0;return e.b=null,!1}else return!0}function jgt(e,t,r){kft(),FZe.call(this),this.a=Yw(Axt,[Pe,wwe],[599,219],0,[b$,eee],2),this.c=new wS,this.g=e,this.f=t,this.d=r}function Fgt(e){this.e=we(Rn,Qn,30,e.length,15,1),this.c=we(uu,Ad,30,e.length,16,1),this.b=we(uu,Ad,30,e.length,16,1),this.f=0}function b1n(e){var t,r;for(e.j=we(Ki,Jo,30,e.p.c.length,15,1),r=new V(e.p);r.a<r.c.c.length;)t=l(q(r),9),e.j[t.p]=t.o.b/e.i}function $gt(e,t){var r,o;e.a=Ao(e.a,1),e.c=b.Math.min(e.c,t),e.b=b.Math.max(e.b,t),e.d+=t,r=t-e.f,o=e.e+r,e.f=o-e.e-r,e.e=o}function m1n(e,t){t.Tg("Min Size Postprocessing",1),Vn(e,(yh(),iv),b.Math.max(ue(ce(ve(e,iv))),ue(ce(ve(e,u4))))),t.Ug()}function Bgt(e,t){e.Vj();try{e.d._c(e.e++,t),e.f=e.d.j,e.g=-1}catch(r){throw r=ci(r),ae(r,99)?Y(new $c):Y(r)}}function cY(){cY=K,$re=new lqe,R3e=new dqe,O3e=new fqe,D3e=new hqe,L3e=new pqe,M3e=new gqe,P3e=new bqe,j3e=new mqe,F3e=new
Line truncated
|
||||
`;return r.substring(0,o.length)==o&&(r=r.substring(o.length)),r.split(`
|
||||
`)}return[]}function umn(e){var t;return t=(nht(),J_t),t[e>>>28]|t[e>>24&15]<<4|t[e>>20&15]<<8|t[e>>16&15]<<12|t[e>>12&15]<<16|t[e>>8&15]<<20|t[e>>4&15]<<24|t[e&15]<<28}function Z1t(e){var t,r,o;e.b==e.c&&(o=e.a.length,r=Pge(b.Math.max(8,o))<<1,e.b!=0?(t=Gl(e.a,r),uht(e,t,o),e.a=t,e.b=0):Mw(e.a,r),e.c=o)}function cmn(e,t){var r;return r=e.b,r.nf((_n(),zu))?r.$f()==(He(),Kt)?-r.Kf().a-ue(ce(r.mf(zu))):t+ue(ce(r.mf(zu))):r.$f()==(He(),Kt)?-r.Kf().a:t}function z6(e){var t;return e.b.c.length!=0&&l(ze(e.b,0),70).a?l(ze(e.b,0),70).a:(t=wW(e),t??""+(e.c?_s(e.c.a,e,0):-1))}function p7(e){var t;return e.f.c.length!=0&&l(ze(e.f,0),70).a?l(ze(e.f,0),70).a:(t=wW(e),t??""+(e.i?_s(e.i.j,e,0):-1))}function lmn(e,t){var r,o;if(t<0||t>=e.gc())return null;for(r=t;r<e.gc();++r)if(o=l(e.Xb(r),134),r==e.gc()-1||!o.o)return new ko(Re(r),o);return null}function tbe(e){var t,r,o,a,u;for(u=0,a=Li,o=0,r=new V(e.a);r.a<r.c.c.length;)t=l(q(r),175),u+=t.r+(o>0?e.c:0),a=b.Math.max(a,t.d),++o;e.e=u,e.b=a}function dmn(e){var t,r;if(!e.b)for(e.b=$P(l(e.f,127).jh().i),r=new tn(l(e.f,127).jh());r.e!=r.i.gc();)t=l(rn(r),158),Fe(e.b,new uq(t));return e.b}function fmn(e,t){var r,o,a;if(t.dc())return JA(),JA(),c5;for(r=new pit(e,t.gc()),a=new tn(e);a.e!=a.i.gc();)o=rn(a),t.Gc(o)&&Tn(r,o);return r}function nbe(e,t,r,o){return t==0?o?(!e.o&&(e.o=new pu((Qs(),Dh),Rg,e,0)),e.o):(!e.o&&(e.o=new pu((Qs(),Dh),Rg,e,0)),s6(e.o)):s7(e,t,r,o)}function PY(e){var t,r;if(e.rb)for(t=0,r=e.rb.i;t<r;++t)OO(oe(e.rb,t));if(e.vb)for(t=0,r=e.vb.i;t<r;++t)OO(oe(e.vb,t));_3((mu(),ao),e),e.Bb|=1}function Mr(e,t,r,o,a,u,f,p,m,y,v,T,N,O){return $mt(e,t,o,null,a,u,f,p,m,y,N,!0,O),b1e(e,v),ae(e.Cb,89)&&Sy(Pu(l(e.Cb,89)),2),r&&hge(e,r),g1e(e,T),e}function hmn(e){var t,r;if(e==null)return null;r=0;try{r=Ec(e,Qi,sr)&Ei}catch(o){if(o=ci(o),ae(o,133))t=aj(e),r=t[0];else throw Y(o)}return A6(r)}function pmn(e){var t,r;if(e==null)return null;r=0;try{r=Ec(e,Qi,sr)&Ei}catch(o){if(o=ci(o),ae(o,133))t=aj(e),r=t[0];else throw Y(o)}return A6(r)}function gmn(e,t){var r,o,a;return a=e.h-t.h,a<0||(r=e.l-t.l,o=e.m-t.m+(r>>22),a+=o>>22,a<0)?!1:(e.l=r&Hu,e.m=o&Hu,e.h=a&Ep,!0)}function jY(e,t,r,o,a,u,f){var p,m;return!(t.Re()&&(m=e.a.Le(r,o),m<0||!a&&m==0)||t.Se()&&(p=e.a.Le(r,u),p>0||!f&&p==0))}function bmn(e,t){N_();var r;if(r=e.j.g-t.j.g,r!=0)return 0;switch(e.j.g){case 2:return iY(t,FSe)-iY(e,FSe);case 4:return iY(e,jSe)-iY(t,jSe)}return 0}function mmn(e){switch(e.g){case 0:return Hee;case 1:return zee;case 2:return Gee;case 3:return qee;case 4:return Y$;case 5:return Vee;default:return null}}function os(e,t,r){var o,a;return o=(a=new nq,Yb(a,t),Ma(a,r),Tn((!e.c&&(e.c=new ke(lw,e,12,10)),e.c),a),a),cg(o,0),cy(o,1),pg(o,!0),hg(o,!0),o}function ZS(e,t){var r,o;if(t>=e.i)throw Y(new iV(t,e.i));return++e.j,r=e.g[t],o=e.i-t-1,o>0&&ua(e.g,t+1,e.g,t,o),ii(e.g,--e.i,null),e.Oi(t,r),e.Li(),r}function Q1t(e,t){var r,o;return e.Db>>16==17?e.Cb.Qh(e,21,Ol,t):(o=Mo(l(Nt((r=l(Vt(e,16),29),r||e.fi()),e.Db>>16),20)),e.Cb.Qh(e,o.n,o.f,t))}function wmn(e){var t,r,o,a;for(At(),xi(e.c,e.a),a=new V(e.c);a.a<a.c.c.length;)for(o=q(a),r=new V(e.b);r.a<r.c.c.length;)t=l(q(r),690),t._e(o)}function ymn(e){var t,r,o,a;for(At(),xi(e.c,e.a),a=new V(e.c);a.a<a.c.c.length;)for(o=q(a),r=new V(e.b);r.a<r.c.c.length;)t=l(q(r),378),t._e(o)}function vmn(e){var t,r,o,a,u;for(a=sr,u=null,o=new V(e.d);o.a<o.c.c.length;)r=l(q(o),220),r.d.j^r.e.j&&(t=r.e.e-r.d.e-r.a,t<a&&(a=t,u=r));return u}function rbe(){rbe=K,Nkt=new pt(kwe,(Lt(),!1)),_kt=new pt(Nwe,100),M2e=(G3(),uee),xkt=new pt(Cwe,M2e),kkt=new pt(Iwe,Hf),Ckt=new pt(Rwe,Re(sr))}function ebt(e,t){var r,o,a;for(o=new $t(qt(Lf(e).a.Jc(),new D));an(o);)return r=l(en(o),17),a=l(t.Kb(r),9),new v9(kn(a.n.b+a.o.b/2));return BN(),BN(),DQ}function tbt(e,t,r){var o,a,u,f,p,m,y,v;for(y=0,a=e.a[t],u=0,f=a.length;u<f;++u)for(o=a[u],v=oC(o,r),m=v.Jc();m.Ob();)p=l(m.Pb(),12),Jn(e.f,p,Re(y++))}function nbt(e,t,r){var o,a,u,f;if(r)for(a=r.a.length,o=new Ib(a),f=(o.b-o.a)*o.c<0?(r1(),eb):new s1(o);f.Ob();)u=l(f.Pb(),15),yt(e,t,nT(ay(r,u.a)))}function rbt(e,t,r){var o,a,u,f;if(r)for(a=r.a.length,o=new Ib(a),f=(o.b-o.a)*o.c<0?(r1(),eb):new s1(o);f.Ob();)u=l(f.Pb(),15),yt(e,t,nT(ay(r,u.a)))}function ibe(e){S1();var t;return t=l(pC(kS(e.k),we(Io,ea,64,2,0,1)),128),g_(t,0,t.length,null),t[0]==(He(),Wt)&&t[1]==Kt&&(ii(t,0,Kt),ii(t,1,Wt)),t}function ibt(e,t,r){var o,a,u;return a=Z2n(e,t,r),u=Xme(e,a),tK(e.b),MW(e,t,r),At(),xi(a,new xJe(e)),o=Xme(e,a),tK(e.b),MW(e,r,t),new ko(Re(u),Re(o))}function obt(){obt=K,E4t=$n(new ui,(Vi(),Ho),(Zi(),_I)),OB=new Pr("linearSegments.inputPrio",Re(0)),DB=new Pr("linearSegments.outputPrio",Re(0))}function Emn(e){var t,r,o,a;for(r=0,t=0,a=new tn(e);a.e!=a.i.gc();)o=l(rn(a),19),r=b.Math.max(o.g+o.i,r),t=b.Math.max(o.f+o.j,t);return new Me(r,t)}function Smn(e,t){var r,o,a,u;for(u=0,o=new V(e);o.a<o.c.c.length;)r=l(q(o),19),u+=b.Math.pow(r.g*r.f-t,2);return a=b.Math.sqrt(u/(e.c.length-1)),a}function vc(){vc=K,VL=new E8("UNKNOWN",0),Ih=new E8("ABOVE",1),q1=new E8("BELOW"
Line truncated
|
||||
\r\f]+`);try{R4=Z(X(lCn,1),Rt,2093,0,[new eO((ude(),Xj("yyyy-MM-dd'T'HH:mm:ss'.'SSSZ",jO((L9(),L9(),bI))))),new eO(Xj("yyyy-MM-dd'T'HH:mm:ss'.'SSS",jO(bI))),new eO(Xj("yyyy-MM-dd'T'HH:mm:ss",jO(bI))),new eO(Xj("yyyy-MM-dd'T'HH:mm",jO(bI))),new eO(Xj("yyyy-MM-dd",jO(bI)))])}catch(e){if(e=ci(e),!ae(e,81))throw Y(e)}}function __n(e){var t,r,o,a,u,f,p;for(r=null,p=null,o=l(F(e.b,(Be(),mte)),349),o==(nC(),AL)&&(r=new je,p=new je),f=new V(e.d);f.a<f.c.c.length;)if(u=l(q(f),108),a=u.i,!!a)switch(u.e.g){case 0:t=l(U3(new fS(u.b)),64),o==AL&&t==(He(),Wt)?Ot(r.c,u):o==AL&&t==(He(),dn)?Ot(p.c,u):Xvn(u,t);break;case 1:E2n(u);break;case 2:case 3:FTn(u);break;case 4:Ryn(u)}r&&(r.c.length==0||lvt(r,(He(),Wt)),p.c.length==0||lvt(p,(He(),dn)))}function x_n(e,t){var r,o,a,u;if(a=Bu(e.d,1)!=0,o=m0e(e,t),o==0&&Ye(Ke(F(t.j,(Ie(),j1)))))return 0;!Ye(Ke(F(t.j,(Ie(),j1))))&&!Ye(Ke(F(t.j,e2)))||be(F(t.j,(Be(),Ch)))===be((bp(),B1))?t.c.kg(t.e,a):a=Ye(Ke(F(t.j,j1))),oD(e,t,a,!0),Ye(Ke(F(t.j,e2)))&&Te(t.j,e2,(Lt(),!1)),Ye(Ke(F(t.j,j1)))&&(Te(t.j,j1,(Lt(),!1)),Te(t.j,e2,!0)),r=m0e(e,t);do{if(bge(e),r==0)return 0;a=!a,u=r,oD(e,t,a,!1),r=m0e(e,t)}while(u>r);return u}function yvt(e,t){var r,o,a,u;if(a=Bu(e.d,1)!=0,o=x7(e,t),o==0&&Ye(Ke(F(t.j,(Ie(),j1)))))return 0;!Ye(Ke(F(t.j,(Ie(),j1))))&&!Ye(Ke(F(t.j,e2)))||be(F(t.j,(Be(),Ch)))===be((bp(),B1))?t.c.kg(t.e,a):a=Ye(Ke(F(t.j,j1))),oD(e,t,a,!0),Ye(Ke(F(t.j,e2)))&&Te(t.j,e2,(Lt(),!1)),Ye(Ke(F(t.j,j1)))&&(Te(t.j,j1,(Lt(),!1)),Te(t.j,e2,!0)),r=x7(e,t);do{if(bge(e),r==0)return 0;a=!a,u=r,oD(e,t,a,!1),r=x7(e,t)}while(u>r);return u}function k_n(e,t,r){var o,a,u,f,p;if(o=l(F(e,(Be(),pte)),24),r.a>t.a&&(o.Gc((Zb(),g4))?e.c.a+=(r.a-t.a)/2:o.Gc(b4)&&(e.c.a+=r.a-t.a)),r.b>t.b&&(o.Gc((Zb(),w4))?e.c.b+=(r.b-t.b)/2:o.Gc(m4)&&(e.c.b+=r.b-t.b)),l(F(e,(Ie(),xa)),24).Gc((Fo(),rl))&&(r.a>t.a||r.b>t.b))for(p=new V(e.a);p.a<p.c.c.length;)f=l(q(p),9),f.k==(zt(),mi)&&(a=l(F(f,Hs),64),a==(He(),Qt)?f.n.a+=r.a-t.a:a==dn&&(f.n.b+=r.b-t.b));u=e.d,e.f.a=r.a-u.b-u.c,e.f.b=r.b-u.d-u.a}function N_n(e,t,r){var o,a,u,f,p;if(o=l(F(e,(Be(),pte)),24),r.a>t.a&&(o.Gc((Zb(),g4))?e.c.a+=(r.a-t.a)/2:o.Gc(b4)&&(e.c.a+=r.a-t.a)),r.b>t.b&&(o.Gc((Zb(),w4))?e.c.b+=(r.b-t.b)/2:o.Gc(m4)&&(e.c.b+=r.b-t.b)),l(F(e,(Ie(),xa)),24).Gc((Fo(),rl))&&(r.a>t.a||r.b>t.b))for(f=new V(e.a);f.a<f.c.c.length;)u=l(q(f),9),u.k==(zt(),mi)&&(a=l(F(u,Hs),64),a==(He(),Qt)?u.n.a+=r.a-t.a:a==dn&&(u.n.b+=r.b-t.b));p=e.d,e.f.a=r.a-p.b-p.c,e.f.b=r.b-p.d-p.a}function C_n(e){var t,r,o,a,u,f,p,m,y,v,T,N;for(t=_0t(e),v=(p=new Xh(t).a.vc().Jc(),new T9(p));v.a.Ob();){for(y=(a=l(v.a.Pb(),45),l(a.jd(),9)),T=0,N=0,T=y.d.d,N=y.o.b+y.d.a,e.d[y.p]=0,r=y;(u=e.a[r.p])!=y;)o=D1n(r,u),m=0,e.c==(If(),kg)?m=o.d.n.b+o.d.a.b-o.c.n.b-o.c.a.b:m=o.c.n.b+o.c.a.b-o.d.n.b-o.d.a.b,f=ue(e.d[r.p])+m,e.d[u.p]=f,T=b.Math.max(T,u.d.d-f),N=b.Math.max(N,f+u.o.b+u.d.a),r=u;r=y;do e.d[r.p]=ue(e.d[r.p])+T,r=e.a[r.p];while(r!=y);e.b[y.p]=T+N}}function O0e(e,t,r,o){var a,u,f,p,m,y,v,T,N;return m=Di(new Me(r.a,r.b),e),y=m.a*t.b-m.b*t.a,v=t.a*o.b-t.b*o.a,T=(m.a*o.b-m.b*o.a)/v,N=y/v,v==0?y==0?(a=br(new Me(r.a,r.b),tp(new Me(o.a,o.b),.5)),u=f1(e,a),f=f1(br(new Me(e.a,e.b),t),a),p=b.Math.sqrt(o.a*o.a+o.b*o.b)*.5,u<f&&u<=p?new Me(e.a,e.b):f<=p?br(new Me(e.a,e.b),t):null):null:T>=0&&T<=1&&N>=0&&N<=1?br(new Me(e.a,e.b),tp(new Me(t.a,t.b),T)):null}function MC(e,t,r){var o,a,u,f,p,m,y,v,T,N;for(u=0,f=e.t,a=0,o=0,m=0,N=0,T=0,r&&(e.n.c.length=0,Fe(e.n,new MP(e.s,e.t,e.i))),p=0,v=new V(e.b);v.a<v.c.c.length;)y=l(q(v),19),u+y.g+(p>0?e.i:0)>t&&m>0&&(u=0,f+=m+e.i,a=b.Math.max(a,N),o+=m+e.i,m=0,N=0,r&&(++T,Fe(e.n,new MP(e.s,f,e.i))),p=0),N+=y.g+(p>0?e.i:0),m=b.Math.max(m,y.f),r&&Z1e(l(ze(e.n,T),211),y),u+=y.g+(p>0?e.i:0),++p;return a=b.Math.max(a,N),o+=m,r&&(e.r=a,e.d=o,tbe(e.j)),new ql(e.s,e.t,a,o)}function V7(e){var t,r,o;return r=be(ve(e,(Be(),jT)))===be((tD(),$ee))||be(ve(e,jT))===be(Lee)||be(ve(e,jT))===be(Mee)||be(ve(e,jT))===be(jee)||be(ve(e,jT))===be(Bee)||be(ve(e,jT))===be(uL),o=be(ve(e,gB))===be((rD(),Ite))||be(ve(e,gB))===be(Ote)||be(ve(e,wL))===be((_1(),ak))||be(ve(e,wL))===be((_1(),KI)),t=be(ve(e,Ch))!==be((bp(),B1))||Ye(Ke(ve(e,tk)))||be(ve(e,jI))!==be((YS(),TI))||ue(ce(ve(e,bL)))!=0||ue(ce(ve(e,dte)))!=0,r||o||t}function CE(e){var t,r,o,a,u,f,p,m;if(!e.a){if(e.o=null,m=new eZe(e),t=new oqe,r=L4,p=r.a.yc(e,r),p==null){for(f=new tn(ds(e));f.e!=f.i.gc();)u=l(rn(f),29),ti(m,CE(u));r.a.Ac(e)!=null,r.a.gc()==0}for(a=(!e.s&&(e.s=new ke(au,e,21,17)),new tn(e.s));a.e!=a.i.gc();)o=l(rn(a),182),ae(o,336)&&Tn(t,l(o,38));hy(t),e.k=new mot(e,(l(oe(Ne((a1(),Ut).o),7),20),t.i),t.g),ti(m,e.k),hy(m),e.a=new Qv((l(oe(Ne(Ut.o),4),20),m.i),m.g),Pu(e).b&=-2}return e.a}function I_n(e){var t,r,o,a,u,f,p,m,y,v,T,N;if(p=e.d,T=l(F(e,(Ie(),MT)),16),t=l(F(e,NT),16),!(!T&&!t)){if(u=ue(ce(by(e,(Be(),Ate)))),f=ue(ce(by(e,HAe))),N=0,T){for(y=0,a=T.Jc();a.Ob();)o=l(a.Pb(),9),y=b.Math.max(y,o.o.b),N+=o.o.a;N+=u*(T.gc()-1),p.d+=y+f}if(r=0,t){for(y=0,a=t.Jc();a.Ob();)o=l(a.Pb(),9),y=b.Math.max(y,o.o.b),r+=o.o.a;r+=u*(t.gc()-1),p.a+=y+f}m=b.M
Line truncated
|
||||
\r\r `),ns(E2,kQ,o),ns(_k,kQ,xy(o)),o=new bc(4),$6(o,N_t),ns(E2,gI,o),ns(_k,gI,xy(o)),o=new bc(4),$6(o,N_t),ns(E2,gI,o),ns(_k,gI,xy(o)),o=new bc(4),$6(o,C_t),Ny(o,l(wa(E2,gI),122)),ns(E2,xQ,o),ns(_k,xQ,xy(o)),o=new bc(4),$6(o,"-.0:AZ__az··ÀÖØöøıĴľŁňŊžƀǃǍǰǴǵǺȗɐʨʻˁːˑ̀͠͡ͅΆΊΌΌΎΡΣώϐϖϚϚϜϜϞϞϠϠϢϳЁЌЎяёќўҁ҃҆ҐӄӇӈӋӌӐӫӮӵӸӹԱՖՙՙաֆֹֻֽֿֿׁׂ֑֣֡ׄׄאתװײءغـْ٠٩ٰڷںھۀێېۓە۪ۭۨ۰۹ँःअह़्॑॔क़ॣ०९ঁঃঅঌএঐওনপরললশহ়়াৄেৈো্ৗৗড়ঢ়য়ৣ০ৱਂਂਅਊਏਐਓਨਪਰਲਲ਼ਵਸ਼ਸਹ਼਼ਾੂੇੈੋ੍ਖ਼ੜਫ਼ਫ਼੦ੴઁઃઅઋઍઍએઑઓનપરલળવહ઼ૅેૉો્ૠૠ૦૯ଁଃଅଌଏଐଓନପରଲଳଶହ଼ୃେୈୋ୍ୖୗଡ଼ଢ଼ୟୡ୦୯ஂஃஅஊஎஐஒகஙசஜஜஞடணதநபமவஷஹாூெைொ்ௗௗ௧௯ఁఃఅఌఎఐఒనపళవహాౄెైొ్ౕౖౠౡ౦౯ಂಃಅಌಎಐಒನಪಳವಹಾೄೆೈೊ್ೕೖೞೞೠೡ೦೯ംഃഅഌഎഐഒനപഹാൃെൈൊ്ൗൗൠൡ൦൯กฮะฺเ๎๐๙ກຂຄຄງຈຊຊຍຍດທນຟມຣລລວວສຫອຮະູົຽເໄໆໆ່ໍ໐໙༘༙༠༩༹༹༵༵༷༷༾ཇཉཀྵ྄ཱ྆ྋྐྕྗྗྙྭྱྷྐྵྐྵႠჅაჶᄀᄀᄂᄃᄅᄇᄉᄉᄋᄌᄎᄒᄼᄼᄾᄾᅀᅀᅌᅌᅎᅎᅐᅐᅔᅕᅙᅙᅟᅡᅣᅣᅥᅥᅧᅧᅩᅩᅭᅮᅲᅳᅵᅵᆞᆞᆨᆨᆫᆫᆮᆯᆷᆸᆺᆺᆼᇂᇫᇫᇰᇰᇹᇹḀẛẠỹἀἕἘἝἠὅὈὍὐὗὙὙὛὛὝὝὟώᾀᾴᾶᾼιιῂῄῆῌῐΐῖΊῠῬῲῴῶῼ⃐⃜⃡⃡ΩΩKÅ℮℮ↀↂ々々〇〇〡〯〱〵ぁゔ゙゚ゝゞァヺーヾㄅㄬ一龥가힣"),ns(E2,NQ,o),ns(_k,NQ,xy(o)),o=new bc(4),$6(o,C_t),Sa(o,95,95),Sa(o,58,58),ns(E2,CQ,o),ns(_k,CQ,xy(o))),r=l(wa(t?E2:_k,e),140),r}function KEt(e){n0(e,new Qb(gq(iO(Qm(Jm(Zm(Xm(new vb,Bt),"ELK Layered"),"Layer-based algorithm provided by the Eclipse Layout Kernel. Arranges as many edges as possible into one direction by placing nodes into subsequent layers. This implementation supports different routing styles (straight, orthogonal, splines); if orthogonal routing is selected, arbitrary port constraints are respected, thus enabling the layout of block diagrams such as actor-oriented models or circuit schematics. Furthermore, full layout of compound graphs with cross-hierarchy edges is supported when the respective option is activated on the top level."),new yUe),Bt),xr((sT(),Dre),Z(X(s5,1),Ce,235,0,[yU,o5,i5,Ore,wU,mU]))))),De(e,Bt,Sye,Ge(Ate)),De(e,Bt,Tye,Ge(HAe)),De(e,Bt,Aye,Ge(vL)),De(e,Bt,_ye,Ge(od)),De(e,Bt,LX,Ge(o2)),De(e,Bt,SZ,Ge(ym)),De(e,Bt,xye,Ge(ev)),De(e,Bt,kye,Ge(ok)),De(e,Bt,Nye,Ge(sk)),De(e,Bt,Cye,Ge(_te)),De(e,Bt,$0,Ge(vm)),De(e,Bt,Iye,Ge(xte)),De(e,Bt,Rye,Ge(GI)),De(e,Bt,Oye,Ge(EB)),De(e,Bt,eye,Ge(yL)),De(e,Bt,nye,Ge(Qy)),De(e,Bt,tye,Ge($1)),De(e,Bt,rye,Ge(tv)),De(e,Bt,CD,Re(0)),De(e,Bt,iye,Ge(ik)),De(e,Bt,oye,Ge(UAe)),De(e,Bt,sye,Ge(FT)),De(e,Bt,Sp,Ge(XAe)),De(e,Bt,EF,Ge(GAe)),De(e,Bt,SF,Ge(qAe)),De(e,Bt,ZC,Ge(Nte)),De(e,Bt,iZ,Ge(VAe)),De(e,Bt,oZ,Ge(WAe)),De(e,Bt,TF,Ge(SB)),De(e,Bt,AF,Ge(Cte)),De(e,Bt,_F,Ge(YAe)),De(e,Bt,xF,Ge(KAe)),De(e,Bt,sZ,Ge(JAe)),De(e,Bt,aZ,Ge(IAe)),De(e,Bt,uZ,Ge(vte)),De(e,Bt,cZ,Ge(bB)),De(e,Bt,lZ,Ge(Ete)),De(e,Bt,ZX,Ge(ow)),De(e,Bt,QX,Ge(zI)),De(e,Bt,wF,Ge(wte)),De(e,Bt,yF,Ge(yAe)),De(e,Bt,RD,Ge(OIt)),De(e,Bt,OD,Ge(DIt)),De(e,Bt,DD,Ge(RIt)),De(e,Bt,LD,Ge(IIt)),De(e,Bt,U0,zAe),De(e,Bt,B0,PAe),De(e,Bt,BD,bAe),De(e,Bt,Dye,0),De(e,Bt,cF,Re(1)),De(e,Bt,mx,bx),De(e,Bt,Lye,Ge(wm)),De(e,Bt,lF,Ge(Zr)),De(e,Bt,Mye,Ge(rk)),De(e,Bt,UD,Ge(vIt)),De(e,Bt,Pye,Ge(Kf)),De(e,Bt,NF,Ge(Wy)),De(e,Bt,WC,(Lt(),!0)),De(e,Bt,jye,Ge(Ky)),De(e,Bt,Fye,Ge(bm)),De(e,Bt,ME,Ge(mm)),De(e,Bt,bT,Ge(vB)),De(e,Bt,vx,Ge(Tte)),De(e,Bt,TZ,gAe),De(e,Bt,Ex,Ge(iw)),De(e,Bt,$ye,Ge(wB)),De(e,Bt,Sx,Ge(Xy)),De(e,Bt,Bye,Ge(xIt)),De(e,Bt,Uye,Ge($Ae)),De(e,Bt,Hye,FAe),De(e,Bt,zye,Ge(TIt)),De(e,Bt,Gye,Ge(AIt)),De(e,Bt,qye,Ge(_It)),De(e,Bt,Vye,Ge(SIt)),De(e,Bt,Uwe,Ge(kte)),De(e,Bt,FD,Ge(gB)),De(e,Bt,zX,Ge(wL)),De(e,Bt,Bwe,Ge(qI)),De(e,Bt,zwe,Ge(Cs)),De(e,Bt,jD,Ge(jT)),De(e,Bt,XC,Ge(BI)),De(e,Bt,Vwe,Ge(tk)),De(e,Bt,Xwe,Ge(fAe)),De(e,Bt,KX,Ge(gte)),De(e,Bt,bF,Ge(mL)),De(e,Bt,WX,Ge(bte)),De(e,Bt,Pwe,Ge(RAe)),De(e,Bt,jwe,Ge(OAe)),De(e,Bt,gF,Ge(_Ae)),De(e,Bt,PE,Ge(yB)),De(e,Bt,JX,Ge(Ste)),De(e,Bt,Mwe,Ge(yte)),De(e,Bt,XX,Ge(LAe)),De(e,Bt,Zwe,Ge(wAe)),De(e,Bt,Qwe,Ge(mte)),De(e,Bt,CF,Ge(pte)),De(e,Bt,YX,Ge(DAe)),De(e,Bt,aye,Ge(cB)),De(e,Bt,uye,Ge(uAe)),De(e,Bt,tZ,Ge(uB)),De(e,Bt,vF,Ge(SAe)),De(e,Bt,nZ,Ge(EAe)),De(e,Bt,rZ,Ge(TAe)),De(e,Bt,mT,Ge(nk)),De(e,Bt,Wye,Ge(ss)),De(e,Bt,Kye,Ge(_g)),De(e,Bt,Yye,Ge(Yf)),De(e,Bt,ID,Ge(i2)),De(e,Bt,VX,Ge(hAe)),De(e,Bt,Jye,Ge(xg)),De(e,Bt,Xye,Ge(PI)),De(e,Bt,Zye,Ge(pB)),De(e,Bt,Qye,Ge(sw)),De(e,Bt,AZ,Ge(jAe)),De(e,Bt,_Z,Ge(Yy)),De(e,Bt,UX,Ge(kAe)),De(e,Bt,HX,Ge(NAe)),De(e,Bt,IF,Ge(Zy)),De(e,Bt,Fwe,Ge(lte)),De(e
Line truncated
|
||||
`,tSt=`)]}"' \r
|
||||
`,nSt="The given string contains parts that cannot be parsed as numbers.",PD="org.eclipse.elk.core.math",rSt={3:1,4:1,125:1,216:1,419:1},iSt={3:1,4:1,100:1,216:1,419:1},Eg="org.eclipse.elk.alg.layered.graph.transform",oSt="ElkGraphImporter",sSt="ElkGraphImporter/lambda$1$Type",aSt="ElkGraphImporter/lambda$2$Type",uSt="ElkGraphImporter/lambda$4$Type",Zt="org.eclipse.elk.alg.layered.intermediate",cSt="Node margin calculation",lSt="ONE_SIDED_GREEDY_SWITCH",dSt="TWO_SIDED_GREEDY_SWITCH",jX="No implementation is available for the layout processor ",FX="IntermediateProcessorStrategy",$X="Node '",fSt="FIRST_SEPARATE",hSt="LAST_SEPARATE",pSt="Odd port side processing",di="org.eclipse.elk.alg.layered.intermediate.compaction",YC="org.eclipse.elk.alg.layered.intermediate.greedyswitch",_h="org.eclipse.elk.alg.layered.p3order.counting",JC={223:1},yT="org.eclipse.elk.alg.layered.intermediate.loops",Ac="org.eclipse.elk.alg.layered.intermediate.loops.ordering",C1="org.eclipse.elk.alg.layered.intermediate.loops.routing",pF="org.eclipse.elk.alg.layered.intermediate.preserveorder",zf="org.eclipse.elk.alg.layered.intermediate.wrapping",$s="org.eclipse.elk.alg.layered.options",BX="INTERACTIVE",Dwe="GREEDY",gSt="DEPTH_FIRST",bSt="EDGE_LENGTH",mSt="SELF_LOOPS",wSt="firstTryWithInitialOrder",Lwe="org.eclipse.elk.layered.directionCongruency",Mwe="org.eclipse.elk.layered.feedbackEdges",gF="org.eclipse.elk.layered.interactiveReferencePoint",Pwe="org.eclipse.elk.layered.mergeEdges",jwe="org.eclipse.elk.layered.mergeHierarchyEdges",Fwe="org.eclipse.elk.layered.allowNonFlowPortsToSwitchSides",$we="org.eclipse.elk.layered.portSortingStrategy",Bwe="org.eclipse.elk.layered.thoroughness",Uwe="org.eclipse.elk.layered.unnecessaryBendpoints",Hwe="org.eclipse.elk.layered.generatePositionAndLayerIds",jD="org.eclipse.elk.layered.cycleBreaking.strategy",FD="org.eclipse.elk.layered.layering.strategy",zwe="org.eclipse.elk.layered.layering.layerConstraint",Gwe="org.eclipse.elk.layered.layering.layerChoiceConstraint",qwe="org.eclipse.elk.layered.layering.layerId",UX="org.eclipse.elk.layered.layering.minWidth.upperBoundOnWidth",HX="org.eclipse.elk.layered.layering.minWidth.upperLayerEstimationScalingFactor",zX="org.eclipse.elk.layered.layering.nodePromotion.strategy",GX="org.eclipse.elk.layered.layering.nodePromotion.maxIterations",qX="org.eclipse.elk.layered.layering.coffmanGraham.layerBound",XC="org.eclipse.elk.layered.crossingMinimization.strategy",Vwe="org.eclipse.elk.layered.crossingMinimization.forceNodeModelOrder",VX="org.eclipse.elk.layered.crossingMinimization.hierarchicalSweepiness",WX="org.eclipse.elk.layered.crossingMinimization.semiInteractive",Wwe="org.eclipse.elk.layered.crossingMinimization.inLayerPredOf",Kwe="org.eclipse.elk.layered.crossingMinimization.inLayerSuccOf",Ywe="org.eclipse.elk.layered.crossingMinimization.positionChoiceConstraint",Jwe="org.eclipse.elk.layered.crossingMinimization.positionId",Xwe="org.eclipse.elk.layered.crossingMinimization.greedySwitch.activationThreshold",KX="org.eclipse.elk.layered.crossingMinimization.greedySwitch.type",bF="org.eclipse.elk.layered.crossingMinimization.greedySwitchHierarchical.type",PE="org.eclipse.elk.layered.nodePlacement.strategy",mF="org.eclipse.elk.layered.nodePlacement.favorStraightEdges",YX="org.eclipse.elk.layered.nodePlacement.bk.edgeStraightening",JX="org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment",XX="org.eclipse.elk.layered.nodePlacement.linearSegments.deflectionDampening",ZX="org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility",QX="org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.default",Zwe="org.eclipse.elk.layered.edgeRouting.selfLoopDistribution",Qwe="org.eclipse.elk.layered.edgeRouting.selfLoopOrdering",wF="org.eclipse.elk.layered.edgeRouting.splines.mode",yF="org.eclipse.elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor",eZ="org.eclipse.elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth",eye="org.eclipse.elk.layered.spacing.baseValue",tye="org.eclipse.elk.layered.spacing.edgeNodeBetweenLayers",nye="org.eclipse.elk.layered.spacing.edgeEdgeBetweenLayers",rye="org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers",iye="org.eclipse.elk.layered.priority.direction",oye="org.eclipse.elk.layered.priority.shortness",sye="org.eclipse.elk.layered.priority.straightness",tZ="org.eclipse.elk.layered.compaction.connectedComponents",aye="org.eclipse.elk.layered.compaction.postCompaction.strategy",uye="org.eclipse.elk.layered.compaction.postCompaction.constraints",vF="org.eclipse.elk.layered.highDegreeNodes.treatment",nZ="org.eclipse.elk.layered.highDegreeNodes.threshold",rZ="org.eclipse.elk.layered.highDegreeNodes.treeHeight",Sp="org.eclipse.elk.layered.wrapping.strategy",EF="org.eclipse.elk.layered.wrapping.additionalEdgeSpacing",SF="org.eclipse.elk.layered.wrapping.correctionFactor",ZC="org.eclipse.elk.layered.wrapping.cutting.strategy",iZ="org.eclipse.elk.layered.wrapping.cutting.cuts",oZ="org.eclipse.elk.layered.wrapping.cut
Line truncated
|
||||
start=`,ba(t,this.i),t.a+=`
|
||||
end=`,ba(t,this.a),t.a+=`
|
||||
nodeStartEdge=`,ba(t,this.e),t.a+=`
|
||||
startEndEdge=`,ba(t,this.j),t.a+=`
|
||||
originalEdge=`,ba(t,this.f),t.a+=`
|
||||
startInLayerDummy=`,ba(t,this.k),t.a+=`
|
||||
startInLayerEdge=`,ba(t,this.n),t.a+=`
|
||||
endInLayerDummy=`,ba(t,this.b),t.a+=`
|
||||
endInLayerEdge=`,ba(t,this.c),t.a},k(zf,"BreakingPointInserter/BPInfo",318),_(657,1,{657:1},vJe),h.a=!1,h.b=0,h.c=0,k(zf,"BreakingPointInserter/Cut",657),_(1523,1,kr,hUe),h.If=function(t,r){n2n(l(t,37),r)},k(zf,"BreakingPointProcessor",1523),_(1524,1,Mn,lUe),h.Mb=function(t){return sft(l(t,9))},k(zf,"BreakingPointProcessor/0methodref$isEnd$Type",1524),_(1525,1,Mn,pUe),h.Mb=function(t){return aft(l(t,9))},k(zf,"BreakingPointProcessor/1methodref$isStart$Type",1525),_(1526,1,kr,gUe),h.If=function(t,r){_2n(this,l(t,37),r)},k(zf,"BreakingPointRemover",1526),_(1527,1,nn,bUe),h.Ad=function(t){l(t,134).k=!0},k(zf,"BreakingPointRemover/lambda$0$Type",1527),_(805,1,{},kme),h.b=0,h.e=0,h.f=0,h.j=0,k(zf,"GraphStats",805),_(806,1,{},Lue),h.Te=function(t,r){return b.Math.max(ue(ce(t)),ue(ce(r)))},k(zf,"GraphStats/0methodref$max$Type",806),_(807,1,{},Mue),h.Te=function(t,r){return b.Math.max(ue(ce(t)),ue(ce(r)))},k(zf,"GraphStats/2methodref$max$Type",807),_(1709,1,{},mUe),h.Te=function(t,r){return pin(ce(t),ce(r))},k(zf,"GraphStats/lambda$1$Type",1709),_(1710,1,{},dJe),h.Kb=function(t){return f1t(this.a,l(t,26))},k(zf,"GraphStats/lambda$2$Type",1710),_(1711,1,{},fJe),h.Kb=function(t){return bwt(this.a,l(t,26))},k(zf,"GraphStats/lambda$6$Type",1711),_(808,1,{},Pue),h.mg=function(t,r){var o;return o=l(F(t,(Be(),VAe)),16),o||(At(),At(),Co)},h.ng=function(){return!1},k(zf,"ICutIndexCalculator/ManualCutIndexCalculator",808),_(810,1,{},jue),h.mg=function(t,r){var o,a,u,f,p,m,y,v,T,N,O,M,U,z,J,ne,se,de,Ee;for(Ee=(r.n==null&&$1t(r),r.n),y=(r.d==null&&$1t(r),r.d),de=we(Ki,Jo,30,Ee.length,15,1),de[0]=Ee[0],ne=Ee[0],v=1;v<Ee.length;v++)de[v]=de[v-1]+Ee[v],ne+=Ee[v];for(u=gmt(r)-1,p=l(F(t,(Be(),WAe)),15).a,a=Li,o=new je,O=b.Math.max(0,u-p);O<=b.Math.min(r.f-1,u+p);O++){if(z=ne/(O+1),J=0,T=1,f=new je,se=Li,N=0,m=0,U=y[0],O==0)se=ne,m=(r.g==null&&(r.g=wht(r,new Mue)),ue(r.g));else{for(;T<r.f;)de[T-1]-J>=z&&(Fe(f,Re(T)),se=b.Math.max(se,de[T-1]-N),m+=U,J+=de[T-1]-J,N=de[T-1],U=y[T]),U=b.Math.max(U,y[T]),++T;m+=U}M=b.Math.min(1/se,1/r.b/m),M>a&&(a=M,o=f)}return o},h.ng=function(){return!1},k(zf,"MSDCutIndexHeuristic",810),_(1664,1,kr,wUe),h.If=function(t,r){f_n(l(t,37),r)},k(zf,"SingleEdgeGraphWrapper",1664),_(233,23,{3:1,34:1,23:1,233:1},n3);var KE,Wx,Kx,zy,xI,YE,Yx=fn($s,"CenterEdgeLabelPlacementStrategy",233,bn,Ndn,Rrn),CNt;_(427,23,{3:1,34:1,23:1,427:1},Rle);var BSe,Oee,USe=fn($s,"ConstraintCalculationStrategy",427,bn,Kan,Irn),INt;_(302,23,{3:1,34:1,23:1,302:1,173:1,177:1},l8),h.bg=function(){return twt(this)},h.og=function(){return twt(this)};var aL,kI,HSe,zSe,GSe=fn($s,"CrossingMinimizationStrategy",302,bn,iln,Lrn),RNt;_(351,23,{3:1,34:1,23:1,351:1},Oq);var qSe,Dee,W$,VSe=fn($s,"CuttingStrategy",351,bn,qun,Mrn),ONt;_(268,23,{3:1,34:1,23:1,268:1,173:1,177:1},Kv),h.bg=function(){return syt(this)},h.og=function(){return syt(this)};var Lee,WSe,Mee,Pee,jee,Fee,$ee,Bee,uL,KSe=fn($s,"CycleBreakingStrategy",268,bn,$fn,Prn),DNt;_(424,23,{3:1,34:1,23:1,424:1},Ole);var K$,YSe,JSe=fn($s,"DirectionCongruency",424,bn,Yan,jrn),LNt;_(452,23,{3:1,34:1,23:1,452:1},Dq);var Jx,Uee,JE,MNt=fn($s,"EdgeConstraint",452,bn,Vun,Frn),PNt;_(286,23,{3:1,34:1,23:1,286:1},r3);var Hee,zee,Gee,qee,Y$,Vee,XSe=fn($s,"EdgeLabelSideSelection",286,bn,_dn,$rn),jNt;_(479,23,{3:1,34:1,23:1,479:1},Dle);var J$,ZSe,QSe=fn($s,"EdgeStraighteningStrategy",479,bn,Jan,Brn),FNt;_(284,23,{3:1,34:1,23:1,284:1},i3);var Wee,eTe,tTe,X$,nTe,rTe,iTe=fn($s,"FixedAlignment",284,bn,xdn,Urn),$Nt;_(285,23,{3:1,34:1,23:1,285:1},o3);var oTe,sTe,aTe,uTe,NI,cTe,lTe=fn($s,"GraphCompactionStrategy",285,bn,kdn,Hrn),BNt;_(262,23,{3:1,34:1,23:1,262:1},Fw);var Xx,Z$,Zx,rl,CI,Q$,Qx,XE,eB,II,Kee=fn($s,"GraphProperties",262,bn,shn,zrn),UNt;_(303,23,{3:1,34:1,23:1,303:1},Lq);var cL,Yee,Jee,Xee=fn($s,"GreedySwitchType",303,bn,Gun,Grn),HNt;_(330,23,{3:1,34:1,23:1,330:1},Mq);var Gy,dTe,lL,Zee=fn($s,"GroupOrderStrategy",330,bn,Hun,qrn),zNt;_(316,23,{3:1,34:1,23:1,316:1},Pq);var kT,dL,ZE,GNt=fn($s,"InLayerConstraint",316,bn,zun,Vrn),qNt;_(425,23,{3:1,34:1,23:1,425:1},Lle);var Qee,fTe,hTe=fn($s,"InteractiveReferencePoint",425,bn,qan,Wrn),VNt,pTe,NT,ew,fL,tB,gTe,bTe,nB,mTe,CT,rB,RI,IT,_p,ete,iB,Hs,wTe,j1,xa,tte,nte,hL,hm,tw,RT,yTe,WNt,OT,pL,qy,Cd,Nl,rte,QE,F1,Cr,mr,vTe,ETe,STe,TTe,ATe,ite,oB,Nu,nw,ote,DT,OI,Ag,e2,rw,t2,n2,ek,pm,_Te,ste,ate,DI,LT,sB,MT,r2;_(166,23,{3:1,34:1,23:1,166:1},bO);var LI,xp,MI,gm,gL,xTe=fn($s,"LayerConstraint",166,bn,Qln,Krn),KNt;_(428,23,{3:1,34:1,23:1,428:1},Mle);var ute,cte,kTe=fn($s,"LayerUnzippingStrategy",428,bn,Van,Yrn),YNt;_(851,1,td,IWe),h.tf=function(t){st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,Lwe),""),"Direction Congruency"),"Specifies how drawings of the same graph with different layout directions compare to each other: either a natural reading direction is preserved or the drawings are rotated versions of each other."),BTe),(A1(),$r)),JSe),ct((Jd(),xt))))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,Mwe),""),"Feedback Edges"),"Whether feedback edges should be highlighted by
Line truncated
|
||||
`;for(r=An(this.a,0);r.b!=r.d.c;)t=l(Sn(r),65),u+=(t.b&&t.c?Fb(t.b)+"->"+Fb(t.c):"e_"+Rr(t))+`
|
||||
`;return u};var tCn=k(eI,"TGraph",121);_(640,497,{3:1,497:1,640:1,105:1,151:1}),k(eI,"TShape",640),_(41,640,{3:1,497:1,41:1,640:1,105:1,151:1},FK),h.Ib=function(){return Fb(this)};var MB=k(eI,"TNode",41);_(239,1,Eh,Qh),h.Ic=function(t){lo(this,t)},h.Jc=function(){var t;return t=An(this.a.d,0),new qv(t)},k(eI,"TNode/2",239),_(335,1,Wi,qv),h.Nb=function(t){so(this,t)},h.Pb=function(){return l(Sn(this.a),65).c},h.Ob=function(){return oO(this.a)},h.Qb=function(){fK(this.a)},k(eI,"TNode/2/1",335),_(1910,1,kr,xHe),h.If=function(t,r){b3n(this,l(t,121),r)},k(Aa,"CompactionProcessor",1910),_(1911,1,Un,KJe),h.Le=function(t,r){return Chn(this.a,l(t,41),l(r,41))},h.Fb=function(t){return this===t},h.Me=function(){return new Pn(this)},k(Aa,"CompactionProcessor/lambda$0$Type",1911),_(1912,1,Mn,Ltt),h.Mb=function(t){return Han(this.b,this.a,l(t,49))},h.a=0,h.b=0,k(Aa,"CompactionProcessor/lambda$1$Type",1912),_(1921,1,Un,kHe),h.Le=function(t,r){return Rsn(l(t,41),l(r,41))},h.Fb=function(t){return this===t},h.Me=function(){return new Pn(this)},k(Aa,"CompactionProcessor/lambda$10$Type",1921),_(1922,1,Un,NHe),h.Le=function(t,r){return Jtn(l(t,41),l(r,41))},h.Fb=function(t){return this===t},h.Me=function(){return new Pn(this)},k(Aa,"CompactionProcessor/lambda$11$Type",1922),_(1923,1,Un,CHe),h.Le=function(t,r){return Osn(l(t,41),l(r,41))},h.Fb=function(t){return this===t},h.Me=function(){return new Pn(this)},k(Aa,"CompactionProcessor/lambda$12$Type",1923),_(1913,1,Mn,YJe),h.Mb=function(t){return Ptn(this.a,l(t,49))},h.a=0,k(Aa,"CompactionProcessor/lambda$2$Type",1913),_(1914,1,Mn,JJe),h.Mb=function(t){return jtn(this.a,l(t,49))},h.a=0,k(Aa,"CompactionProcessor/lambda$3$Type",1914),_(1915,1,Mn,IHe),h.Mb=function(t){return l(t,41).c.indexOf(DF)==-1},k(Aa,"CompactionProcessor/lambda$4$Type",1915),_(1916,1,{},XJe),h.Kb=function(t){return Bcn(this.a,l(t,41))},h.a=0,k(Aa,"CompactionProcessor/lambda$5$Type",1916),_(1917,1,{},ZJe),h.Kb=function(t){return Ydn(this.a,l(t,41))},h.a=0,k(Aa,"CompactionProcessor/lambda$6$Type",1917),_(1918,1,Un,QJe),h.Le=function(t,r){return idn(this.a,l(t,243),l(r,243))},h.Fb=function(t){return this===t},h.Me=function(){return new Pn(this)},k(Aa,"CompactionProcessor/lambda$7$Type",1918),_(1919,1,Un,eXe),h.Le=function(t,r){return odn(this.a,l(t,41),l(r,41))},h.Fb=function(t){return this===t},h.Me=function(){return new Pn(this)},k(Aa,"CompactionProcessor/lambda$8$Type",1919),_(1920,1,Un,RHe),h.Le=function(t,r){return Xtn(l(t,41),l(r,41))},h.Fb=function(t){return this===t},h.Me=function(){return new Pn(this)},k(Aa,"CompactionProcessor/lambda$9$Type",1920),_(1908,1,kr,OHe),h.If=function(t,r){cTn(l(t,121),r)},k(Aa,"DirectionProcessor",1908),_(k1,1,kr,xit),h.If=function(t,r){CAn(this,l(t,121),r)},k(Aa,"FanProcessor",k1),_(1263,1,kr,DHe),h.If=function(t,r){Xwt(l(t,121),r)},k(Aa,"GraphBoundsProcessor",1263),_(1264,1,{},LHe),h.We=function(t){return l(t,41).e.a},k(Aa,"GraphBoundsProcessor/lambda$0$Type",1264),_(1265,1,{},MHe),h.We=function(t){return l(t,41).e.b},k(Aa,"GraphBoundsProcessor/lambda$1$Type",1265),_(1266,1,{},PHe),h.We=function(t){return men(l(t,41))},k(Aa,"GraphBoundsProcessor/lambda$2$Type",1266),_(1267,1,{},jHe),h.We=function(t){return wen(l(t,41))},k(Aa,"GraphBoundsProcessor/lambda$3$Type",1267),_(265,23,{3:1,34:1,23:1,265:1,177:1},r0),h.bg=function(){switch(this.g){case 0:return new ZZe;case 1:return new xit;case 2:return new XZe;case 3:return new HHe;case 4:return new $He;case 8:return new FHe;case 5:return new OHe;case 6:return new GHe;case 7:return new xHe;case 9:return new DHe;case 10:return new qHe;default:throw Y(new jt(jX+(this.f!=null?this.f:""+this.g)))}};var I_e,R_e,O_e,D_e,L_e,M_e,P_e,j_e,F_e,$_e,Jte,nCn=fn(Aa,FX,265,bn,Rht,min),Z4t;_(1907,1,kr,FHe),h.If=function(t,r){pNn(l(t,121),r)},k(Aa,"LevelCoordinatesProcessor",1907),_(1905,1,kr,$He),h.If=function(t,r){D2n(this,l(t,121),r)},h.a=0,k(Aa,"LevelHeightProcessor",1905),_(1906,1,Eh,BHe),h.Ic=function(t){lo(this,t)},h.Jc=function(){return At(),zA(),Hx},k(Aa,"LevelHeightProcessor/1",1906),_(1901,1,kr,XZe),h.If=function(t,r){VSn(this,l(t,121),r)},k(Aa,"LevelProcessor",1901),_(1902,1,Mn,UHe),h.Mb=function(t){return Ye(Ke(F(l(t,41),(Nr(),z1))))},k(Aa,"LevelProcessor/lambda$0$Type",1902),_(1903,1,kr,HHe),h.If=function(t,r){Fyn(this,l(t,121),r)},h.a=0,k(Aa,"NeighborsProcessor",1903),_(1904,1,Eh,zHe),h.Ic=function(t){lo(this,t)},h.Jc=function(){return At(),zA(),Hx},k(Aa,"NeighborsProcessor/1",1904),_(1909,1,kr,GHe),h.If=function(t,r){kAn(this,l(t,121),r)},h.a=0,k(Aa,"NodePositionProcessor",1909),_(1899,1,kr,ZZe),h.If=function(t,r){pxn(this,l(t,121),r)},k(Aa,"RootProcessor",1899),_(1924,1,kr,qHe),h.If=function(t,r){Sbn(l(t,121),r)},k(Aa,"Untreeifyer",1924),_(386,23,{3:1,34:1,23:1,386:1},qq);var kL,Xte,B_e,U_e=fn(HD,"EdgeRoutingMode",386,bn,ecn,win),Q4t,NL,ck,Zte,H_e,z_e,Qte,ene,G_e,tne,q_e,nne,r4,rne,PB,jB,sd,Id,lk,i4,o4,Ng,V_e,eRt,ine,z1,CL,IL;_(854,1,td,JWe),h.tf=function(t){st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,sve),""),USt),"Turns on Tree c
Line truncated
|
||||
`),u.length!=2)throw Y(new jt("Exactly two numbers are expected, "+u.length+" were found."));try{this.a=vy(Ey(u[0])),this.b=vy(Ey(u[1]))}catch(f){throw f=ci(f),ae(f,133)?(o=f,Y(new jt(nSt+o))):Y(f)}},h.Ib=function(){return"("+this.a+","+this.b+")"},h.a=0,h.b=0;var $i=k(PD,"KVector",8);_(79,66,{3:1,4:1,22:1,32:1,56:1,18:1,66:1,16:1,79:1,419:1},Lu,B9,Yrt),h.Nc=function(){return Npn(this)},h.ag=function(t){var r,o,a,u,f,p;a=ky(t,`,|;|\\(|\\)|\\[|\\]|\\{|\\}| | |
|
||||
`),tc(this);try{for(o=0,f=0,u=0,p=0;o<a.length;)a[o]!=null&&Ey(a[o]).length>0&&(f%2==0?u=vy(a[o]):p=vy(a[o]),f>0&&f%2!=0&&Gn(this,new Me(u,p)),++f),++o}catch(m){throw m=ci(m),ae(m,133)?(r=m,Y(new jt("The given string does not match the expected format for vectors."+r))):Y(m)}},h.Ib=function(){var t,r,o;for(t=new fc("("),r=An(this,0);r.b!=r.d.c;)o=l(Sn(r),8),zn(t,o.a+","+o.b),r.b!=r.d.c&&(t.a+="; ");return(t.a+=")",t).a};var Hke=k(PD,"KVectorChain",79);_(259,23,{3:1,34:1,23:1,259:1},s3);var sre,eU,tU,jL,FL,nU,zke=fn(Fa,"Alignment",259,bn,Rdn,Jin),k6t;_(984,1,td,uKe),h.tf=function(t){Uyt(t)};var Gke,are,N6t,qke,Vke,C6t,Wke,I6t,R6t,Kke,Yke,O6t;k(Fa,"BoxLayouterOptions",984),_(985,1,{},IGe),h.uf=function(){var t;return t=new DGe,t},h.vf=function(t){},k(Fa,"BoxLayouterOptions/BoxFactory",985),_(300,23,{3:1,34:1,23:1,300:1},a3);var g4,ure,b4,m4,w4,cre,lre=fn(Fa,"ContentAlignment",300,bn,Idn,Xin),D6t;_(696,1,td,que),h.tf=function(t){st(t,new Ze(it(rt(ot(Qe(nt(et(tt(new Xe,hTt),""),"Layout Algorithm"),"Select a specific layout algorithm."),(A1(),HT)),Je),ct((Jd(),xt))))),st(t,new Ze(it(rt(ot(Qe(nt(et(tt(new Xe,pTt),""),"Resolved Layout Algorithm"),"Meta data associated with the selected algorithm."),lf),sCn),ct(xt)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,Pye),""),"Alignment"),"Alignment of the selected node relative to other nodes; the exact meaning depends on the used algorithm."),Jke),$r),zke),ct(ri)))),st(t,new Ze(it(rt(ot(Qe(nt(et(tt(new Xe,mx),""),"Aspect Ratio"),"The desired aspect ratio of the drawing, that is the quotient of width by height."),eo),fi),ct(xt)))),st(t,new Ze(it(rt(ot(Qe(nt(et(tt(new Xe,rEe),""),"Bend Points"),"A fixed list of bend points for the edge. This is used by the 'Fixed Layout' algorithm to specify a pre-defined routing for an edge. The vector chain must include the source point, any bend points, and the target point, so it must have at least two points."),lf),Hke),ct(Rd)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,CF),""),"Content Alignment"),"Specifies how the content of a node are aligned. Each node can individually control the alignment of its contents. I.e. if a node should be aligned top left in its parent node, the parent node should specify that option."),Zke),UT),lre),ct(xt)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,UD),""),"Debug Mode"),"Whether additional debug information shall be generated."),(Lt(),!1)),Ai),Yr),ct(xt)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,TZ),""),"Direction"),"Overall direction of edges: horizontal (right / left) or vertical (down / up)."),Qke),$r),E4),ct(xt)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,BD),""),"Edge Routing"),"What kind of edge routing style should be applied for the content of a parent node. Algorithms may also set this option to single edges in order to mark them as splines. The bend point list of edges with this option set to SPLINES must be interpreted as control points for a piecewise cubic spline."),nNe),$r),Tre),ct(xt)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,tEe),""),"Expand Nodes"),"If active, nodes are expanded to fill the area of their parent."),!1),Ai),Yr),ct(xt)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,NF),""),"Hierarchy Handling"),"Determines whether separate layout runs are triggered for different compound nodes in a hierarchical graph. Setting a node's hierarchy handling to `INCLUDE_CHILDREN` will lay out that node and all of its descendants in a single layout run, until a descendant is encountered which has its hierarchy handling set to `SEPARATE_CHILDREN`. In general, `SEPARATE_CHILDREN` will ensure that a new layout run is triggered for a node with that setting. Including multiple levels of hierarchy in a single layout run may allow cross-hierarchical edges to be laid out properly. If the root node is set to `INHERIT` (or not set at all), the default behavior is `SEPARATE_CHILDREN`."),iNe),$r),WNe),xr(xt,Z(X(cf,1),Ce,161,0,[ri]))))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,B0),""),"Padding"),"The padding to be left to a parent element's border when placing child elements. This can also serve as an output option of a layout algorithm if node size calculation is setup appropriately."),gNe),lf),K2e),xr(xt,Z(X(cf,1),Ce,161,0,[ri]))))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,wx),""),"Interactive"),"Whether the algorithm should be run in interactive mode for the content of a parent node. What this means exactly depends on how the specific algorithm interprets this option. Usually in the interactive mode algorithms try to modify the current layout as little as possible."),!1),Ai),Yr),ct(xt)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,RF),""),"interactive Layout"),"Whether the graph should be changeable interactively and by setting constraints"),!1),Ai),Yr),ct(xt)))),st(t,new Ze(it(rt(ot(gt(Qe(nt(et(tt(new Xe,yx),""),"Omit Node Micro Layout"),"Node micro layout comprises the computation of node dimensions (if requested), the placement of ports and their labels, and the placement of node l
Line truncated
|
||||
Consider installing the package or pass your own 'workerFactory' to ELK's constructor.
|
||||
... Falling back to non-web worker version.`);if(!G.workerFactory){var Q=s("./elk-worker.min.js"),ie=Q.Worker;G.workerFactory=function(pe){return new ie(pe)}}return E(this,j,[G])}return R(j,$),b(j)}(D);Object.defineProperty(c.exports,"__esModule",{value:!0}),c.exports=B,B.default=B},{"./elk-api.js":1,"./elk-worker.min.js":2,"web-worker":4}],4:[function(s,c,d){var g=typeof Worker<"u"?Worker:void 0;c.exports=g},{}]},{},[3])(3)})})(YWt);var jZn=YWt.exports;const FZn=TR(jZn),$Zn=new FZn;async function BZn(n,i){try{const s=n.map(b=>({id:b.id,width:HZn(b.type),height:zZn(b.type)})),c=i.map(b=>({id:b.id,sources:[b.source],targets:[b.target]})),d={id:"root",layoutOptions:{"elk.algorithm":"layered","elk.direction":"RIGHT","elk.spacing.nodeNode":"80","elk.layered.spacing.nodeNodeBetweenLayers":"100","elk.spacing.edgeNode":"40","elk.layered.nodePlacement.strategy":"SIMPLE"},children:s,edges:c},g=await $Zn.layout(d);return n.map(b=>{var E;const w=(E=g.children)==null?void 0:E.find(S=>S.id===b.id);return w&&w.x!==void 0&&w.y!==void 0?{...b,position:{x:w.x,y:w.y}}:b})}catch{return UZn(n)}}function UZn(n){return n.map((b,w)=>{const E=w%3,S=Math.floor(w/3);return{...b,position:{x:100+E*300,y:100+S*150}}})}function HZn(n){switch(n){case"trigger":return 200;case"condition":return 220;case"action":return 200;case"delay":return 180;case"wait":return 180;default:return 200}}function zZn(n){switch(n){case"trigger":return 80;case"condition":return 100;case"action":return 80;case"delay":return 70;case"wait":return 70;default:return 80}}function GZn(n){return typeof n=="object"&&n!==null&&"delay"in n&&(typeof n.delay=="string"||typeof n.delay=="number"||typeof n.delay=="object"&&n.delay!==null)}const JWt={hours:60*60*1e3,minutes:60*1e3,seconds:1e3,milliseconds:1};function HDe(n){return typeof n=="number"&&Number.isFinite(n)}function qZn(n){const i=n.trim(),s=/^\{\{\s*([\s\S]*?)\s*\}\}$/.exec(i);return s?s[1].trim():i}function VZn(n){if(HDe(n))return String(n);if(typeof n!="string"||n.trim()==="")return null;const i=n.trim(),s=Number(i);return Number.isFinite(s)?String(s):`(${qZn(i)})`}function WZn(n){const i=Object.entries(JWt).flatMap(([w,E])=>{const S=VZn(n[w]);return S?E===1?[S]:[`(${S}) * ${E}`]:[]}),s=i.length>0?i.join(" + "):"0",c=`(${s}) // 3600000`,d=`((${s}) % 3600000) // 60000`,g=`((${s}) % 60000) // 1000`,b=`(${s}) % 1000`;return Object.prototype.hasOwnProperty.call(n,"milliseconds")?`{{ '%02d:%02d:%02d.%03d' | format(${c}, ${d}, ${g}, ${b}) }}`:`{{ '%02d:%02d:%02d' | format(${c}, ${d}, ${g}) }}`}function KZn(n){if(typeof n=="string")return n;if(HDe(n))return String(n);if(typeof n!="object"||n===null)return"";const i=n,s={};let c=!1;for(const d of Object.keys(JWt)){const g=i[d];if(g!==void 0){if(HDe(g)){s[d]=g;continue}if(typeof g=="string"&&g.trim()!==""){const b=Number(g.trim());Number.isFinite(b)?s[d]=b:c=!0;continue}c=!0}}return c?WZn(i):s}function YZn(n){return typeof n=="object"&&n!==null&&("wait_template"in n||"wait_for_trigger"in n)}function JZn(n){return typeof n=="object"&&n!==null&&"choose"in n}function XZn(n){return typeof n=="object"&&n!==null&&"parallel"in n&&Array.isArray(n.parallel)}function ZZn(n){return typeof n=="object"&&n!==null&&"if"in n&&Array.isArray(n.if)&&"then"in n&&Array.isArray(n.then)}function QZn(n){return typeof n=="object"&&n!==null&&(typeof n.service=="string"||typeof n.action=="string")}function eQn(n){return typeof n=="object"&&n!==null&&"condition"in n&&typeof n.condition=="string"}function tQn(n){return typeof n=="object"&&n!==null&&"variables"in n&&typeof n.variables=="object"&&!("service"in n)&&!("action"in n)&&!("delay"in n)&&!("wait_template"in n)&&!("choose"in n)&&!("if"in n)}function nQn(n){return typeof n=="object"&&n!==null&&"set_conversation_response"in n}function rQn(n){return typeof n=="object"&&n!==null&&"stop"in n}function iQn(n){return typeof n=="object"&&n!==null&&"repeat"in n&&typeof n.repeat=="object"&&n.repeat!==null}function oQn(n){return typeof n=="object"&&n!==null&&"event"in n&&typeof n.event=="string"}const k5=["state","numeric_state","template","time","sun","zone","and","or","not","device","trigger"];function zDe(n){return n.map(i=>sQn(i))}function sQn(n){const{condition:i,conditions:s,...c}=n,d=i||"template",g=k5.includes(d)?d:"template",b=Array.isArray(s)?zDe(s):void 0;return{...c,condition:g,conditions:b}}class aQn{async parse(i){const s=[];try{let c=kZn(i);if(Array.isArray(c)){if(c.length===0)return{success:!1,errors:["Empty automation array"],warnings:s,hadMetadata:!1};c=c[0]}if(!c||typeof c!="object")return{success:!1,errors:["Invalid YAML structure"],warnings:s,hadMetadata:!1};const d=this.extractMetadata(c),g=d!==null,b=this.extractUserVariables(c),w=c;if(typeof w!="object"||w===null)return{success:!1,errors:["Invalid YAML content structure"],warnings:s,hadMetadata:g};const E=d?Object.keys(d.nodes):[],S=(d==null?void 0:d.strategy)==="state-machine"||this.detectStateMachineFormat(w),{nodes:x,edges:A}=S?this.parseStateMachineStructure(w,s,E):this.parseA
Line truncated
|
||||
Data: ${JSON.stringify(ie==null?void 0:ie.data,null,2)}`}return`Schema path: ${ee.path.join(".")}
|
||||
Message: ${ee.message}${re?`
|
||||
${re}`:""}`});return console.error("Zod validation error details:",G),{success:!1,errors:G,warnings:s,hadMetadata:g}}const P=UVt(j.data);return P.valid?{success:!0,graph:j.data,warnings:s,hadMetadata:g}:{success:!1,errors:P.errors,warnings:s,hadMetadata:g}}catch(c){return console.error("YAML parsing error:",c),console.error("YAML string:",i),{success:!1,errors:[c instanceof Error?c.message:"Unknown parsing error"],warnings:s,hadMetadata:!1}}}extractMetadata(i){try{let s;if(typeof i.variables=="object"&&i.variables!==null&&(s=i.variables),s&&typeof s=="object"&&"_cafe_metadata"in s&&typeof s._cafe_metadata=="object"&&s._cafe_metadata!==null){const c=s._cafe_metadata,d=$Vt.safeParse(c);if(d.success)return d.data}}catch{}return null}extractUserVariables(i){const s={};if(typeof i.variables=="object"&&i.variables!==null){const c=i.variables;for(const[d,g]of Object.entries(c))d!=="_cafe_metadata"&&(s[d]=g)}return s}detectStateMachineFormat(i){const s=i.actions||i.action;if(!Array.isArray(s))return!1;let c=!1,d=!1;for(const g of s){const b=g;if(b.variables){const w=b.variables;"current_node"in w&&"flow_context"in w&&(c=!0)}if(b.repeat){const E=b.repeat.sequence;if(Array.isArray(E))for(const S of E){const x=S;if(Array.isArray(x.choose)){d=!0;break}}}}return c&&d}parseStateMachineStructure(i,s,c){const d=[],g=[],b=i.actions||i.action;if(!Array.isArray(b))return s.push("No actions found in automation"),{nodes:d,edges:g};let w=null;const E=new Map;for(const j of b){const P=j;if(P.variables){const G=P.variables;typeof G.current_node=="string"&&G.current_node!=="END"&&(w=G.current_node)}if(P.repeat){const ee=P.repeat.sequence;if(Array.isArray(ee))for(const re of ee){const Q=re;if(Array.isArray(Q.choose))for(const ie of Q.choose){const pe=this.parseStateMachineChooseBlock(ie);pe&&E.set(pe.nodeId,pe)}}}}const S=new Map;for(const[j,P]of E){if(!/^__parallel_trigger_\d+$/.test(j))continue;const G=this.parseInlineParallelBranches(P.parallelItems??[],E);G.length>0&&S.set(j,G),E.delete(j)}const x=new Set(E.keys()),A=c.filter(j=>!x.has(j));let C=0,R=0;const L=j=>C<A.length?A[C++]:FFt(j,R++),D=i.triggers||i.trigger;if(!D)return s.push("No triggers found in automation"),{nodes:d,edges:g};const B=Array.isArray(D)?D:[D],$=this.parseTriggers(B,s,L);d.push(...$);for(const[j,P]of E)switch(P.nodeType){case"condition":d.push({id:j,type:"condition",position:{x:0,y:0},data:P.data});break;case"action":d.push({id:j,type:"action",position:{x:0,y:0},data:P.data});break;case"delay":d.push({id:j,type:"delay",position:{x:0,y:0},data:P.data});break;case"wait":d.push({id:j,type:"wait",position:{x:0,y:0},data:P.data});break}if(w){const j=this.parseEntryNodeTemplate(w);if(j&&j.size>0)for(let P=0;P<$.length;P++){const G=j.get(P);if(G){const ee=S.get(G);if(ee)for(const re of ee)g.push(this.createEdge($[P].id,re));else g.push(this.createEdge($[P].id,G))}}else for(const P of $)g.push(this.createEdge(P.id,w))}for(const[j,P]of E)P.trueTarget&&P.trueTarget!=="END"&&g.push({id:`edge-${j}-${P.trueTarget}`,source:j,target:P.trueTarget,sourceHandle:P.nodeType==="condition"||P.falseTarget?"true":void 0}),P.falseTarget&&P.falseTarget!=="END"&&g.push({id:`edge-${j}-${P.falseTarget}`,source:j,target:P.falseTarget,sourceHandle:"false"});return{nodes:d,edges:g}}parseEntryNodeTemplate(i){if(!i.includes("{%")||!i.includes("trigger.idx"))return null;const s=new Map,c=/{%\s*(?:if|elif)\s+trigger\.idx\s*==\s*["'](\d+)["']\s*%}\s*([^{%]+?)(?={%|$)/g,d=i.matchAll(c);for(const b of d){const w=parseInt(b[1],10),E=b[2].trim();s.set(w,E)}const g=i.match(/{%\s*else\s*%}\s*([^{%]+?)(?={%|$)/);if(g&&s.size>0){const b=Math.max(...s.keys());s.set(b+1,g[1].trim())}return s.size>0?s:null}parseInlineParallelBranches(i,s){const c=[];let d=0;const g=b=>`inline_${b}_${d++}`;for(const b of i){const w=b,E=w.alias,S=E==null?void 0:E.match(/^parallel_branch:(.+)$/);if(S){const A=S[1];c.push(A),Array.isArray(w.sequence)?this.parseInlineActionList(w.sequence,A,s,g):this.parseInlineActionItem(w,A,s,g);continue}if((w.service??w.action)==="system_log.write"){const A=w.data,C=A==null?void 0:A.message;if(C){const R=C.match(/^Node:\s*(.+)$/);R&&c.push(R[1])}}}return c}parseInlineActionList(i,s,c,d){let g=null;for(let b=0;b<i.length;b++){const w=i[b],{nodeId:E}=this.extractCafeNodeId(w.alias),S=b===0?s:E??d(this.inferInlineNodeType(w));if(g){const x=c.get(g);x&&x.nodeType!=="condition"&&(x.trueTarget=S)}this.parseInlineActionItem(w,S,c,d),g=S}}parseInlineActionItem(i,s,c,d){const g=i.alias,{cleanAlias:b}=this.extractCafeNodeId(g),w=b!=null&&b.startsWith("parallel_branch:")?void 0:b;if(i.if&&Array.isArray(i.if)){const x={...i.if[0]??{}};w&&(x.alias=w);let A=null,C=null;const R=i.then;if(R&&R.length>0){const{nodeId:D}=this.extractCafeNodeId(R[0].alias),B=D??d(this.inferInlineNodeType(R[0]));A=B,this.parseInlineActionList(R,B,c,d)}const L=i.else;if(L&&L.length>0){const{nodeId:D}=this.extractCafeNodeId(L[0].alias),B=D??d(this.inferInlineNodeType(L[0]));C=B,this.parseInlineActionList(L,B,c,d)}c.set(s,{nodLine truncated
|
||||
`),children:I.jsx(_w,{className:"h-3 w-3"})}),A&&!w&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-gray-500 text-white shadow-sm",children:I.jsx(iN,{className:"h-3 w-3"})}),I.jsx($h,{type:"target",position:qr.Left,className:"!w-3 !h-3 !bg-orange-500 !border-orange-700"}),I.jsxs("div",{className:"mb-1 flex items-center gap-2",children:[I.jsx("div",{className:"rounded bg-orange-200 p-1",children:I.jsx(Q8n,{className:"h-4 w-4 text-orange-700"})}),I.jsx("span",{className:"font-semibold text-orange-900 text-sm",children:s.alias||d("nodes:types.stop")}),x&&I.jsx("div",{className:"ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-orange-600 font-bold text-white text-xs",children:x})]}),I.jsxs("div",{className:"space-y-0.5 text-orange-700 text-xs",children:[I.jsx("div",{className:"font-medium opacity-70",children:d(L?"nodes:actions.stopError":"nodes:actions.stopExecution")}),R&&I.jsx("div",{className:"truncate opacity-75 italic",children:R})]})]}):I.jsxs("div",{className:Sr("relative min-w-[180px] rounded-lg border-2 border-green-400 bg-green-50 px-4 py-3","transition-all duration-200",c&&"ring-2 ring-green-500 ring-offset-2",S&&"node-active ring-4 ring-green-500",A&&"border-dashed opacity-50 grayscale",w&&"border-red-500 ring-2 ring-red-400"),children:[w&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-red-500 text-white shadow-sm",title:E.join(`
|
||||
`),children:I.jsx(_w,{className:"h-3 w-3"})}),A&&!w&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-gray-500 text-white shadow-sm",children:I.jsx(iN,{className:"h-3 w-3"})}),I.jsx($h,{type:"target",position:qr.Left,className:"!w-3 !h-3 !bg-green-500 !border-green-700"}),I.jsxs("div",{className:"mb-1 flex items-center gap-2",children:[I.jsx("div",{className:"rounded bg-green-200 p-1",children:I.jsx(rae,{className:"h-4 w-4 text-green-700"})}),I.jsx("span",{className:"font-semibold text-green-900 text-sm",children:s.alias||($?s.event:B)||"Action"}),x&&I.jsx("div",{className:"ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-green-600 font-bold text-white text-xs",children:x})]}),I.jsxs("div",{className:"space-y-0.5 text-green-700 text-xs",children:[I.jsx("div",{className:"font-medium",children:$?I.jsx("span",{className:"opacity-60",children:d("nodes:actions.fireEvent")}):I.jsxs(I.Fragment,{children:[I.jsxs("span",{className:"opacity-60",children:[D,"."]}),B]})}),P&&I.jsx("div",{className:"truncate opacity-75",children:P})]}),I.jsx($h,{type:"source",position:qr.Right,className:"!w-3 !h-3 !bg-green-500 !border-green-700"})]})}),ber=H.memo(function({id:i,data:s,selected:c}){const d=Do(C=>C.activeNodeId),g=Do(C=>C.getExecutionStepNumber),{hasErrors:b,errorMessages:w}=gb(i),E=d===i,S=g(i),x=s.enabled===!1,A={state:"State",numeric_state:"Numeric",template:"Template",time:"Time",zone:"Zone",sun:"Sun",and:"AND",or:"OR",not:"NOT",device:"Device",trigger:"Trigger"};return I.jsxs("div",{className:Sr("group relative min-w-[180px] rounded-lg border-2 border-blue-400 bg-blue-50 px-4 py-3","transition-all duration-200",c&&"ring-2 ring-blue-500 ring-offset-2",E&&"node-active ring-4 ring-green-500",x&&"border-dashed opacity-50 grayscale",b&&"border-red-500 ring-2 ring-red-400"),children:[b&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-red-500 text-white shadow-sm",title:w.join(`
|
||||
`),children:I.jsx(_w,{className:"h-3 w-3"})}),x&&!b&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-gray-500 text-white shadow-sm",children:I.jsx(iN,{className:"h-3 w-3"})}),I.jsx($h,{type:"target",position:qr.Left,className:"!w-3 !h-3 !bg-blue-500 !border-blue-700"}),I.jsxs("div",{className:"mb-1 flex items-center gap-2",children:[I.jsx("div",{className:"rounded bg-blue-200 p-1",children:I.jsx(fGt,{className:"h-4 w-4 text-blue-700"})}),I.jsx("span",{className:"font-semibold text-blue-900 text-sm",children:s.alias||A[s.condition]||"Condition"}),S&&I.jsx("div",{className:"ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-blue-600 font-bold text-white text-xs",children:S})]}),I.jsxs("div",{className:"space-y-0.5 text-blue-700 text-xs",children:[I.jsx("div",{className:"font-medium",children:A[s.condition]||s.condition}),s.entity_id&&I.jsx("div",{className:"truncate opacity-75",children:Array.isArray(s.entity_id)?s.entity_id.join(", "):s.entity_id}),s.state&&I.jsxs("div",{className:"opacity-75",children:["= ",s.state]}),s.above!=null&&I.jsxs("div",{className:"opacity-75",children:["> ",s.above]}),s.below!=null&&I.jsxs("div",{className:"opacity-75",children:["< ",s.below]}),s.after&&I.jsxs("div",{className:"opacity-75",children:["after: ",s.after]}),s.before&&I.jsxs("div",{className:"opacity-75",children:["before: ",s.before]}),s.zone&&I.jsxs("div",{className:"opacity-75",children:["zone: ",s.zone]}),s.attribute&&I.jsxs("div",{className:"opacity-75",children:["attr: ",s.attribute]}),s.for&&I.jsxs("div",{className:"opacity-75",children:["for: ",typeof s.for=="string"?s.for:`${s.for.hours||0}h ${s.for.minutes||0}m ${s.for.seconds||0}s`]}),s.template&&I.jsxs("div",{className:"truncate font-mono text-[10px] opacity-75",children:[s.template.slice(0,30),"..."]}),s.value_template&&I.jsxs("div",{className:"truncate font-mono text-[10px] opacity-75",children:[s.value_template.slice(0,30),"..."]}),typeof s.id=="string"&&I.jsxs("div",{className:"opacity-75",children:["id: ",s.id]}),Array.isArray(s.conditions)&&s.conditions.length>0&&I.jsx("div",{className:"opacity-75",children:Jie("nodes:conditions.nestedConditions",{count:s.conditions.length})})]}),I.jsx($h,{type:"source",position:qr.Right,id:"true",style:{top:"30%"},className:"!w-3 !h-3 !bg-green-500 !border-green-700"}),I.jsx($h,{type:"source",position:qr.Right,id:"false",style:{top:"70%"},className:"!w-3 !h-3 !bg-red-500 !border-red-700"}),I.jsx("div",{className:"absolute top-[30%] right-[-40px] -translate-y-1/2 transform rounded border border-green-200 bg-white px-1 py-0.5 font-medium text-[10px] text-green-700 opacity-0 shadow-sm transition-opacity group-hover:opacity-100",children:Jie("nodes:conditions.yes")}),I.jsx("div",{className:"absolute top-[70%] right-[-36px] -translate-y-1/2 transform rounded border border-red-200 bg-white px-1 py-0.5 font-medium text-[10px] text-red-700 opacity-0 shadow-sm transition-opacity group-hover:opacity-100",children:Jie("nodes:conditions.no")})]})});function sKt(n){if(!n)return"";if(typeof n=="string")return n;if(typeof n=="object"){const i=[];return n.hours&&i.push(`${n.hours}h`),n.minutes&&i.push(`${n.minutes}m`),n.seconds&&i.push(`${n.seconds}s`),n.milliseconds&&i.push(`${n.milliseconds}ms`),i.join(" ")||"0s"}return String(n)}const mer=H.memo(function({id:i,data:s,selected:c}){const d=Do(C=>C.activeNodeId),g=Do(C=>C.getExecutionStepNumber),{hasErrors:b,errorMessages:w}=gb(i),E=d===i,S=g(i),x=s.enabled===!1,A=sKt(s.delay);return I.jsxs("div",{className:Sr("relative min-w-[140px] rounded-lg border-2 border-purple-400 bg-purple-50 px-4 py-3","transition-all duration-200",c&&"ring-2 ring-purple-500 ring-offset-2",E&&"node-active ring-4 ring-green-500",x&&"border-dashed opacity-50 grayscale",b&&"border-red-500 ring-2 ring-red-400"),children:[b&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-red-500 text-white shadow-sm",title:w.join(`
|
||||
`),children:I.jsx(_w,{className:"h-3 w-3"})}),x&&!b&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-gray-500 text-white shadow-sm",children:I.jsx(iN,{className:"h-3 w-3"})}),I.jsx($h,{type:"target",position:qr.Left,className:"!w-3 !h-3 !bg-purple-500 !border-purple-700"}),I.jsxs("div",{className:"mb-1 flex items-center gap-2",children:[I.jsx("div",{className:"rounded bg-purple-200 p-1",children:I.jsx(F5e,{className:"h-4 w-4 text-purple-700"})}),I.jsx("span",{className:"font-semibold text-purple-900 text-sm",children:s.alias||"Delay"}),S&&I.jsx("div",{className:"ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-purple-600 font-bold text-white text-xs",children:S})]}),I.jsx("div",{className:"text-purple-700 text-xs",children:I.jsx("div",{className:"font-mono",children:A})}),I.jsx($h,{type:"source",position:qr.Right,className:"!w-3 !h-3 !bg-purple-500 !border-purple-700"})]})}),wer=H.memo(function({id:i,data:s,selected:c}){const d=Do(C=>C.activeNodeId),g=Do(C=>C.getExecutionStepNumber),{hasErrors:b,errorMessages:w}=gb(i),E=d===i,S=g(i),x=s.enabled===!1,A=Object.keys(s.variables||{}).length;return I.jsxs("div",{className:Sr("relative min-w-[160px] rounded-lg border-2 border-cyan-400 bg-cyan-50 px-4 py-3","transition-all duration-200",c&&"ring-2 ring-cyan-500 ring-offset-2",E&&"node-active ring-4 ring-green-500",x&&"border-dashed opacity-50 grayscale",b&&"border-red-500 ring-2 ring-red-400"),children:[b&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-red-500 text-white shadow-sm",title:w.join(`
|
||||
`),children:I.jsx(_w,{className:"h-3 w-3"})}),x&&!b&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-gray-500 text-white shadow-sm",children:I.jsx(iN,{className:"h-3 w-3"})}),I.jsx($h,{type:"target",position:qr.Left,className:"!w-3 !h-3 !bg-cyan-500 !border-cyan-700"}),I.jsxs("div",{className:"mb-1 flex items-center gap-2",children:[I.jsx("div",{className:"rounded bg-cyan-200 p-1",children:I.jsx(wGt,{className:"h-4 w-4 text-cyan-700"})}),I.jsx("span",{className:"font-semibold text-cyan-900 text-sm",children:s.alias||"Set Variables"}),S&&I.jsx("div",{className:"ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-cyan-600 font-bold text-white text-xs",children:S})]}),I.jsx("div",{className:"text-cyan-700 text-xs",children:I.jsx("div",{className:"font-medium opacity-75",children:Jie("nodes:variables.variableCount",{count:A})})}),I.jsx($h,{type:"source",position:qr.Right,className:"!w-3 !h-3 !bg-cyan-500 !border-cyan-700"})]})}),yer=H.memo(function({id:i,data:s,selected:c}){const d=Do(L=>L.activeNodeId),g=Do(L=>L.getExecutionStepNumber),{hasErrors:b,errorMessages:w}=gb(i),E=d===i,S=g(i),x=s.enabled===!1,A={state:"State Change",time:"Time",time_pattern:"Time Pattern",event:"Event",mqtt:"MQTT",webhook:"Webhook",sun:"Sun",zone:"Zone",numeric_state:"Numeric State",template:"Template",homeassistant:"Home Assistant",device:"Device"},R=(()=>{const L=s.trigger;switch(L){case"device":return{title:s.alias||"Device Trigger",subtitle:s.type?`${s.domain||"device"}: ${s.type}`:"Device",detail:s.device_id?`Device: ${String(s.device_id).substring(0,8)}...`:null};case"state":return{title:s.alias||"State Change",subtitle:Array.isArray(s.entity_id)?`${s.entity_id.length} entities:
|
||||
${s.entity_id.join(", ")}`:s.entity_id||"State",detail:s.to?`to: ${s.to}`:null};case"numeric_state":return{title:s.alias||"Numeric State",subtitle:Array.isArray(s.entity_id)?s.entity_id.join(", "):s.entity_id||"Numeric State",detail:s.above||s.below?`${s.above?`>${s.above}`:""}${s.above&&s.below?" ":""}${s.below?`<${s.below}`:""}`:null};case"event":return{title:s.alias||"Event",subtitle:A[L],detail:s.event_type||null};case"time":return{title:s.alias||"Time",subtitle:A[L],detail:s.at||null};case"sun":return{title:s.alias||"Sun",subtitle:A[L],detail:s.event?`${s.event}${s.offset?` ${s.offset}`:""}`:null};case"mqtt":return{title:s.alias||"MQTT",subtitle:A[L],detail:s.topic||null};case"webhook":return{title:s.alias||"Webhook",subtitle:A[L],detail:s.webhook_id||null};case"zone":return{title:s.alias||"Zone",subtitle:A[L],detail:s.zone||(Array.isArray(s.entity_id)?s.entity_id.join(", "):s.entity_id)||null};default:return{title:s.alias||A[L]||"Trigger",subtitle:A[L]||L,detail:null}}})();return I.jsxs("div",{className:Sr("relative min-w-[180px] max-w-[300px] rounded-lg border-2 border-amber-400 bg-amber-50 px-4 py-3","transition-all duration-200",c&&"ring-2 ring-amber-500 ring-offset-2",E&&"node-active ring-4 ring-green-500",x&&"border-dashed opacity-50 grayscale",b&&"border-red-500 ring-2 ring-red-400"),children:[b&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-red-500 text-white shadow-sm",title:w.join(`
|
||||
`),children:I.jsx(_w,{className:"h-3 w-3"})}),x&&!b&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-gray-500 text-white shadow-sm",children:I.jsx(iN,{className:"h-3 w-3"})}),I.jsxs("div",{className:"mb-1 flex items-center gap-2",children:[I.jsx("div",{className:"rounded bg-amber-200 p-1",children:I.jsx(yGt,{className:"h-4 w-4 text-amber-700"})}),I.jsx("span",{className:"font-semibold text-amber-900 text-sm",children:R.title}),S&&I.jsx("div",{className:"ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-amber-600 font-bold text-white text-xs",children:S})]}),I.jsxs("div",{className:"space-y-0.5 text-amber-700 text-xs",children:[I.jsx("div",{className:"line-clamp-2 truncate whitespace-pre-line font-medium",children:R.subtitle}),R.detail&&I.jsx("div",{className:"truncate opacity-75",children:String(R.detail)})]}),I.jsx($h,{type:"source",position:qr.Right,className:"!w-3 !h-3 !bg-amber-500 !border-amber-700"})]})}),ver=H.memo(function({id:i,data:s,selected:c}){const{t:d}=ps(["common","nodes"]),g=Do(R=>R.activeNodeId),b=Do(R=>R.getExecutionStepNumber),{hasErrors:w,errorMessages:E}=gb(i),S=g===i,x=b(i),A=s.enabled===!1,C=sKt(s.timeout);return I.jsxs("div",{className:Sr("relative min-w-[140px] rounded-lg border-2 border-orange-400 bg-orange-50 px-4 py-3","transition-all duration-200",c&&"ring-2 ring-orange-500 ring-offset-2",S&&"node-active ring-4 ring-green-500",A&&"border-dashed opacity-50 grayscale",w&&"border-red-500 ring-2 ring-red-400"),children:[w&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-red-500 text-white shadow-sm",title:E.join(`
|
||||
`),children:I.jsx(_w,{className:"h-3 w-3"})}),A&&!w&&I.jsx("div",{className:"absolute -top-2 -right-2 flex h-5 w-5 items-center justify-center rounded-full bg-gray-500 text-white shadow-sm",children:I.jsx(iN,{className:"h-3 w-3"})}),I.jsx($h,{type:"target",position:qr.Left,className:"!w-3 !h-3 !bg-orange-500 !border-orange-700"}),I.jsxs("div",{className:"mb-1 flex items-center gap-2",children:[I.jsx("div",{className:"rounded bg-orange-200 p-1",children:I.jsx(hGt,{className:"h-4 w-4 text-orange-700"})}),I.jsx("span",{className:"font-semibold text-orange-900 text-sm",children:s.alias||"Wait for"}),x&&I.jsx("div",{className:"ml-auto flex h-5 w-5 items-center justify-center rounded-full bg-orange-600 font-bold text-white text-xs",children:x})]}),I.jsxs("div",{className:"space-y-0.5 text-orange-700 text-xs",children:[s.wait_template&&I.jsxs("div",{className:"truncate font-mono text-[10px] opacity-75",children:[s.wait_template.slice(0,30),"..."]}),s.wait_for_trigger&&I.jsx("div",{className:"truncate text-[10px] opacity-75",children:d("nodes:wait.waitsForNTrigger",{count:s.wait_for_trigger.length})}),C&&I.jsxs("div",{className:"opacity-75",children:[d("nodes:wait.timeoutLabel")," ",C]})]}),I.jsx($h,{type:"source",position:qr.Right,className:"!w-3 !h-3 !bg-orange-500 !border-orange-700"})]})});var Eer=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Ser=Eer.reduce((n,i)=>{const s=lae(`Primitive.${i}`),c=H.forwardRef((d,g)=>{const{asChild:b,...w}=d,E=b?s:i;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),I.jsx(E,{...w,ref:g})});return c.displayName=`Primitive.${i}`,{...n,[i]:c}},{}),Ter="Separator",KFt="horizontal",Aer=["horizontal","vertical"],aKt=H.forwardRef((n,i)=>{const{decorative:s,orientation:c=KFt,...d}=n,g=_er(c)?c:KFt,w=s?{role:"none"}:{"aria-orientation":g==="vertical"?g:void 0,role:"separator"};return I.jsx(Ser.div,{"data-orientation":g,...w,...d,ref:i})});aKt.displayName=Ter;function _er(n){return Aer.includes(n)}var uKt=aKt;const Pz=H.forwardRef(({className:n,orientation:i="horizontal",decorative:s=!0,...c},d)=>I.jsx(uKt,{ref:d,decorative:s,orientation:i,className:Sr("shrink-0 bg-border",i==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",n),...c}));Pz.displayName=uKt.displayName;function xer(){const{undo:n,redo:i,canUndo:s,canRedo:c}=QWt(Do.temporal,tKt(b=>({undo:b.undo,redo:b.redo,canUndo:b.pastStates.length>0,canRedo:b.futureStates.length>0}))),d=H.useCallback(()=>{n(),Do.getState().validateAllNodes()},[n]),g=H.useCallback(()=>{i(),Do.getState().validateAllNodes()},[i]);return{undo:d,redo:g,canUndo:s,canRedo:c}}function UMe(){var i;const n=navigator;return(i=n.userAgentData)!=null&&i.platform?n.userAgentData.platform==="macOS":/Mac|iPhone|iPod|iPad/.test(navigator.platform)||/Macintosh/.test(navigator.userAgent)}function ker(n){return{name:"align-bottom",icon:V9n,tooltip:n("toolbar.alignBottom"),shortcut:"ctrl+shift+b",group:"align",isEnabled:i=>i.selectedNodes.length>=2,execute:i=>{const s=Math.max(...i.selectedNodes.map(g=>g.position.y+(g.height||0))),c=i.selectedNodes.map(g=>g.id),d=i.nodes.map(g=>c.includes(g.id)?{...g,position:{...g.position,y:s-(g.height||0)}}:g);i.setNodes(d)}}}function Ner(n){return{name:"align-left",icon:Z9n,tooltip:n("toolbar.alignLeft"),shortcut:"ctrl+shift+l",group:"align",isEnabled:i=>i.selectedNodes.length>=2,execute:i=>{const s=Math.min(...i.selectedNodes.map(g=>g.position.x)),c=i.selectedNodes.map(g=>g.id),d=i.nodes.map(g=>c.includes(g.id)?{...g,position:{...g.position,x:s}}:g);i.setNodes(d)}}}function Cer(n){return{name:"align-right",icon:K9n,tooltip:n("toolbar.alignRight"),shortcut:"ctrl+shift+r",group:"align",isEnabled:i=>i.selectedNodes.length>=2,execute:i=>{const s=Math.max(...i.selectedNodes.map(g=>g.position.x+(g.width||0))),c=i.selectedNodes.map(g=>g.id),d=i.nodes.map(g=>c.includes(g.id)?{...g,position:{...g.position,x:s-(g.width||0)}}:g);i.setNodes(d)}}}function Ier(n){return{name:"align-top",icon:J9n,tooltip:n("toolbar.alignTop"),shortcut:"ctrl+shift+t",group:"align",isEnabled:i=>i.selectedNodes.length>=2,execute:i=>{const s=Math.min(...i.selectedNodes.map(g=>g.position.y)),c=i.selectedNodes.map(g=>g.id),d=i.nodes.map(g=>c.includes(g.id)?{...g,position:{...g.position,y:s}}:g);i.setNodes(d)}}}function cKt(n){const i=n.selectedNodes.map(c=>c.id),s=n.edges.filter(c=>i.includes(c.source)&&i.includes(c.target));n.setClipboard(JSON.stringify({nodes:n.selectedNodes,edges:s})),n.setPasteCount(0)}function lKt(n,i,s){const c=(s.pasteCount||0)+1;s.setPasteCount(c);const d=50*c,g=new Map,b=s.nodes.map(E=>({...E,selected:!1})),w=n.map(E=>{const S=Xoe(E.type??"node");return g.set(E.id,S),{...E,selected:!0,id:S,position:{x:E.position.x+d,y:E.position.y+d}}});if(s.setNodes([...b,...w]),i.length>0){const E=i.map(S=>({...S,id:`edge-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,source:g.get(S.source)??S.source,target:g.get(S.target)??S.target}));s.setEdges([...s.edges,...E])}}function Rer(n){ret
Line truncated
|
||||
`))||s("errors:import.parseFailed"));ee(On.graph),setTimeout(()=>{Q({padding:.2,duration:300})},50),j(ht.friendly_name||ht.automation_id),P(ht.automation_id),N2.success(s("dialogs:import.importSuccess",{name:ht.friendly_name||ht.automation_id}))}else j(ht.friendly_name||ht.automation_id),P(ht.automation_id),N2.warning(s("dialogs:import.openedWarning",{name:ht.friendly_name||ht.automation_id}),{description:s("dialogs:import.openedWarningDescription")});i()}catch(vt){console.error("C.A.F.E.: Failed to open automation:",vt),N2.error(s("dialogs:import.importFailed",{message:vt.message}))}},dt=()=>{me.length===1&&K(()=>{We(me[0])})},Ue=ht=>{const Xt=ht.map(vt=>vt.friendly_name).filter(Boolean);return Xt.length===0?s("dialogs:import.defaultMergedName"):Xt.length<=2?Xt.join(" + "):`${Xt[0]} + ${Xt.length-1} more`},bt=async()=>{if(!(me.length<2))try{const ht=Mv(D,B);if(!ht.isConnected())throw new Error(s("errors:connection.noConnection"));const Xt=await ht.getAutomationConfigsBatch(me.map(Ft=>Ft.automation_id)),vt=[];for(const Ft of me){let On=Xt[Ft.automation_id];if(On||(On=await ht.getAutomationConfigWithFallback(Ft.automation_id,Ft.friendly_name)),!On)throw new Error(s("dialogs:import.mergeFailedMissingConfig",{name:Ft.friendly_name}));const Zn=gse(On,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1}),Yn=await GDe.fromYaml(Zn);if(!Yn.success||!Yn.graph)throw new Error(s("dialogs:import.mergeFailedInvalidYaml",{name:Ft.friendly_name}));vt.push({graph:Yn.graph,automationId:Ft.automation_id,entityId:Ft.entity_id,alias:Ft.friendly_name||Ft.automation_id})}const Ct=ftr(vt);ee(Ct),j(Ue(me)),P(null),x(new Set),setTimeout(()=>{Q({padding:.2,duration:300})},50),N2.success(s("dialogs:import.mergeSuccess",{count:me.length})),i()}catch(ht){console.error("C.A.F.E.: Failed to merge automations:",ht),N2.error(s("dialogs:import.mergeFailed",{message:ht.message}))}},kt=ht=>{if(!ht)return s("dialogs:import.never");const Xt=new Date(ht),Ct=new Date().getTime()-Xt.getTime(),Ft=Math.floor(Ct/(1e3*60)),On=Math.floor(Ft/60),Zn=Math.floor(On/24);return Ft<1?s("dialogs:import.justNow"):Ft<60?s("dialogs:import.minutesAgo",{count:Ft}):On<24?s("dialogs:import.hoursAgo",{count:On}):Zn<7?s("dialogs:import.daysAgo",{count:Zn}):Xt.toLocaleDateString()};return n?I.jsxs(wR,{open:n,onOpenChange:i,children:[I.jsxs(aN,{className:"flex max-h-[90vh] max-w-4xl flex-col",children:[I.jsx(uN,{className:"space-y-3",children:I.jsxs("div",{className:"flex items-center justify-between pr-8",children:[I.jsxs("div",{children:[I.jsx(cN,{children:s("dialogs:import.title")}),I.jsx(lN,{children:s("dialogs:import.descriptionFull")})]}),I.jsxs("div",{className:"flex items-center gap-2",children:[I.jsxs(Ri,{variant:"outline",onClick:me.length===1?dt:()=>K(()=>void bt()),disabled:me.length===0,children:[me.length>1?I.jsx(V8n,{className:"mr-2 h-4 w-4"}):I.jsx(T9t,{className:"mr-2 h-4 w-4"}),me.length>1?s("dialogs:import.openTogether"):s("dialogs:import.openSingle")]}),I.jsxs(Ri,{onClick:()=>{K(()=>{G(),j(s("defaults.newAutomation")),i()})},className:"bg-green-600 hover:bg-green-700",children:[I.jsx(dGt,{className:"mr-2 h-4 w-4"}),s("dialogs:import.createNew")]})]})]})}),I.jsxs("div",{className:"flex min-h-0 flex-col",children:[I.jsxs("div",{className:"relative mb-4",children:[I.jsx(bGt,{className:"absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-muted-foreground"}),I.jsx(Na,{type:"text",placeholder:s("dialogs:import.searchPlaceholder"),value:c,onChange:ht=>d(ht.target.value),className:"pl-10"})]}),I.jsx("div",{className:"max-h-[70vh] overflow-auto rounded-t-md",children:I.jsxs("div",{className:"min-w-full",children:[I.jsx("div",{className:"sticky top-0 z-20 bg-background before:absolute before:-top-px before:right-0 before:left-0 before:h-px before:bg-background",children:I.jsxs("div",{className:"flex",children:[I.jsx("div",{className:"flex w-[44px] items-center justify-center border-b bg-muted px-2 py-2",children:I.jsx(YDe,{checked:le,onCheckedChange:xe,title:s(le?"dialogs:import.unselectAll":"dialogs:import.selectAll")})}),I.jsxs("button",{type:"button",onClick:()=>Se("name"),className:"flex-1 cursor-pointer whitespace-nowrap border-b bg-muted px-3 py-2 text-left font-semibold text-muted-foreground text-xs hover:bg-muted/80",children:[s("dialogs:import.columns.name"),Le("name")]}),I.jsxs("button",{type:"button",onClick:()=>Se("lastTriggered"),className:"w-[120px] cursor-pointer whitespace-nowrap border-b bg-muted px-3 py-2 text-left font-semibold text-muted-foreground text-xs hover:bg-muted/80",children:[s("dialogs:import.columns.lastTriggered"),Le("lastTriggered")]}),I.jsxs("button",{type:"button",onClick:()=>Se("enabled"),className:"w-[80px] cursor-pointer whitespace-nowrap border-b bg-muted px-3 py-2 text-center font-semibold text-muted-foreground text-xs hover:bg-muted/80",children:[s("dialogs:import.columns.enabled"),Le("enabled")]}),I.jsx("div",{className:"w-[60px] border-b bg-muted px-3 py-2 text-center font-semibold text-muted-foreground
Line truncated
|
||||
cors_allowed_origins:
|
||||
- https://my-home-assistant.example.com`})]})}),I.jsx(Ri,{variant:"link",asChild:!0,className:"h-auto p-0 text-sm",children:I.jsxs("a",{href:"https://www.home-assistant.io/docs/authentication/#your-account-profile",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1",children:[I.jsx(O8n,{className:"h-4 w-4"}),d("dialogs:settings.tokenGuideLink")]})})]}),I.jsxs("div",{className:"flex items-center justify-between pt-4",children:[I.jsx(Ri,{variant:"destructive",onClick:D,size:"sm",children:d("dialogs:settings.disconnect")}),I.jsxs("div",{className:"flex items-center gap-2",children:[I.jsx(Ri,{variant:"outline",onClick:i,size:"sm",children:d("buttons.cancel")}),I.jsx(Ri,{onClick:L,disabled:!g||!w,size:"sm",children:d("buttons.save")})]})]})]})})}function Etr({isOpen:n,onClose:i,onImportSuccess:s}){const{t:c}=ps(["common","dialogs"]),[d,g]=H.useState(""),[b,w]=H.useState(!1),[E,S]=H.useState(null),[x,A]=H.useState([]),{fromFlowGraph:C}=Do(),{fitView:R}=kR();if(!n)return null;const L=async()=>{var B;w(!0),S(null),A([]);try{const $=await GDe.fromYaml(d);if(!$.success){S(((B=$.errors)==null?void 0:B.join(`
|
||||
`))||"Failed to parse YAML. Please check the format."),w(!1);return}$.warnings.length>0&&(Ef.warn("Import warnings:",$.warnings),A($.warnings)),$.graph&&(C($.graph),setTimeout(()=>{R({padding:.2,duration:300})},50),setTimeout(()=>{s==null||s(),D()},1e3))}catch($){S($ instanceof Error?$.message:"Unknown error occurred")}finally{w(!1)}},D=()=>{g(""),S(null),A([]),i()};return I.jsx(wR,{open:n,onOpenChange:()=>D(),children:I.jsxs(aN,{className:"flex max-h-[90vh] max-w-3xl flex-col",children:[I.jsxs(uN,{children:[I.jsx(cN,{children:c("dialogs:importYaml.title")}),I.jsx(lN,{children:c("dialogs:importYaml.description")})]}),I.jsxs("div",{className:"flex-1 space-y-4",children:[I.jsx($v,{value:d,onChange:B=>g(B.target.value),placeholder:`alias: My Automation
|
||||
description: An example automation
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: light.living_room
|
||||
to: "on"
|
||||
action:
|
||||
- service: notify.mobile_app
|
||||
data:
|
||||
message: "Light turned on!"`,className:"h-64 resize-none font-mono text-sm",disabled:b}),E&&I.jsxs(dA,{variant:"destructive",children:[I.jsx(_w,{className:"h-4 w-4"}),I.jsxs(fA,{className:"font-medium",children:[c("dialogs:importYaml.importFailed"),I.jsx("pre",{className:"mt-1 whitespace-pre-wrap font-mono text-xs",children:E})]})]}),x.length>0&&I.jsxs(dA,{children:[I.jsx(_w,{className:"h-4 w-4"}),I.jsxs(fA,{children:[I.jsx("p",{className:"mb-1 font-medium",children:c("dialogs:importYaml.warnings")}),I.jsx("ul",{className:"space-y-1 text-xs",children:x.map((B,$)=>I.jsxs("li",{children:["•"," ",B]},`warning-${$}-${B.slice(0,20)}`))})]})]}),b&&!E&&I.jsxs(dA,{children:[I.jsx(lGt,{className:"h-4 w-4"}),I.jsx(fA,{children:c("dialogs:importYaml.successLoading")})]}),I.jsx(dA,{children:I.jsxs(fA,{className:"text-xs",children:[I.jsx("strong",{children:c("dialogs:importYaml.tipLabel")})," ",c("dialogs:importYaml.tipText")]})})]}),I.jsxs("div",{className:"flex items-center justify-end gap-2 pt-4",children:[I.jsx(Ri,{variant:"outline",onClick:D,disabled:b,children:c("buttons.cancel")}),I.jsxs(Ri,{onClick:L,disabled:!d.trim()||b,children:[I.jsx(vPn,{className:"mr-2 h-4 w-4"}),c(b?"dialogs:importYaml.importing":"dialogs:importYaml.import")]})]})]})})}function H2({message:n}){return n?I.jsxs("div",{className:"mt-1.5 flex items-center gap-1.5 text-red-600 text-xs",children:[I.jsx(_w,{className:"h-3 w-3 flex-shrink-0"}),I.jsx("span",{children:n})]}):null}function Po({label:n,required:i,description:s,children:c}){return I.jsxs("div",{className:"flex flex-col gap-2",children:[I.jsxs(ll,{className:"font-medium text-muted-foreground text-xs",children:[n,i&&I.jsx("span",{className:"ml-1 text-destructive",children:"*"})]}),c,s&&I.jsx("p",{className:"text-muted-foreground text-xs",children:s})]})}const YFt={common:["id","alias","enabled","_conditionId"],trigger:["trigger","entity_id","to","from","for","at","event_type","event_data","event","offset","above","below","value_template","template","webhook_id","zone","topic","payload","hours","minutes","seconds","device_id","domain","type","subtype"],condition:["condition","entity_id","state","attribute","above","below","value_template","template","after","before","weekday","device_id","domain","type","subtype","zone","condition","for","conditions"],action:["service","data","target","response_variable","stop","error","entity_id","action","metadata"],delay:["delay"],wait:["wait_template","timeout","wait_for_trigger","continue_on_timeout"],set_variables:["variables"]};function JFt(n,i=[]){const s=[...YFt.common,...YFt[n]||[]];return new Set([...s,...i])}function mse(n,[i,s]){return Math.min(s,Math.max(i,n))}function XFt(n){const i=Str(n),s=H.forwardRef((c,d)=>{const{children:g,...b}=c,w=H.Children.toArray(g),E=w.find(Atr);if(E){const S=E.props.children,x=w.map(A=>A===E?H.Children.count(S)>1?H.Children.only(null):H.isValidElement(S)?S.props.children:null:A);return I.jsx(i,{...b,ref:d,children:H.isValidElement(S)?H.cloneElement(S,void 0,x):null})}return I.jsx(i,{...b,ref:d,children:g})});return s.displayName=`${n}.Slot`,s}function Str(n){const i=H.forwardRef((s,c)=>{const{children:d,...g}=s;if(H.isValidElement(d)){const b=xtr(d),w=_tr(g,d.props);return d.type!==H.Fragment&&(w.ref=c?zg(c,b):b),H.cloneElement(d,w)}return H.Children.count(d)>1?H.Children.only(null):null});return i.displayName=`${n}.SlotClone`,i}var Ttr=Symbol("radix.slottable");function Atr(n){return H.isValidElement(n)&&typeof n.type=="function"&&"__radixId"in n.type&&n.type.__radixId===Ttr}function _tr(n,i){const s={...i};for(const c in i){const d=n[c],g=i[c];/^on[A-Z]/.test(c)?d&&g?s[c]=(...w)=>{const E=g(...w);return d(...w),E}:d&&(s[c]=d):c==="style"?s[c]={...d,...g}:c==="className"&&(s[c]=[d,g].filter(Boolean).join(" "))}return{...n,...s}}function xtr(n){var c,d;let i=(c=Object.getOwnPropertyDescriptor(n.props,"ref"))==null?void 0:c.get,s=i&&"isReactWarning"in i&&i.isReactWarning;return s?n.ref:(i=(d=Object.getOwnPropertyDescriptor(n,"ref"))==null?void 0:d.get,s=i&&"isReactWarning"in i&&i.isReactWarning,s?n.props.ref:n.props.ref||n.ref)}function Wae(n){const i=n+"CollectionProvider",[s,c]=xw(i),[d,g]=s(i,{collectionRef:{current:null},itemMap:new Map}),b=D=>{const{scope:B,children:$}=D,j=Hn.useRef(null),P=Hn.useRef(new Map).current;return I.jsx(d,{scope:B,itemMap:P,collectionRef:j,children:$})};b.displayName=i;const w=n+"CollectionSlot",E=XFt(w),S=Hn.forwardRef((D,B)=>{const{scope:$,children:j}=D,P=g(w,$),G=hs(B,P.collectionRef);return I.jsx(E,{ref:G,children:j})});S.displayName=w;const x=n+"CollectionItemSlot",A="data-radix-collection-item",C=XFt(x),R=Hn.forwardRef((D,B)=>{const{scope:$,children:j,...P}=D,G=Hn.useRef(null),ee=hs(B,G),re=g(x,$);return Hn.useEffect(()=>(re.itemMap.set(G,{ref:G,...P}),()=>void re.itemMap.delete(G))),I.jsx(C,{[A]:"",ref:ee,children:j})});R.displayName=x;function L(D){const B=g(n+"CollectionConsumer",D);return Hn.useCallback(()=>{const j=B.collectionRef.current;if(!j)return[];const
Line truncated
|
||||
`,i);return c===-1?s:s===-1||s+1===c?c:s<c?s:c}const Vir={svg:"http://www.w3.org/2000/svg"},RJt={}.hasOwnProperty,Wir=Object.prototype;function Kir(n,i){const s=i||{};return o9e({file:s.file||void 0,location:!1,schema:s.space==="svg"?Hz:rue,verbose:s.verbose||!1},n)}function o9e(n,i){let s;switch(i.nodeName){case"#comment":{const c=i;return s={type:"comment",value:c.data},ooe(n,c,s),s}case"#document":case"#document-fragment":{const c=i,d="mode"in c?c.mode==="quirks"||c.mode==="limited-quirks":!1;if(s={type:"root",children:OJt(n,i.childNodes),data:{quirksMode:d}},n.file&&n.location){const g=String(n.file),b=qir(g),w=b.toPoint(0),E=b.toPoint(g.length);s.position={start:w,end:E}}return s}case"#documentType":{const c=i;return s={type:"doctype"},ooe(n,c,s),s}case"#text":{const c=i;return s={type:"text",value:c.value},ooe(n,c,s),s}default:return s=Yir(n,i),s}}function OJt(n,i){let s=-1;const c=[];for(;++s<i.length;){const d=o9e(n,i[s]);c.push(d)}return c}function Yir(n,i){const s=n.schema;n.schema=i.namespaceURI===Vir.svg?Hz:rue;let c=-1;const d={};for(;++c<i.attrs.length;){const w=i.attrs[c],E=(w.prefix?w.prefix+":":"")+w.name;RJt.call(Wir,E)||(d[E]=w.value)}const b=(n.schema.space==="svg"?Gir:zir)(i.tagName,d,OJt(n,i.childNodes));if(ooe(n,i,b),b.tagName==="template"){const w=i,E=w.sourceCodeLocation,S=E&&E.startTag&&K5(E.startTag),x=E&&E.endTag&&K5(E.endTag),A=o9e(n,w.content);S&&x&&n.file&&(A.position={start:S.end,end:x.start}),b.content=A}return n.schema=s,b}function ooe(n,i,s){if("sourceCodeLocation"in i&&i.sourceCodeLocation&&n.file){const c=Jir(n,s,i.sourceCodeLocation);c&&(n.location=!0,s.position=c)}}function Jir(n,i,s){const c=K5(s);if(i.type==="element"){const d=i.children[i.children.length-1];if(c&&!s.endTag&&d&&d.position&&d.position.end&&(c.end=Object.assign({},d.position.end)),n.verbose){const g={};let b;if(s.attrs)for(b in s.attrs)RJt.call(s.attrs,b)&&(g[i9e(n.schema,b).property]=K5(s.attrs[b]));s.startTag;const w=K5(s.startTag),E=s.endTag?K5(s.endTag):void 0,S={opening:w};E&&(S.closing=E),S.properties=g,i.data={position:S}}}return c}function K5(n){const i=s$t({line:n.startLine,column:n.startCol,offset:n.startOffset}),s=s$t({line:n.endLine,column:n.endCol,offset:n.endOffset});return i||s?{start:i,end:s}:void 0}function s$t(n){return n.line&&n.column?n:void 0}const Xir=new Set([65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]),Oc="�";var $e;(function(n){n[n.EOF=-1]="EOF",n[n.NULL=0]="NULL",n[n.TABULATION=9]="TABULATION",n[n.CARRIAGE_RETURN=13]="CARRIAGE_RETURN",n[n.LINE_FEED=10]="LINE_FEED",n[n.FORM_FEED=12]="FORM_FEED",n[n.SPACE=32]="SPACE",n[n.EXCLAMATION_MARK=33]="EXCLAMATION_MARK",n[n.QUOTATION_MARK=34]="QUOTATION_MARK",n[n.AMPERSAND=38]="AMPERSAND",n[n.APOSTROPHE=39]="APOSTROPHE",n[n.HYPHEN_MINUS=45]="HYPHEN_MINUS",n[n.SOLIDUS=47]="SOLIDUS",n[n.DIGIT_0=48]="DIGIT_0",n[n.DIGIT_9=57]="DIGIT_9",n[n.SEMICOLON=59]="SEMICOLON",n[n.LESS_THAN_SIGN=60]="LESS_THAN_SIGN",n[n.EQUALS_SIGN=61]="EQUALS_SIGN",n[n.GREATER_THAN_SIGN=62]="GREATER_THAN_SIGN",n[n.QUESTION_MARK=63]="QUESTION_MARK",n[n.LATIN_CAPITAL_A=65]="LATIN_CAPITAL_A",n[n.LATIN_CAPITAL_Z=90]="LATIN_CAPITAL_Z",n[n.RIGHT_SQUARE_BRACKET=93]="RIGHT_SQUARE_BRACKET",n[n.GRAVE_ACCENT=96]="GRAVE_ACCENT",n[n.LATIN_SMALL_A=97]="LATIN_SMALL_A",n[n.LATIN_SMALL_Z=122]="LATIN_SMALL_Z"})($e||($e={}));const tb={DASH_DASH:"--",CDATA_START:"[CDATA[",DOCTYPE:"doctype",SCRIPT:"script",PUBLIC:"public",SYSTEM:"system"};function DJt(n){return n>=55296&&n<=57343}function Zir(n){return n>=56320&&n<=57343}function Qir(n,i){return(n-55296)*1024+9216+i}function LJt(n){return n!==32&&n!==10&&n!==13&&n!==9&&n!==12&&n>=1&&n<=31||n>=127&&n<=159}function MJt(n){return n>=64976&&n<=65007||Xir.has(n)}var sn;(function(n){n.controlCharacterInInputStream="control-character-in-input-stream",n.noncharacterInInputStream="noncharacter-in-input-stream",n.surrogateInInputStream="surrogate-in-input-stream",n.nonVoidHtmlElementStartTagWithTrailingSolidus="non-void-html-element-start-tag-with-trailing-solidus",n.endTagWithAttributes="end-tag-with-attributes",n.endTagWithTrailingSolidus="end-tag-with-trailing-solidus",n.unexpectedSolidusInTag="unexpected-solidus-in-tag",n.unexpectedNullCharacter="unexpected-null-character",n.unexpectedQuestionMarkInsteadOfTagName="unexpected-question-mark-instead-of-tag-name",n.invalidFirstCharacterOfTagName="invalid-first-character-of-tag-name",n.unexpectedEqualsSignBeforeAttributeName="unexpected-equals-sign-before-attribute-name",n.missingEndTagName="missing-end-tag-name",n.unexpectedCharacterInAttributeName="unexpected-character-in-attribute-name",n.unknownNamedCharacterReference="unknown-named-character-reference",n.missingSemicolonAfterCharacterReference="missing-semicolon-after-character-reference",n.unexpectedCharacterAfterDoctypeSystemIdentifier="unexpected-
Line truncated
|
||||
\f\r &/=>`.split(""),`
|
||||
\f\r "&'/=>\``.split("")],[`\0
|
||||
\f\r "&'/<=>`.split(""),`\0
|
||||
\f\r "&'/<=>\``.split("")]],unquoted:[[`
|
||||
\f\r &>`.split(""),`\0
|
||||
\f\r "&'<=>\``.split("")],[`\0
|
||||
\f\r "&'<=>\``.split(""),`\0
|
||||
\f\r "&'<=>\``.split("")]],single:[["&'".split(""),"\"&'`".split("")],["\0&'".split(""),"\0\"&'`".split("")]],double:[['"&'.split(""),"\"&'`".split("")],['\0"&'.split(""),"\0\"&'`".split("")]]};function zur(n,i,s,c){const d=c.schema,g=d.space==="svg"?!1:c.settings.omitOptionalTags;let b=d.space==="svg"?c.settings.closeEmptyElements:c.settings.voids.includes(n.tagName.toLowerCase());const w=[];let E;d.space==="html"&&n.tagName==="svg"&&(c.schema=Hz);const S=Gur(c,n.properties),x=c.all(d.space==="html"&&n.tagName==="template"?n.content:n);return c.schema=d,x&&(b=!1),(S||!g||!jur(n,i,s))&&(w.push("<",n.tagName,S?" "+S:""),b&&(d.space==="svg"||c.settings.closeSelfClosing)&&(E=S.charAt(S.length-1),(!c.settings.tightSelfClosing||E==="/"||E&&E!=='"'&&E!=="'")&&w.push(" "),w.push("/")),w.push(">")),w.push(x),!b&&(!g||!d9e(n,i,s))&&w.push("</"+n.tagName+">"),w.join("")}function Gur(n,i){const s=[];let c=-1,d;if(i){for(d in i)if(i[d]!==null&&i[d]!==void 0){const g=qur(n,d,i[d]);g&&s.push(g)}}for(;++c<s.length;){const g=n.settings.tightAttributes?s[c].charAt(s[c].length-1):void 0;c!==s.length-1&&g!=='"'&&g!=="'"&&(s[c]+=" ")}return s.join("")}function qur(n,i,s){const c=i9e(n.schema,i),d=n.settings.allowParseErrors&&n.schema.space==="html"?0:1,g=n.settings.allowDangerousCharacters?0:1;let b=n.quote,w;if(c.overloadedBoolean&&(s===c.attribute||s==="")?s=!0:(c.boolean||c.overloadedBoolean)&&(typeof s!="string"||s===c.attribute||s==="")&&(s=!!s),s==null||s===!1||typeof s=="number"&&Number.isNaN(s))return"";const E=cM(c.attribute,Object.assign({},n.settings.characterReferences,{subset:Lie.name[d][g]}));return s===!0||(s=Array.isArray(s)?(c.commaSeparated?Mir:jir)(s,{padLeft:!n.settings.tightCommaSeparatedLists}):String(s),n.settings.collapseEmptyAttributes&&!s)?E:(n.settings.preferUnquoted&&(w=cM(s,Object.assign({},n.settings.characterReferences,{attribute:!0,subset:Lie.unquoted[d][g]}))),w!==s&&(n.settings.quoteSmart&&T$t(s,b)>T$t(s,n.alternative)&&(b=n.alternative),w=b+cM(s,Object.assign({},n.settings.characterReferences,{subset:(b==="'"?Lie.single:Lie.double)[d][g],attribute:!0}))+b),E+(w&&"="+w))}const Vur=["<","&"];function fXt(n,i,s,c){return s&&s.type==="element"&&(s.tagName==="script"||s.tagName==="style")?n.value:cM(n.value,Object.assign({},c.settings.characterReferences,{subset:Vur}))}function Wur(n,i,s,c){return c.settings.allowDangerousHtml?n.value:fXt(n,i,s,c)}function Kur(n,i,s,c){return c.all(n)}const Yur=tur("type",{invalid:Jur,unknown:Xur,handlers:{comment:vur,doctype:Eur,element:zur,raw:Wur,root:Kur,text:fXt}});function Jur(n){throw new Error("Expected node, not `"+n+"`")}function Xur(n){const i=n;throw new Error("Cannot compile unknown node `"+i.type+"`")}const Zur={},Qur={},ecr=[];function tcr(n,i){const s=i||Zur,c=s.quote||'"',d=c==='"'?"'":'"';if(c!=='"'&&c!=="'")throw new Error("Invalid quote `"+c+"`, expected `'` or `\"`");return{one:ncr,all:rcr,settings:{omitOptionalTags:s.omitOptionalTags||!1,allowParseErrors:s.allowParseErrors||!1,allowDangerousCharacters:s.allowDangerousCharacters||!1,quoteSmart:s.quoteSmart||!1,preferUnquoted:s.preferUnquoted||!1,tightAttributes:s.tightAttributes||!1,upperDoctype:s.upperDoctype||!1,tightDoctype:s.tightDoctype||!1,bogusComments:s.bogusComments||!1,tightCommaSeparatedLists:s.tightCommaSeparatedLists||!1,tightSelfClosing:s.tightSelfClosing||!1,collapseEmptyAttributes:s.collapseEmptyAttributes||!1,allowDangerousHtml:s.allowDangerousHtml||!1,voids:s.voids||eur,characterReferences:s.characterReferences||Qur,closeSelfClosing:s.closeSelfClosing||!1,closeEmptyElements:s.closeEmptyElements||!1},schema:s.space==="svg"?Hz:rue,quote:c,alternative:d}.one(Array.isArray(n)?{type:"root",children:n}:n,void 0,void 0)}function ncr(n,i,s){return Yur(n,i,s,this)}function rcr(n){const i=[],s=n&&n.children||ecr;let c=-1;for(;++c<s.length;)i[c]=this.one(s[c],c,n);return i.join("")}function icr(n){const i=this,s={...i.data("settings"),...n};i.compiler=c;function c(d){return tcr(d,s)}}function k$t(n){if(n)throw n}var aoe=Object.prototype.hasOwnProperty,hXt=Object.prototype.toString,N$t=Object.defineProperty,C$t=Object.getOwnPropertyDescriptor,I$t=function(i){return typeof Array.isArray=="function"?Array.isArray(i):hXt.call(i)==="[object Array]"},R$t=function(i){if(!i||hXt.call(i)!=="[object Object]")return!1;var s=aoe.call(i,"constructor"),c=i.constructor&&i.constructor.prototype&&aoe.call(i.constructor.prototype,"isPrototypeOf");if(i.constructor&&!s&&!c)return!1;var d;for(d in i);return typeof d>"u"||aoe.call(i,d)},O$t=function(i,s){N$t&&s.name==="__proto__"?N$t(i,s.name,{enumerable:!0,configurable:!0,value:s.newValue,writable:!0}):i[s.name]=s.newValue},D$t=function(i,s){if(s==="__proto__")if(aoe.call(i,s)){if(C$t)return C$t(i,s).value}else return;return i[s]},ocr=function n(){var i,s,c,d,g,b,w=arguments[0],E=1,S=arguments.length,x=!1;for(typeof w=="boolean"&&(x=w,w=arguments[1]||{},E=2),(w==null||typeof w!="object"&&typeof w!="function")&&(w={});E<S;++E)if(i=arguments[E],i!=null)for(sLine truncated
|
||||
`){i++;break}return i}getIndentText(){var i=this.getLineStartNumber(),s=this.getSelectedValue(i),c="";return s.replace(/(^(\s)+)/,(d,g)=>c=g),c}lineStarInstert(i){if(i){var s=this.start,c=this.getLineStartNumber(),d=this.getSelectedValue(c);this.position(c,this.end).insertText(d.split(`
|
||||
`).map(g=>i+g).join(`
|
||||
`)).position(s+i.length,this.end)}return this}lineStarRemove(i){if(i){var s=this.start,c=this.getLineStartNumber(),d=this.getSelectedValue(c),g=new RegExp("^"+i,"g"),b=s-i.length;g.test(d)||(b=s),this.position(c,this.end).insertText(d.split(`
|
||||
`).map(w=>w.replace(g,"")).join(`
|
||||
`)).position(b,this.end)}}notifyChange(){var i=new Event("input",{bubbles:!0,cancelable:!1});this.elm.dispatchEvent(i)}}function wcr(n,i){i===void 0&&(i=2);var s=new mcr(n.target),c=(n.code||n.nativeEvent.code).toLocaleLowerCase(),d=" ".repeat(i);if(c==="tab")s6e(n),s.start===s.end?n.shiftKey?s.lineStarRemove(d):s.insertText(d).position(s.start+i,s.end+i):s.getSelectedValue().indexOf(`
|
||||
`)>-1&&n.shiftKey?s.lineStarRemove(d):s.getSelectedValue().indexOf(`
|
||||
`)>-1?s.lineStarInstert(d):s.insertText(d).position(s.start+i,s.end),s.notifyChange();else if(c==="enter"){s6e(n);var g=`
|
||||
`+s.getIndentText();s.insertText(g).position(s.start+g.length,s.start+g.length),s.notifyChange()}else if(c&&/^(quote|backquote|bracketleft|digit9|comma)$/.test(c)&&s.getSelectedValue()){s6e(n);var b=s.getSelectedValue(),w="";switch(c){case"quote":w="'"+b+"'",n.shiftKey&&(w='"'+b+'"');break;case"backquote":w="`"+b+"`";break;case"bracketleft":w="["+b+"]",n.shiftKey&&(w="{"+b+"}");break;case"digit9":w="("+b+")";break;case"comma":w="<"+b+">";break}s.insertText(w),s.notifyChange()}}var ycr={position:"relative",textAlign:"left",boxSizing:"border-box",padding:0,overflow:"hidden"},vcr={position:"absolute",top:0,left:0,height:"100%",width:"100%",resize:"none",color:"inherit",opacity:.8,overflow:"hidden",MozOsxFontSmoothing:"grayscale",WebkitFontSmoothing:"antialiased",WebkitTextFillColor:"transparent"},P$t={margin:0,border:0,background:"none",boxSizing:"inherit",display:"inherit",fontFamily:"inherit",fontSize:"inherit",fontStyle:"inherit",fontVariantLigatures:"inherit",fontWeight:"inherit",letterSpacing:"inherit",lineHeight:"inherit",tabSize:"inherit",textIndent:"inherit",textRendering:"inherit",textTransform:"inherit",whiteSpace:"pre-wrap",wordBreak:"keep-all",overflowWrap:"break-word",outline:0},Ecr=["prefixCls","value","padding","minHeight","placeholder","language","data-color-mode","className","style","rehypePlugins","onChange","indentWidth"];const Scr=Hn.forwardRef((n,i)=>{var{prefixCls:s="w-tc-editor",padding:c=10,minHeight:d=16,placeholder:g,language:b,"data-color-mode":w,className:E,style:S,rehypePlugins:x,onChange:A,indentWidth:C=2}=n,R=SJt(n,Ecr),[L,D]=H.useState(n.value||"");H.useEffect(()=>D(n.value||""),[n.value]);var B=H.useRef(null);H.useImperativeHandle(i,()=>B.current,[B]);var $={paddingTop:c,paddingRight:c,paddingBottom:c,paddingLeft:c},j=H.useMemo(()=>gcr("<pre aria-hidden=true><code "+(b&&L?'class="language-'+b+'"':"")+" >"+bcr(String(L||""))+"</code><br /></pre>",x),[L,b,x]),P=H.useMemo(()=>I.jsx("div",{style:Hk({},P$t,$,{minHeight:d}),className:s+"-preview "+(b?"language-"+b:""),dangerouslySetInnerHTML:{__html:j}}),[s,b,j]),G=Q=>{D(Q.target.value),A&&A(Q)},ee=Q=>{R.readOnly||(!R.onKeyDown||R.onKeyDown(Q)!==!1)&&wcr(Q,C)},re=Hk({autoComplete:"off",autoCorrect:"off",spellCheck:"false",autoCapitalize:"off"},R,{placeholder:g,onKeyDown:ee,style:Hk({},P$t,vcr,$,{minHeight:d},g&&!L?{WebkitTextFillColor:"inherit"}:{}),onChange:G,className:s+"-text",value:L});return I.jsxs("div",{style:Hk({},ycr,S),className:s+" "+(E||""),"data-color-mode":w,children:[I.jsx("textarea",Hk({},re,{ref:B})),P]})}),h9e=function(n){if(n==null)return xcr;if(typeof n=="function")return cue(n);if(typeof n=="object")return Array.isArray(n)?Tcr(n):Acr(n);if(typeof n=="string")return _cr(n);throw new Error("Expected function, string, or object as test")};function Tcr(n){const i=[];let s=-1;for(;++s<n.length;)i[s]=h9e(n[s]);return cue(c);function c(...d){let g=-1;for(;++g<i.length;)if(i[g].apply(this,d))return!0;return!1}}function Acr(n){const i=n;return cue(s);function s(c){const d=c;let g;for(g in n)if(d[g]!==i[g])return!1;return!0}}function _cr(n){return cue(i);function i(s){return s&&s.type===n}}function cue(n){return i;function i(s,c,d){return!!(kcr(s)&&n.call(this,s,typeof c=="number"?c:void 0,d||void 0))}}function xcr(){return!0}function kcr(n){return n!==null&&typeof n=="object"&&"type"in n}const pXt=[],Ncr=!0,j$t=!1,Ccr="skip";function Icr(n,i,s,c){let d;typeof i=="function"&&typeof s!="function"?(c=s,s=i):d=i;const g=h9e(d),b=c?-1:1;w(n,void 0,[])();function w(E,S,x){const A=E&&typeof E=="object"?E:{};if(typeof A.type=="string"){const R=typeof A.tagName=="string"?A.tagName:typeof A.name=="string"?A.name:void 0;Object.defineProperty(C,"name",{value:"node ("+(E.type+(R?"<"+R+">":""))+")"})}return C;function C(){let R=pXt,L,D,B;if((!i||g(E,S,x[x.length-1]||void 0))&&(R=Rcr(s(E,x)),R[0]===j$t))return R;if("children"in E&&E.children){const $=E;if($.children&&R[0]!==Ccr)for(D=(c?$.children.length:-1)+b,B=x.concat($);D>-1&&D<$.children.length;){const j=$.children[D];if(L=w(j,D,B)(),L[0]===j$t)return L;D=typeof L[1]=="number"?L[1]:D+b}}return R}}}function Rcr(n){return Array.isArray(n)?n:typeof n=="number"?[Ncr,n]:n==null?pXt:[n]}function Ocr(n,i,s,c){let d,g,b;g=i,b=s,d=c,Icr(n,g,w,d);function w(E,S){const x=S[S.length-1],A=x?x.children.indexOf(E):void 0;return b(E,A,x)}}function Pie(n){return"children"in n?gXt(n):"value"in n?n.value:""}function Dcr(n){return n.type==="text"?n.value:"children"in n?gXt(n):""}function gXt(n){let i=-1;const s=[];for(;++i<n.children.length;)s[i]=Dcr(n.children[i]);return s.join("")}const Lcr={}.hasOwnProperty;function Mcr(n,i,s){const c=h9e(i),d=i&&typeof i=="object"&&"cascade"in i?i.cascade:void 0,g=d??!0;return b(n);function b(w,E,S){const x=[];if(!c(w,E,S))return;if(Pcr(w)){let R=-1;for(;++R<w.children.length;){const L=b(w.children[R],R,w);L&&x.push(L)}if(g&&w.children.length>0&&x.length===0)return}const A={};let C;for(C in w)Lcr.call(w,C)&&(A[C]=C==="children"?x:w[C]);return A}}function Pcr(n){r
Line truncated
|
||||
?|
|
||||
|(?![\\s\\S])))+`,"m"),alias:g,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(c)[0]}}}}),Object.defineProperty(i.languages.diff,"PREFIXES",{value:s})})(n)}fue.displayName="go";fue.aliases=[];function fue(n){n.register(Ds),n.languages.go=n.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),n.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete n.languages.go["class-name"]}hue.displayName="ini";hue.aliases=[];function hue(n){n.languages.ini={comment:{pattern:/(^[ \f\t\v]*)[#;][^\n\r]*/m,lookbehind:!0},section:{pattern:/(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,lookbehind:!0,inside:{"section-name":{pattern:/(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,lookbehind:!0,alias:"selector"},punctuation:/\[|\]/}},key:{pattern:/(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,lookbehind:!0,alias:"attr-name"},value:{pattern:/(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,lookbehind:!0,alias:"attr-value",inside:{"inner-value":{pattern:/^("|').+(?=\1$)/,lookbehind:!0}}},punctuation:/=/}}BR.displayName="java";BR.aliases=[];function BR(n){n.register(Ds),function(i){var s=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,c=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,d={pattern:RegExp(/(^|[^\w.])/.source+c+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};i.languages.java=i.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[d,{pattern:RegExp(/(^|[^\w.])/.source+c+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:d.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+c+/[A-Z]\w*\b/.source),lookbehind:!0,inside:d.inside}],keyword:s,function:[i.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),i.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),i.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":d,keyword:s,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+c+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:d.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+c+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:d.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,function(){return s.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(n)}pue.displayName="regex";pue.aliases=[];function pue(n){(function(i){var s={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},c=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,d={pattern:/\.|\\[wsLine truncated
|
||||
]))(?:`+(/[^\s\\]/.source+'|[ ]+(?:(?![ "])|'+c+")|"+/\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source)+")*"),lookbehind:!0,greedy:!0,alias:"attr-value",inside:{comment:s,quoted:{pattern:RegExp(/(^|\s)/.source+c),lookbehind:!0,greedy:!0},punctuation:/\\$/m,boolean:{pattern:/^(?:false|no|off|on|true|yes)$/,greedy:!0}}},punctuation:/=/}})(n)}eG.displayName="t4-templating";eG.aliases=[];function eG(n){(function(i){function s(d,g,b){return{pattern:RegExp("<#"+d+"[\\s\\S]*?#>"),alias:"block",inside:{delimiter:{pattern:RegExp("^<#"+d+"|#>$"),alias:"important"},content:{pattern:/[\s\S]+/,inside:g,alias:b}}}}function c(d){var g=i.languages[d],b="language-"+d;return{block:{pattern:/<#[\s\S]+?#>/,inside:{directive:s("@",{"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,inside:{punctuation:/^=|^["']|["']$/}},keyword:/\b\w+(?=\s)/,"attr-name":/\b\w+/}),expression:s("=",g,b),"class-feature":s("\\+",g,b),standard:s("",g,b)}}}}i.languages["t4-templating"]=Object.defineProperty({},"createT4",{value:c})})(n)}T7e.displayName="t4-cs";T7e.aliases=["t4"];function T7e(n){n.register($R),n.register(eG),n.languages.t4=n.languages["t4-cs"]=n.languages["t4-templating"].createT4("csharp")}A7e.displayName="t4-vb";A7e.aliases=[];function A7e(n){n.register(eG),n.register(Jz),n.languages["t4-vb"]=n.languages["t4-templating"].createT4("vbnet")}_7e.displayName="tap";_7e.aliases=[];function _7e(n){n.register(Wz),n.languages.tap={fail:/not ok[^#{\n\r]*/,pass:/ok[^#{\n\r]*/,pragma:/pragma [+-][a-z]+/,bailout:/bail out!.*/i,version:/TAP version \d+/i,plan:/\b\d+\.\.\d+(?: +#.*)?/,subtest:{pattern:/# Subtest(?:: .*)?/,greedy:!0},punctuation:/[{}]/,directive:/#.*/,yamlish:{pattern:/(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,lookbehind:!0,inside:n.languages.yaml,alias:"language-yaml"}}}x7e.displayName="tcl";x7e.aliases=[];function x7e(n){n.languages.tcl={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,greedy:!0},variable:[{pattern:/(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,lookbehind:!0},{pattern:/(\$)\{[^}]+\}/,lookbehind:!0},{pattern:/(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,lookbehind:!0}],function:{pattern:/(^[\t ]*proc[ \t]+)\S+/m,lookbehind:!0},builtin:[{pattern:/(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,lookbehind:!0},/\b(?:else|elseif)\b/],scope:{pattern:/(^[\t ]*)(?:global|upvar|variable)\b/m,lookbehind:!0,alias:"constant"},keyword:{pattern:/(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,lookbehind:!0},operator:/!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,punctuation:/[{}()\[\]]/}}k7e.displayName="tt2";k7e.aliases=[];function k7e(n){n.register(Ds),n.register(Vh),function(i){i.languages.tt2=i.languages.extend("clike",{comment:/#.*|\[%#[\s\S]*?%\]/,keyword:/\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,punctuation:/[[\]{},()]/}),i.languages.insertBefore("tt2","number",{operator:/=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,variable:{pattern:/\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i}}),i.languages.insertBefore("tt2","keyword",{delimiter:{pattern:/^(?:\[%|%%)-?|-?%\]$/,alias:"punctuation"}}),i.languages.insertBefore("tt2","string",{"single-quoted-string":{pattern:/'[^\\']*(?:\\[\s\S][^\\']*)*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,greedy:!0,alias:"string",inside:{variable:{pattern:/\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i}}}}),delete i.languages.tt2.string,i.hooks.add("before-tokenize",function(s){var c=/\[%[\s\S]+?%\]/g;i.languages["markup-templating"].buildPlaceholders(s,"tt2",c)}),i.hooks.add("after-tokenize",function(s){i.languages["markup-templating"].tokenizePlaceholders(s,"tt2")})}(n)}N7e.displayName="toml";N7e.aliases=[];function N7e(n){(function(i){var s=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function c(d){return d.replace(/__/g,function(){return s})}i.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(c(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern
Line truncated
|
||||
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ylr=function(n){return function(i){return i===void 0&&(i={}),function(c,d){if(d&&!c.registered(d))throw new Error('The default language "'+d+'" is not registered with refractor.')}(n,i.defaultLanguage),function(c){Ocr(c,"element",s)};function s(c,d,g){var b,w;if(g&&g.tagName==="pre"&&c.tagName==="code"){var E=(c==null||(b=c.data)==null?void 0:b.meta)||(c==null||(w=c.properties)==null?void 0:w.metastring)||"";c.properties.className?typeof c.properties.className=="boolean"?c.properties.className=[]:Array.isArray(c.properties.className)||(c.properties.className=[c.properties.className]):c.properties.className=[];var S,x,A=function(ee){for(var re,Q=u6e(ee.properties.className);!(re=Q()).done;){var ie=re.value;if(ie.slice(0,9)==="language-")return ie.slice(9).toLowerCase()}return null}(c);if(!A&&i.defaultLanguage&&c.properties.className.push("language-"+(A=i.defaultLanguage)),c.properties.className.push("code-highlight"),A)try{var C,R;R=(C=A)!=null&&C.includes("diff-")?A.split("-")[1]:A,S=n.highlight(Pie(c),R),g.properties.className=(g.properties.className||[]).concat("language-"+R)}catch(ee){if(!i.ignoreMissing||!/Unknown language/.test(ee.message))throw ee;S=c}else S=c;S.children=(x=1,function ee(re){return re.reduce(function(Q,ie){if(ie.type==="text"){var pe=ie.value,me=(pe.match(/\n/g)||"").length;if(me===0)ie.position={start:{line:x,column:1},end:{line:x,column:1}},Q.push(ie);else for(var le,fe=pe.split(`
|
||||
`),K=u6e(fe.entries());!(le=K()).done;){var he=le.value,Oe=he[0],Se=he[1];Q.push({type:"text",value:Oe===fe.length-1?Se:Se+`
|
||||
`,position:{start:{line:x+Oe,column:1},end:{line:x+Oe,column:1}}})}return x+=me,Q}if(Object.prototype.hasOwnProperty.call(ie,"children")){var Le=x;return ie.children=ee(ie.children),Q.push(ie),ie.position={start:{line:Le,column:1},end:{line:x,column:1}},Q}return Q.push(ie),Q},[])})(S.children),S.position=S.children.length>0?{start:{line:S.children[0].position.start.line,column:0},end:{line:S.children[S.children.length-1].position.end.line,column:0}}:{start:{line:0,column:0},end:{line:0,column:0}};for(var L,D=function(ee){var re=/{([\d,-]+)}/,Q=ee.split(",").map(function(me){return me.trim()}).join();if(re.test(Q)){var ie=re.exec(Q)[1],pe=Fcr(ie);return function(me){return pe.includes(me+1)}}return function(){return!1}}(E),B=function(ee){var re=SLe(/showLineNumbers=(\d+)/i,{lines:1});if(re.test(ee)){var Q=re.exec(ee);return Number(Q.groups.lines)}return 1}(E),$=function(ee){for(var re=new Array(ee),Q=0;Q<ee;Q++)re[Q]={type:"element",tagName:"span",properties:{className:[]},children:[]};return re}(S.position.end.line),j=["showlinenumbers=false",'showlinenumbers="false"',"showlinenumbers={false}"],P=function(){var ee,re,Q=L.value,ie=Q[0],pe=Q[1];pe.properties.className=["code-line"];var me=Mcr(S,function(le){return le.position.start.line<=ie+1&&le.position.end.line>=ie+1});pe.children=me.children,!E.toLowerCase().includes("showLineNumbers".toLowerCase())&&!i.showLineNumbers||j.some(function(le){return E.toLowerCase().includes(le)})||(pe.properties.line=[(ie+B).toString()],pe.properties.className.push("line-number")),D(ie)&&pe.properties.className.push("highlight-line"),(A==="diff"||(ee=A)!=null&&ee.includes("diff-"))&&Pie(pe).substring(0,1)==="-"?pe.properties.className.push("deleted"):(A==="diff"||(re=A)!=null&&re.includes("diff-"))&&Pie(pe).substring(0,1)==="+"&&pe.properties.className.push("inserted")},G=u6e($.entries());!(L=G()).done;)P();$.length>0&&Pie($[$.length-1]).trim()===""&&$.pop(),c.children=$}}}},vlr=ylr(_e),Elr=["rehypePlugins"];const Slr=Hn.forwardRef((n,i)=>{var{rehypePlugins:s=[[vlr,{ignoreMissing:!0}]]}=n,c=SJt(n,Elr);return I.jsx(Scr,Hk({},c,{rehypePlugins:s,ref:i}))});function Tlr({yaml:n,errors:i,warnings:s,onYamlChange:c}){const d=Do(w=>w.fromFlowGraph),g=zae();H.useEffect(()=>{},[]);const b=async w=>{const E=w.target.value;c&&c(E);try{const x=await new RM().fromYaml(E);if(!x.success||!x.graph)return;d(x.graph)}catch{}};return I.jsxs("div",{className:"flex h-full flex-col",children:[I.jsx(Slr,{value:n,language:"yaml",placeholder:"Enter YAML...",onChange:b,"data-color-mode":g?"dark":"light",padding:12,style:{fontFamily:"ui-monospace, SFMono-Regular, SF Mono, Consolas, Liberation Mono, Menlo, monospace",fontSize:13,height:"100%",resize:"none",whiteSpace:"pre-wrap",overflow:"auto"}}),i&&i.length>0&&I.jsx("div",{className:"border-red-200 border-t bg-red-50 px-3 py-2 text-red-600 text-xs",children:i.join(`
|
||||
`)}),s&&s.length>0&&I.jsx("div",{className:"border-yellow-200 border-t bg-yellow-50 px-3 py-2 text-xs text-yellow-600",children:s.join(`
|
||||
`)})]})}function Alr(){const{t:n}=ps(["common","errors"]),i=Do(L=>L.nodes),s=Do(L=>L.toFlowGraph),[c,d]=H.useState(!1),[g,b]=H.useState("auto"),w=H.useRef(null),{yaml:E,errors:S,warnings:x,strategy:A,isStale:C}=H.useMemo(()=>{var L;if(i.length===0)return w.current=null,{yaml:n("placeholders.addNodesForYaml"),warnings:[],errors:[],strategy:null,isStale:!1};try{const D=s(),$=new RM().transpile(D,{forceStrategy:g==="auto"?void 0:g});if(!$.success){const G=w.current;return{yaml:(G==null?void 0:G.yaml)||"",warnings:[],errors:$.errors||[n("errors:api.unknownError")],strategy:(G==null?void 0:G.strategy)||null,isStale:!!G}}const j=$.yaml||"",P=((L=$.output)==null?void 0:L.strategy)||null;return w.current={yaml:j,strategy:P},{yaml:j,warnings:$.warnings,errors:[],strategy:P,isStale:!1}}catch(D){const B=w.current;return{yaml:(B==null?void 0:B.yaml)||"",warnings:[],errors:[D instanceof Error?D.message:n("errors:api.transpileFailed")],strategy:(B==null?void 0:B.strategy)||null,isStale:!!B}}},[i,s,g,n]),R=async()=>{try{await kir(E),d(!0),setTimeout(()=>d(!1),2e3)}catch(L){console.error(n("errors:common.failedToCopy"),L)}};return I.jsxs("div",{className:"flex h-full flex-col",children:[I.jsxs("div",{className:"flex items-center justify-between border-b p-3",children:[I.jsx("h3",{className:"font-semibold text-foreground text-sm",children:n("labels.yamlOutput")}),I.jsxs("div",{className:"flex items-center gap-2",children:[I.jsxs(zp,{value:g,onValueChange:L=>b(L),children:[I.jsx(zh,{className:"h-7 w-[120px] text-xs",children:I.jsx(Gp,{})}),I.jsxs(Gh,{children:[I.jsx(to,{value:"auto",children:n("strategy.auto")}),I.jsx(to,{value:"native",children:n("strategy.native")}),I.jsx(to,{value:"state-machine",children:n("strategy.stateMachine")})]})]}),I.jsx(Ri,{variant:"ghost",size:"sm",onClick:R,disabled:!E,className:Sr("h-7 w-7 p-0",c?"bg-green-100 text-green-600 hover:bg-green-100":"text-muted-foreground"),children:c?I.jsx(oN,{className:"h-4 w-4"}):I.jsx($5e,{className:"h-4 w-4"})})]})]}),A&&I.jsxs("div",{className:"flex items-center gap-2 border-b bg-muted/50 px-3 py-1.5",children:[I.jsx("span",{className:"text-muted-foreground text-xs",children:n("labels.strategy")}),I.jsx(HMe,{variant:"secondary",className:"text-xs",children:A})]}),I.jsx("div",{className:"min-h-0 flex-1",children:I.jsx(Tlr,{yaml:E,errors:S,warnings:C?[n("errors:yaml.staleWarning"),...x]:x})})]})}function _lr(){const{t:n}=ps(["common","dialogs"]),{hass:i}=pb(),{automationId:s,traceData:c,isShowingTrace:d,traceExecutionPath:g,traceTimestamps:b,showTrace:w,hideTrace:E,setActiveNode:S,simulationSpeed:x,isSimulating:A}=Do(),[C,R]=H.useState([]),[L,D]=H.useState(""),[B,$]=H.useState(!1),[j,P]=H.useState(!1),G=H.useCallback(async()=>{if(!(!s||!i)){$(!0);try{const fe=Mv(i),K=await fe.getAutomationTraces(s);if(Ef.info("Loaded automation traces:",K),R(K||[]),K&&K.length>0){const he=K[0].run_id;D(he);const Oe=await fe.getAutomationTraceDetails(s,he);Oe&&w(Oe)}}catch(fe){Ef.error("Failed to load automation traces:",fe),R([])}$(!1)}},[s,i,w]);H.useEffect(()=>{s&&i&&G()},[s,i,G]);const ee=H.useCallback(async fe=>{if(!(!s||!i||!fe)){$(!0);try{const he=await Mv(i).getAutomationTraceDetails(s,fe);Ef.info("Loaded trace details:",he),he&&w(he)}catch(K){Ef.error("Failed to load trace details:",K)}$(!1)}},[s,i,w]),re=H.useCallback(fe=>{D(fe),ee(fe)},[ee]),Q=H.useCallback(()=>{E(),S(null),P(!1)},[E,S]),ie=H.useCallback(async()=>{if(!(!g.length||A)){P(!0);try{for(const fe of g)if(S(fe),await new Promise(K=>setTimeout(K,x)),!d)break;S(null)}catch(fe){Ef.error("Trace animation error:",fe)}P(!1)}},[g,x,S,d,A]),pe=H.useCallback(()=>{P(!1),S(null)},[S]),me=fe=>{try{return new Date(fe).toLocaleTimeString()}catch{return fe}},le=(fe,K)=>{try{const he=new Date(fe);return`${(((K?new Date(K):new Date).getTime()-he.getTime())/1e3).toFixed(1)}s`}catch{return n("labels.notApplicable")}};return s?I.jsxs("div",{className:"h-full space-y-4 p-4",children:[I.jsxs("div",{className:"flex items-center justify-between",children:[I.jsx("h3",{className:"font-semibold text-foreground text-sm",children:n("labels.automationTrace")}),I.jsxs("div",{className:"flex gap-1",children:[d&&!j&&I.jsx(Ri,{variant:"outline",size:"sm",onClick:ie,disabled:!g.length||A,className:Sr("h-8 w-8 p-0",!g.length||A?"text-muted-foreground":"border-orange-200 text-orange-600 hover:bg-orange-50"),children:I.jsx(rae,{className:"h-4 w-4"})}),j&&I.jsx(Ri,{variant:"outline",size:"sm",onClick:pe,className:"h-8 w-8 border-orange-200 p-0 text-orange-600 hover:bg-orange-50",children:I.jsx(mGt,{className:"h-4 w-4"})}),d?I.jsx(Ri,{variant:"outline",size:"sm",onClick:Q,className:"h-8 w-8 border-blue-200 p-0 text-blue-600 hover:bg-blue-50",children:I.jsx(pGt,{className:"h-4 w-4"})}):I.jsx(Ri,{variant:"outline",size:"sm",onClick:G,disabled:B,className:Sr("h-8 w-8 p-0",B?"text-muted-foreground":"border-blue-200 text-blue-600 hover:bg-blue-50"),children:I.jsx(z8n,{className:"h-4 w-4"})})]})]}),C.length===0&&!B&&I.jsx("div",{className:"text-center t
Line truncated
|
||||
//# sourceMappingURL=main-Bh6odaMI.js.map
|
||||
@@ -0,0 +1,2 @@
|
||||
var d=Object.defineProperty;var o=(t,s,e)=>s in t?d(t,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[s]=e;var h=(t,s,e)=>o(t,typeof s!="symbol"?s+"":s,e);class m extends HTMLElement{constructor(){super(...arguments);h(this,"_messageHandler");h(this,"iframe",null);h(this,"_hass")}set hass(e){var a;this._hass=e,window.hass=e;const i=(a=this.iframe)==null?void 0:a.contentWindow;i!=null&&i.setHass&&i.setHass(e)}get hass(){return this._hass}connectedCallback(){var a,n;this.style.display="block",this.style.width="100%",this.style.height="100%",this.style.position="relative";const i=((n=(a=this._hass)==null?void 0:a.themes)==null?void 0:n.darkMode)??!1?"hsl(222.2, 84%, 4.9%)":"hsl(0, 0%, 100%)";this.iframe=document.createElement("iframe"),this.iframe.src="/cafe-hass/index.html",this.iframe.style.width="100%",this.iframe.style.height="100%",this.iframe.style.border="none",this.iframe.style.display="block",this.iframe.style.background=i,this.iframe.setAttribute("allow","clipboard-read *; clipboard-write *"),this.appendChild(this.iframe),this._messageHandler=r=>{var l;r.source===((l=this.iframe)==null?void 0:l.contentWindow)&&r.data&&r.data.type==="CAFE_TOGGLE_SIDEBAR"&&this.dispatchEvent(new Event("hass-toggle-menu",{bubbles:!0,composed:!0}))},window.addEventListener("message",this._messageHandler)}disconnectedCallback(){this.iframe&&(this.removeChild(this.iframe),this.iframe=null),window.hass=void 0,this._messageHandler&&(window.removeEventListener("message",this._messageHandler),this._messageHandler=void 0)}}customElements.get("cafe-panel")||customElements.define("cafe-panel",m);
|
||||
//# sourceMappingURL=panel-wrapper.js.map
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Karbantartás",
|
||||
"objects": "Objektumok",
|
||||
"tasks": "Feladatok",
|
||||
"overdue": "Lejárt",
|
||||
"due_soon": "Hamarosan esedékes",
|
||||
"triggered": "Aktiválva",
|
||||
"trigger_replaced": "Kiváltó lecserélve",
|
||||
"ok": "OK",
|
||||
"all": "Összes",
|
||||
"new_object": "+ Új objektum",
|
||||
"templates_from": "Sablonból",
|
||||
"templates_title": "Kezdés sablonból",
|
||||
"templates_task_count": "{n} feladat",
|
||||
"template_created": "Létrehozva sablonból",
|
||||
"onboard_hint": "Adja hozzá az első objektumot a karbantartások nyomon követéséhez.",
|
||||
"edit": "Szerkesztés",
|
||||
"duplicate": "Duplikálás",
|
||||
"task_duplicated": "Feladat duplikálva",
|
||||
"object_duplicated": "Objektum duplikálva",
|
||||
"delete": "Törlés",
|
||||
"add_task": "+ Új feladat",
|
||||
"complete": "Elvégzés",
|
||||
"completed": "Elvégezve",
|
||||
"skip": "Kihagyás",
|
||||
"skipped": "Kihagyva",
|
||||
"missed": "Elmulasztva",
|
||||
"reset": "Visszaállítás",
|
||||
"snooze": "Szundi",
|
||||
"snoozed": "Szundiztatva",
|
||||
"cancel": "Mégse",
|
||||
"bulk_select": "Kijelölés",
|
||||
"bulk_select_all": "Összes kijelölése",
|
||||
"bulk_n_selected": "{n} kijelölve",
|
||||
"bulk_completed": "{n} feladat elvégezve",
|
||||
"bulk_archived": "{n} feladat archiválva",
|
||||
"completing": "Elvégzés…",
|
||||
"interval": "Intervallum",
|
||||
"warning": "Figyelmeztetés",
|
||||
"last_performed": "Utoljára elvégezve",
|
||||
"next_due": "Következő esedékesség",
|
||||
"days_until_due": "Napok az esedékességig",
|
||||
"avg_duration": "Átl. időtartam",
|
||||
"trigger": "Kiváltó",
|
||||
"trigger_type": "Kiváltó típusa",
|
||||
"threshold_above": "Felső határ",
|
||||
"threshold_below": "Alsó határ",
|
||||
"threshold": "Küszöbérték",
|
||||
"counter": "Számláló",
|
||||
"state_change": "Állapotváltozás",
|
||||
"runtime": "Üzemidő",
|
||||
"runtime_hours": "Cél üzemidő (óra)",
|
||||
"target_value": "Célérték",
|
||||
"baseline": "Kiindulási érték",
|
||||
"target_changes": "Cél változásszám",
|
||||
"for_minutes": "Ennyi ideig (perc)",
|
||||
"time_based": "Időalapú",
|
||||
"sensor_based": "Érzékelőalapú",
|
||||
"manual": "Kézi",
|
||||
"one_time": "Egyszeri",
|
||||
"weekdays": "Hét napjai",
|
||||
"nth_weekday": "A hónap n. hétnapja",
|
||||
"day_of_month": "A hónap napja",
|
||||
"recurrence_on_days": "Ismétlés ezeken a napokon",
|
||||
"recurrence_occurrence": "Előfordulás",
|
||||
"recurrence_weekday": "Hét napja",
|
||||
"recurrence_day": "A hónap napja (1–31)",
|
||||
"recurrence_last_day": "A hónap utolsó napja",
|
||||
"recurrence_business_day": "Csak munkanapokon (hétvégéről visszalépve)",
|
||||
"recurrence_offset": "Eltolás (nap, ±)",
|
||||
"recurrence_offset_help": "A dátum eltolása ±N nappal, pl. -2 = két nappal korábban.",
|
||||
"last_day_month": "A hónap utolsó napja",
|
||||
"last_business_day_month": "Utolsó munkanap",
|
||||
"ord_1": "1.",
|
||||
"ord_2": "2.",
|
||||
"ord_3": "3.",
|
||||
"ord_4": "4.",
|
||||
"ord_5": "5.",
|
||||
"ord_last": "Utolsó",
|
||||
"day_word": "Nap",
|
||||
"interval_value": "Intervallum",
|
||||
"interval_unit": "Egység",
|
||||
"unit_days": "Nap",
|
||||
"unit_weeks": "Hét",
|
||||
"unit_months": "Hónap",
|
||||
"unit_years": "Év",
|
||||
"due_date": "Határidő",
|
||||
"cleaning": "Tisztítás",
|
||||
"inspection": "Ellenőrzés",
|
||||
"replacement": "Csere",
|
||||
"calibration": "Kalibrálás",
|
||||
"service": "Szerviz",
|
||||
"reading": "Leolvasás",
|
||||
"custom": "Egyéni",
|
||||
"history": "Előzmények",
|
||||
"cost": "Költség",
|
||||
"report_button": "Jelentés",
|
||||
"report_title": "Karbantartási jelentés",
|
||||
"report_generated": "Létrehozva",
|
||||
"report_times_done": "Elvégezve",
|
||||
"report_total_cost": "Összköltség",
|
||||
"report_every": "minden {n}. {unit}",
|
||||
"report_notes": "Megjegyzések",
|
||||
"report_col_type": "Típus",
|
||||
"report_col_status": "Állapot",
|
||||
"report_col_schedule": "Ütemezés",
|
||||
"duration": "Időtartam",
|
||||
"both": "Mindkettő",
|
||||
"trigger_val": "Kiváltó érték",
|
||||
"complete_title": "Elvégzés: ",
|
||||
"checklist": "Ellenőrzőlista",
|
||||
"checklist_steps_optional": "Ellenőrzőlista lépései (opcionális)",
|
||||
"checklist_placeholder": "Szűrő tisztítása\nTömítés cseréje\nNyomáspróba",
|
||||
"checklist_help": "Soronként egy lépés. Legfeljebb 100 elem.",
|
||||
"err_too_long": "{field}: túl hosszú (max. {n} karakter)",
|
||||
"err_too_short": "{field}: túl rövid (min. {n} karakter)",
|
||||
"err_value_too_high": "{field}: túl nagy (max. {n})",
|
||||
"err_value_too_low": "{field}: túl kicsi (min. {n})",
|
||||
"err_required": "{field}: kötelező",
|
||||
"err_wrong_type": "{field}: hibás típus (várt: {type})",
|
||||
"err_invalid_choice": "{field}: nem megengedett érték",
|
||||
"err_invalid_value": "{field}: érvénytelen érték",
|
||||
"feat_schedule_time": "Napszakhoz kötött ütemezés",
|
||||
"feat_schedule_time_desc": "A feladatok nem éjfélkor, hanem egy megadott napszakban válnak lejárttá.",
|
||||
"schedule_time_optional": "Esedékesség időpontja (opcionális, ÓÓ:PP)",
|
||||
"schedule_time_help": "Üres = éjfél (alapértelmezés). HA időzóna.",
|
||||
"at_time": "ekkor:",
|
||||
"notes_optional": "Megjegyzések (opcionális)",
|
||||
"cost_optional": "Költség (opcionális)",
|
||||
"duration_minutes": "Időtartam percben (opcionális)",
|
||||
"days": "nap",
|
||||
"day": "nap",
|
||||
"today": "Ma",
|
||||
"d_overdue": "napja lejárt",
|
||||
"no_tasks": "Még nincsenek karbantartási feladatok. Első lépésként hozzon létre egy objektumot.",
|
||||
"no_tasks_short": "Nincs feladat",
|
||||
"no_history": "Még nincsenek előzmények.",
|
||||
"show_all": "Összes megjelenítése",
|
||||
"cost_duration_chart": "Költség és időtartam",
|
||||
"installed": "Telepítve",
|
||||
"confirm_delete_object": "Törli az objektumot az összes feladatával együtt?",
|
||||
"confirm_delete_task": "Törli ezt a feladatot?",
|
||||
"min": "Min",
|
||||
"max": "Max",
|
||||
"save": "Mentés",
|
||||
"saving": "Mentés…",
|
||||
"edit_task": "Feladat szerkesztése",
|
||||
"new_task": "Új karbantartási feladat",
|
||||
"task_name": "Feladat neve",
|
||||
"maintenance_type": "Karbantartás típusa",
|
||||
"priority": "Prioritás",
|
||||
"labels": "Címkék",
|
||||
"labels_placeholder": "pl. biztonság, szezonális, bérlőnek látható",
|
||||
"labels_help": "Vesszővel elválasztott címkék szűréshez és jelentésekhez.",
|
||||
"priority_low": "Alacsony",
|
||||
"priority_normal": "Normál",
|
||||
"priority_high": "Magas",
|
||||
"schedule_type": "Ütemezés típusa",
|
||||
"interval_days": "Intervallum (nap)",
|
||||
"warning_days": "Figyelmeztetési napok",
|
||||
"earliest_completion_days": "Legkorábbi elvégzés (nappal az esedékesség előtt)",
|
||||
"earliest_completion_days_help": "Hagyja üresen, ha bármikor elvégezhető. 0 = csak az esedékesség napján vagy utána.",
|
||||
"last_performed_optional": "Utoljára elvégezve (opcionális)",
|
||||
"interval_anchor": "Intervallum horgonya",
|
||||
"anchor_completion": "Az elvégzés dátumától",
|
||||
"anchor_planned": "A tervezett dátumtól (nincs csúszás)",
|
||||
"edit_object": "Objektum szerkesztése",
|
||||
"name": "Név",
|
||||
"manufacturer_optional": "Gyártó (opcionális)",
|
||||
"model_optional": "Modell (opcionális)",
|
||||
"serial_number_optional": "Sorozatszám (opcionális)",
|
||||
"serial_number_label": "Sorozatszám",
|
||||
"documentation_url_label": "Kézikönyv",
|
||||
"object_notes_label": "Megjegyzések",
|
||||
"sort_due_date": "Határidő",
|
||||
"sort_object": "Objektum neve",
|
||||
"sort_type": "Típus",
|
||||
"sort_task_name": "Feladat neve",
|
||||
"all_objects": "Minden objektum",
|
||||
"tasks_lower": "feladat",
|
||||
"no_tasks_yet": "Még nincs feladat",
|
||||
"add_first_task": "Első feladat hozzáadása",
|
||||
"trigger_configuration": "Kiváltó beállítása",
|
||||
"entity_id": "Entitásazonosító",
|
||||
"comma_separated": "vesszővel elválasztva",
|
||||
"entity_logic": "Entitáslogika",
|
||||
"entity_logic_any": "Bármely entitás kivált",
|
||||
"entity_logic_all": "Minden entitásnak ki kell váltania",
|
||||
"entities": "entitás",
|
||||
"attribute_optional": "Attribútum (opcionális, üres = állapot)",
|
||||
"use_entity_state": "Entitás állapotának használata (attribútum nélkül)",
|
||||
"trigger_above": "Kiváltás e fölött",
|
||||
"trigger_below": "Kiváltás ez alatt",
|
||||
"for_at_least_minutes": "Legalább ennyi ideig (perc)",
|
||||
"safety_interval_days": "Biztonsági intervallum (nap, opcionális)",
|
||||
"safety_interval": "Biztonsági intervallum (opcionális)",
|
||||
"delta_mode": "Delta mód",
|
||||
"from_state_optional": "Kezdő állapot (opcionális)",
|
||||
"to_state_optional": "Célállapot (opcionális)",
|
||||
"documentation_url_optional": "Dokumentáció URL (opcionális)",
|
||||
"object_notes_optional": "Megjegyzések (opcionális)",
|
||||
"nfc_tag_id_optional": "NFC címke azonosító (opcionális)",
|
||||
"nfc_tags_empty_help": "Még nincs NFC címke regisztrálva a Home Assistantban.",
|
||||
"nfc_tags_open_settings": "Címkebeállítások megnyitása",
|
||||
"nfc_tags_refresh": "Frissítés",
|
||||
"environmental_entity_optional": "Környezeti érzékelő (opcionális)",
|
||||
"environmental_entity_helper": "pl. sensor.outdoor_temperature — a környezeti feltételek alapján igazítja az intervallumot",
|
||||
"environmental_attribute_optional": "Környezeti attribútum (opcionális)",
|
||||
"nfc_tag_id": "NFC címke azonosító",
|
||||
"nfc_linked": "NFC címke hozzárendelve",
|
||||
"nfc_link_hint": "Kattintson az NFC címke hozzárendeléséhez",
|
||||
"responsible_user": "Felelős felhasználó",
|
||||
"shared_with": "Megosztva (rotáció)",
|
||||
"shared_with_help": "Válasszon több személyt a feladat megosztásához; a felelős minden elvégzés után váltakozik.",
|
||||
"rotation_strategy": "Rotáció",
|
||||
"rotation_none": "Nincs rotáció",
|
||||
"rotation_round_robin": "Körforgás",
|
||||
"rotation_least_completed": "Legkevesebbet végezte",
|
||||
"rotation_random": "Véletlenszerű",
|
||||
"no_user_assigned": "(Nincs felhasználó hozzárendelve)",
|
||||
"all_users": "Minden felhasználó",
|
||||
"my_tasks": "Saját feladataim",
|
||||
"tab_calendar": "Naptár",
|
||||
"cal_no_events": "Nincs karbantartás",
|
||||
"cal_window_7": "7 nap",
|
||||
"cal_window_14": "14 nap",
|
||||
"cal_window_30": "30 nap",
|
||||
"cal_window_365": "1 év",
|
||||
"cal_every_n_days": "{n} naponta",
|
||||
"cal_source_time": "Időalapú",
|
||||
"cal_source_time_adaptive": "Időalapú (adaptív)",
|
||||
"cal_source_sensor": "Érzékelőalapú",
|
||||
"cal_predicted": "előrejelzett",
|
||||
"cal_confidence_high": "nagy megbízhatóság",
|
||||
"cal_confidence_medium": "közepes megbízhatóság",
|
||||
"cal_confidence_low": "alacsony megbízhatóság",
|
||||
"budget_monthly": "Havi költségkeret",
|
||||
"budget_yearly": "Éves költségkeret",
|
||||
"groups": "Csoportok",
|
||||
"new_group": "Új csoport",
|
||||
"edit_group": "Csoport szerkesztése",
|
||||
"no_groups": "Még nincsenek csoportok",
|
||||
"delete_group": "Csoport törlése",
|
||||
"delete_group_confirm": "Törli a(z) „{name}” csoportot?",
|
||||
"group_select_tasks": "Feladatok kiválasztása",
|
||||
"group_name_required": "A név megadása kötelező",
|
||||
"description_optional": "Leírás (opcionális)",
|
||||
"selected": "Kiválasztva",
|
||||
"loading_chart": "Diagramadatok betöltése…",
|
||||
"hide_outliers": "Kiugró értékek elrejtése (érzékelőhibák)",
|
||||
"was_maintenance_needed": "Szükség volt erre a karbantartásra?",
|
||||
"feedback_needed": "Szükséges volt",
|
||||
"feedback_not_needed": "Nem volt szükséges",
|
||||
"feedback_not_sure": "Nem biztos",
|
||||
"suggested_interval": "Javasolt intervallum",
|
||||
"apply_suggestion": "Alkalmaz",
|
||||
"reanalyze": "Újraelemzés",
|
||||
"reanalyze_result": "Új elemzés",
|
||||
"reanalyze_insufficient_data": "Nincs elég adat ajánlás készítéséhez",
|
||||
"data_points": "adatpont",
|
||||
"dismiss_suggestion": "Elvetés",
|
||||
"confidence_low": "Alacsony",
|
||||
"confidence_medium": "Közepes",
|
||||
"confidence_high": "Magas",
|
||||
"recommended": "ajánlott",
|
||||
"seasonal_awareness": "Szezonális igazodás",
|
||||
"edit_seasonal_overrides": "Szezonális tényezők szerkesztése",
|
||||
"seasonal_overrides_title": "Szezonális tényezők (felülbírálat)",
|
||||
"seasonal_overrides_hint": "Tényező havonta (0,1–5,0). Üres = automatikusan tanult.",
|
||||
"seasonal_override_invalid": "Érvénytelen érték",
|
||||
"seasonal_override_range": "A tényezőnek 0,1 és 5,0 között kell lennie",
|
||||
"clear_all": "Összes törlése",
|
||||
"seasonal_chart_title": "Szezonális tényezők",
|
||||
"seasonal_learned": "Tanult",
|
||||
"seasonal_manual": "Kézi",
|
||||
"month_jan": "Jan",
|
||||
"month_feb": "Febr",
|
||||
"month_mar": "Márc",
|
||||
"month_apr": "Ápr",
|
||||
"month_may": "Máj",
|
||||
"month_jun": "Jún",
|
||||
"month_jul": "Júl",
|
||||
"month_aug": "Aug",
|
||||
"month_sep": "Szept",
|
||||
"month_oct": "Okt",
|
||||
"month_nov": "Nov",
|
||||
"month_dec": "Dec",
|
||||
"sensor_prediction": "Érzékelő-előrejelzés",
|
||||
"degradation_trend": "Trend",
|
||||
"trend_rising": "Emelkedő",
|
||||
"trend_falling": "Csökkenő",
|
||||
"trend_stable": "Stabil",
|
||||
"trend_insufficient_data": "Nincs elég adat",
|
||||
"days_until_threshold": "Napok a küszöbértékig",
|
||||
"threshold_exceeded": "Küszöbérték túllépve",
|
||||
"environmental_adjustment": "Környezeti tényező",
|
||||
"sensor_prediction_urgency": "Az érzékelő ~{days} napon belül jelzi a küszöbérték elérését",
|
||||
"day_short": "nap",
|
||||
"weibull_reliability_curve": "Megbízhatósági görbe",
|
||||
"weibull_failure_probability": "Meghibásodási valószínűség",
|
||||
"weibull_r_squared": "Illeszkedés R²",
|
||||
"beta_early_failures": "Korai meghibásodások",
|
||||
"beta_random_failures": "Véletlen meghibásodások",
|
||||
"beta_wear_out": "Elhasználódás",
|
||||
"beta_highly_predictable": "Jól előrejelezhető",
|
||||
"confidence_interval": "Konfidenciaintervallum",
|
||||
"confidence_conservative": "Konzervatív",
|
||||
"confidence_aggressive": "Optimista",
|
||||
"current_interval_marker": "Jelenlegi intervallum",
|
||||
"recommended_marker": "Ajánlott",
|
||||
"characteristic_life": "Karakterisztikus élettartam",
|
||||
"chart_mini_sparkline": "Trendvonal",
|
||||
"chart_history": "Költség- és időtartam-előzmények",
|
||||
"chart_seasonal": "Szezonális tényezők, 12 hónap",
|
||||
"chart_weibull": "Weibull megbízhatósági görbe",
|
||||
"chart_sparkline": "Érzékelő kiváltóérték-diagram",
|
||||
"days_progress": "Napok előrehaladása",
|
||||
"qr_code": "QR-kód",
|
||||
"qr_generating": "QR-kód generálása…",
|
||||
"qr_error": "A QR-kód generálása nem sikerült.",
|
||||
"qr_error_no_url": "Nincs HA URL beállítva. Adjon meg külső vagy belső URL-t a Beállítások → Rendszer → Hálózat alatt.",
|
||||
"save_error": "A mentés nem sikerült. Próbálja újra.",
|
||||
"qr_print": "Nyomtatás",
|
||||
"qr_download": "SVG letöltése",
|
||||
"qr_action": "Művelet beolvasáskor",
|
||||
"qr_action_view": "Karbantartási adatok megtekintése",
|
||||
"qr_action_complete": "Karbantartás elvégzettként jelölése",
|
||||
"qr_url_mode": "Hivatkozás típusa",
|
||||
"qr_mode_companion": "Companion alkalmazás",
|
||||
"qr_mode_local": "Helyi (mDNS)",
|
||||
"qr_mode_server": "Szerver URL",
|
||||
"overview": "Áttekintés",
|
||||
"analysis": "Elemzés",
|
||||
"recent_activities": "Legutóbbi tevékenységek",
|
||||
"search_notes": "Keresés a megjegyzésekben",
|
||||
"avg_cost": "Átl. költség",
|
||||
"no_advanced_features": "Nincsenek engedélyezett speciális funkciók",
|
||||
"no_advanced_features_hint": "Az elemzési adatok megjelenítéséhez engedélyezze az „Adaptív ütemezés” vagy a „Szezonális minták” funkciót az integráció beállításaiban.",
|
||||
"analysis_not_enough_data": "Még nincs elég adat az elemzéshez.",
|
||||
"analysis_not_enough_data_hint": "A Weibull-elemzéshez legalább 5 elvégzett karbantartás szükséges; a szezonális minták havi 6+ adatpont után válnak láthatóvá.",
|
||||
"analysis_manual_task_hint": "Az intervallum nélküli kézi feladatok nem termelnek elemzési adatot.",
|
||||
"completions": "elvégzés",
|
||||
"current": "Jelenlegi",
|
||||
"shorter": "Rövidebb",
|
||||
"longer": "Hosszabb",
|
||||
"normal": "Normál",
|
||||
"disabled": "Letiltva",
|
||||
"compound_logic": "Összetett logika",
|
||||
"compound": "Összetett (több feltétel)",
|
||||
"compound_logic_and": "ÉS — minden feltételnek teljesülnie kell",
|
||||
"compound_logic_or": "VAGY — bármely feltétel kivált",
|
||||
"compound_help": "Több érzékelőfeltétel egyetlen kiváltóvá kombinálása.",
|
||||
"compound_no_conditions": "Még nincs feltétel — adjon hozzá legalább egyet.",
|
||||
"compound_add_condition": "Feltétel hozzáadása",
|
||||
"compound_condition": "Feltétel",
|
||||
"compound_remove_condition": "Feltétel eltávolítása",
|
||||
"card_title": "Cím",
|
||||
"card_show_header": "Fejléc megjelenítése statisztikákkal",
|
||||
"card_show_actions": "Műveletgombok megjelenítése",
|
||||
"card_compact": "Kompakt mód",
|
||||
"card_max_items": "Max. elemszám (0 = mind)",
|
||||
"card_filter_status": "Szűrés állapot szerint",
|
||||
"card_filter_status_help": "Üres = minden állapot megjelenik.",
|
||||
"card_filter_objects": "Szűrés objektumok szerint",
|
||||
"card_filter_objects_help": "Üres = minden objektum megjelenik.",
|
||||
"card_filter_entities": "Szűrés entitások szerint (entity_id-k)",
|
||||
"card_filter_entities_help": "Válasszon sensor / binary_sensor entitásokat ebből az integrációból. Üres = mind.",
|
||||
"card_loading_objects": "Objektumok betöltése…",
|
||||
"card_load_error": "Az objektumok betöltése nem sikerült — ellenőrizze a WebSocket-kapcsolatot.",
|
||||
"card_no_tasks_title": "Még nincsenek karbantartási feladatok",
|
||||
"card_no_tasks_cta": "→ Hozzon létre egyet a Karbantartás panelen",
|
||||
"no_objects": "Még nincsenek objektumok.",
|
||||
"action_error": "A művelet nem sikerült. Próbálja újra.",
|
||||
"area_id_optional": "Terület (opcionális)",
|
||||
"installation_date_optional": "Telepítés dátuma (opcionális)",
|
||||
"warranty_expiry_optional": "Garancia lejárta (opcionális)",
|
||||
"warranty": "Garancia",
|
||||
"warranty_valid_until": "érvényes eddig: {date}",
|
||||
"warranty_expires_in": "{days} nap múlva lejár",
|
||||
"warranty_expired": "lejárt",
|
||||
"cal_past_windows": "Korábbi időszakok",
|
||||
"cal_forward_windows": "Jövőbeli időszakok",
|
||||
"history_edit_title": "Előzménybejegyzés szerkesztése",
|
||||
"history_edit_timestamp": "Időbélyeg",
|
||||
"manufacturer": "Gyártó",
|
||||
"model": "Modell",
|
||||
"area": "Terület",
|
||||
"actions": "Műveletek",
|
||||
"view_mode_label": "Nézet",
|
||||
"view_cards": "Kártyanézet",
|
||||
"view_table": "Táblázatnézet",
|
||||
"objects_table_columns_label": "Objektumtáblázat oszlopai",
|
||||
"objects_table_columns_hint": "Válassza ki, mely oszlopok jelenjenek meg az objektumok táblázatnézetében.",
|
||||
"custom_icon_optional": "Ikon (opcionális, pl. mdi:wrench)",
|
||||
"task_enabled": "Feladat engedélyezve",
|
||||
"skip_reason_prompt": "Kihagyja ezt a feladatot?",
|
||||
"reason_optional": "Indoklás (opcionális)",
|
||||
"reset_date_prompt": "Elvégzettként jelöli a feladatot?",
|
||||
"reset_date_optional": "Utolsó elvégzés dátuma (opcionális, alapértelmezés: ma)",
|
||||
"notes_label": "Megjegyzések",
|
||||
"documentation_label": "Dokumentáció",
|
||||
"no_nfc_tag": "— Nincs címke —",
|
||||
"dashboard": "Irányítópult",
|
||||
"tab_today": "Ma",
|
||||
"palette_placeholder": "Objektumok és feladatok keresése…",
|
||||
"palette_no_results": "Nincs találat",
|
||||
"palette_hint": "↑↓ navigálás · Enter megnyitás · Esc bezárás",
|
||||
"today_all_caught_up": "Minden rendben! Ezen a héten nincs esedékes feladat.",
|
||||
"today_overdue": "Lejárt",
|
||||
"today_due_today": "Ma esedékes",
|
||||
"today_this_week": "Ezen a héten",
|
||||
"settings": "Beállítások",
|
||||
"settings_features": "Speciális funkciók",
|
||||
"settings_features_desc": "Speciális funkciók be- és kikapcsolása. A kikapcsolás elrejti őket a felületről, de nem töröl adatot.",
|
||||
"feat_adaptive": "Adaptív ütemezés",
|
||||
"feat_adaptive_desc": "Optimális intervallumok tanulása a karbantartási előzményekből",
|
||||
"feat_predictions": "Érzékelő-előrejelzések",
|
||||
"feat_predictions_desc": "Kiváltási dátumok előrejelzése az érzékelőértékek romlásából",
|
||||
"feat_seasonal": "Szezonális igazítások",
|
||||
"feat_seasonal_desc": "Intervallumok igazítása szezonális minták alapján",
|
||||
"feat_environmental": "Környezeti korreláció",
|
||||
"feat_environmental_desc": "Intervallumok korrelálása hőmérséklettel/páratartalommal",
|
||||
"feat_budget": "Költségkeret követése",
|
||||
"feat_budget_desc": "Havi és éves karbantartási kiadások követése",
|
||||
"feat_groups": "Feladatcsoportok",
|
||||
"feat_groups_desc": "Feladatok logikai csoportokba rendezése",
|
||||
"feat_checklists": "Ellenőrzőlisták",
|
||||
"feat_checklists_desc": "Többlépéses eljárások a feladatok elvégzéséhez",
|
||||
"settings_general": "Általános",
|
||||
"settings_default_warning": "Alapértelmezett figyelmeztetési napok",
|
||||
"settings_panel_enabled": "Oldalsáv-panel",
|
||||
"settings_panel_title": "Oldalsáv-panel címe",
|
||||
"settings_notifications": "Értesítések",
|
||||
"settings_notify_service": "Értesítési szolgáltatás",
|
||||
"test_notification": "Tesztértesítés",
|
||||
"send_test": "Teszt küldése",
|
||||
"testing": "Küldés…",
|
||||
"test_notification_success": "Tesztértesítés elküldve",
|
||||
"test_notification_failed": "A tesztértesítés nem sikerült",
|
||||
"settings_notify_due_soon": "Értesítés, ha hamarosan esedékes",
|
||||
"settings_notify_overdue": "Értesítés lejáratkor",
|
||||
"settings_notify_triggered": "Értesítés kiváltáskor",
|
||||
"settings_interval_hours": "Ismétlési intervallum (óra, 0 = egyszer)",
|
||||
"settings_quiet_hours": "Csendes órák",
|
||||
"settings_quiet_start": "Kezdete",
|
||||
"settings_quiet_end": "Vége",
|
||||
"settings_max_per_day": "Max. értesítés naponta (0 = korlátlan)",
|
||||
"settings_bundling": "Értesítések összevonása",
|
||||
"settings_bundle_threshold": "Összevonási küszöb",
|
||||
"settings_reminder_leads": "Extra emlékeztetők (nappal az esedékesség előtt)",
|
||||
"settings_reminder_leads_hint": "Vesszővel elválasztott napok, pl. 14, 3, 0 — minden egyező napon egy extra emlékeztető megy ki. Üres = kikapcsolva.",
|
||||
"settings_actions": "Mobil műveletgombok",
|
||||
"settings_action_complete": "„Elvégzés” gomb megjelenítése",
|
||||
"settings_action_skip": "„Kihagyás” gomb megjelenítése",
|
||||
"settings_action_snooze": "„Szundi” gomb megjelenítése",
|
||||
"settings_weekly_digest": "Heti összefoglaló",
|
||||
"settings_weekly_digest_hint": "Egyetlen összefoglaló értesítés hétfő reggel, ha vannak esedékes feladatok.",
|
||||
"settings_warranty_reminder": "Garancialejárati emlékeztető",
|
||||
"settings_warranty_reminder_days": "Nappal a lejárat előtt",
|
||||
"settings_warranty_reminder_hint": "Egyszeri értesítés, amikor egy objektum garanciája ennyi napra van a lejárattól.",
|
||||
"settings_snooze_hours": "Szundi időtartama (óra)",
|
||||
"settings_budget": "Költségkeret",
|
||||
"settings_currency": "Pénznem",
|
||||
"settings_budget_monthly": "Havi költségkeret",
|
||||
"settings_budget_yearly": "Éves költségkeret",
|
||||
"settings_budget_alerts": "Költségkeret-riasztások",
|
||||
"settings_budget_threshold": "Riasztási küszöb (%)",
|
||||
"settings_import_export": "Importálás / Exportálás",
|
||||
"settings_export_json": "JSON exportálása",
|
||||
"settings_export_yaml": "YAML exportálása",
|
||||
"settings_export_csv": "CSV exportálása",
|
||||
"settings_import_csv": "CSV importálása",
|
||||
"settings_import_placeholder": "Illessze be ide a JSON vagy CSV tartalmat…",
|
||||
"settings_import_btn": "Importálás",
|
||||
"settings_import_success": "{count} objektum sikeresen importálva.",
|
||||
"settings_export_success": "Export letöltve.",
|
||||
"settings_saved": "Beállítás mentve.",
|
||||
"settings_include_history": "Előzményekkel együtt",
|
||||
"settings_export_selection": "Csak a kiválasztott objektumok (opcionális)",
|
||||
"settings_docs_archive": "Dokumentumarchívum (fájlokkal)",
|
||||
"settings_docs_archive_hint": "A JSON/YAML/CSV export csak a beállításokat tartalmazza. Ez a ZIP a feltöltött fájlok tartalmát is magában foglalja, így a visszaállítás teljes.",
|
||||
"settings_docs_export_btn": "Dokumentum-ZIP letöltése",
|
||||
"settings_docs_import_btn": "Dokumentum-ZIP visszaállítása",
|
||||
"settings_docs_import_success": "Visszaállítva: {blobs} fájl, {docs} dokumentum",
|
||||
"sort_alphabetical": "Ábécésorrend",
|
||||
"sort_due_soonest": "Leghamarabb esedékes",
|
||||
"sort_task_count": "Feladatok száma",
|
||||
"sort_area": "Terület",
|
||||
"sort_assigned_user": "Hozzárendelt felhasználó",
|
||||
"sort_group": "Csoport",
|
||||
"groupby_none": "Nincs csoportosítás",
|
||||
"groupby_area": "Terület szerint",
|
||||
"groupby_group": "Csoport szerint",
|
||||
"groupby_user": "Felhasználó szerint",
|
||||
"filter_label": "Szűrő",
|
||||
"user_label": "Felhasználó",
|
||||
"sort_label": "Rendezés",
|
||||
"group_by_label": "Csoportosítás",
|
||||
"state_value_help": "A HA állapotértékét használja (általában kisbetűs, pl. „on”/„off”). A kis- és nagybetűk mentéskor normalizálódnak.",
|
||||
"target_changes_help": "Az egyező átmenetek száma a kiváltás előtt (alapértelmezés: 1).",
|
||||
"qr_print_title": "QR-kódok nyomtatása",
|
||||
"qr_print_desc": "Nyomtatható oldal QR-kódokkal — vágja ki és ragassza fel a berendezésekre.",
|
||||
"qr_print_load": "Objektumok betöltése",
|
||||
"qr_print_filter": "Szűrő",
|
||||
"qr_print_objects": "Objektumok",
|
||||
"qr_print_actions": "Műveletek",
|
||||
"qr_print_url_mode": "Hivatkozás típusa",
|
||||
"qr_print_estimate": "Becsült QR-kódok száma",
|
||||
"qr_print_over_limit": "a korlát 200, szűkítse a szűrőt",
|
||||
"qr_print_generate": "QR-kódok generálása",
|
||||
"qr_print_generating": "Generálás…",
|
||||
"qr_print_ready": "QR-kódok készen",
|
||||
"qr_print_print_button": "Nyomtatás",
|
||||
"qr_print_empty": "Nincs mit generálni",
|
||||
"qr_action_skip": "Kihagyás",
|
||||
"vacation_title": "Nyaralási mód",
|
||||
"vacation_active": "aktív",
|
||||
"vacation_ended": "véget ért",
|
||||
"vacation_desc": "Tervezzen nyaralást: az értesítések szünetelnek az időszak alatt, plusz egy puffernyi napig. Egyes feladatokat kivételként visszakapcsolhat.",
|
||||
"vacation_enable": "Nyaralási mód bekapcsolása",
|
||||
"vacation_start": "Kezdete",
|
||||
"vacation_end": "Vége",
|
||||
"vacation_buffer": "Puffer (nap)",
|
||||
"vacation_exempt_title": "Értesítés a nyaralás alatt is",
|
||||
"vacation_exempt_desc": "Válassza ki azokat a feladatokat, amelyek a nyaralás alatt is értesítsenek (pl. kritikus medencekémia).",
|
||||
"vacation_load_tasks": "Feladatok betöltése",
|
||||
"vacation_preview_btn": "Előnézet megjelenítése",
|
||||
"vacation_preview_affected": "érintett feladat",
|
||||
"vacation_event_due_soon": "hamarosan esedékessé válik",
|
||||
"vacation_event_overdue": "lejárttá válik",
|
||||
"vacation_event_triggered_est": "érzékelős kiváltás lehetséges",
|
||||
"vacation_sensor_based": "(érzékelőalapú)",
|
||||
"vacation_action_notify": "Értesítsen mégis",
|
||||
"vacation_action_unsilence": "Némítás újra",
|
||||
"vacation_marked_complete": "Elvégzettként jelölve",
|
||||
"vacation_marked_skip": "Kihagyva",
|
||||
"vacation_end_now": "Nyaralás befejezése most",
|
||||
"add": "Hozzáadás",
|
||||
"show_stats": "Statisztikák és grafikonok",
|
||||
"hide_stats": "Statisztikák elrejtése",
|
||||
"adaptive_no_data": "Még nincs elég elvégzési előzmény az adaptív elemzéshez. Végezze el a feladatot még néhányszor az intervallumjavaslatok és a megbízhatósági diagramok feloldásához.",
|
||||
"suggestion_applied": "Javasolt intervallum alkalmazva",
|
||||
"vacation_mode": "Nyaralási mód",
|
||||
"vacation_status_active": "Most aktív",
|
||||
"vacation_status_scheduled": "Ütemezve",
|
||||
"vacation_status_inactive": "Inaktív",
|
||||
"vacation_end_now_confirm": "Azonnal befejezi a nyaralást?",
|
||||
"vacation_exempt_count": "kivétel",
|
||||
"vacation_advanced": "Speciális…",
|
||||
"vacation_open_panel": "Megnyitás a panelen",
|
||||
"enable": "Engedélyezés",
|
||||
"saved": "Mentve",
|
||||
"budget_monthly_set": "Havi keret beállítása",
|
||||
"budget_yearly_set": "Éves keret beállítása",
|
||||
"budget_advanced": "Pénznem, riasztások…",
|
||||
"budget_open_panel": "Megnyitás a panelen",
|
||||
"groups_empty": "Még nincsenek csoportok.",
|
||||
"group_new_placeholder": "Csoport hozzáadása…",
|
||||
"group_delete_confirm": "Törli a(z) „{name}” csoportot?",
|
||||
"groups_manage_tasks": "Feladat-hozzárendelések kezelése…",
|
||||
"groups_open_panel": "Megnyitás a panelen",
|
||||
"unassigned": "Nincs hozzárendelve",
|
||||
"no_area": "Nincs terület",
|
||||
"has_overdue": "Van lejárt feladata",
|
||||
"object": "Objektum",
|
||||
"settings_panel_access": "Panel-hozzáférés",
|
||||
"settings_panel_access_desc": "Az adminok mindig teljes hozzáféréssel rendelkeznek. Ha a létrehozást, szerkesztést és törlést adott nem admin felhasználókra bízná, kapcsolja be ezt, és válassza ki őket lent — mindenki más csak az Elvégzés és a Kihagyás gombot látja.",
|
||||
"settings_operator_write": "A kiválasztott felhasználók létrehozhatnak, szerkeszthetnek és törölhetnek",
|
||||
"settings_operator_write_desc": "Ki: csak adminok módosíthatnak tartalmat. Be: a lent kiválasztott felhasználók is teljes hozzáférést kapnak.",
|
||||
"no_non_admin_users": "Nem található nem admin felhasználó. Vegyen fel néhányat a Beállítások → Személyek alatt.",
|
||||
"owner_label": "Tulajdonos",
|
||||
"feat_completion_actions": "Elvégzési műveletek",
|
||||
"feat_completion_actions_desc": "Feladatonkénti HA művelet elvégzéskor + gyorselvégző QR előre beállított értékekkel.",
|
||||
"on_complete_action_title": "Elvégzéskor: HA művelet indítása (opcionális)",
|
||||
"on_complete_action_desc": "HA szolgáltatást hív meg a feladat elvégzésekor — pl. számláló nullázása az eszközön.",
|
||||
"on_complete_action_service": "Szolgáltatás",
|
||||
"on_complete_action_target": "Cél entitás",
|
||||
"on_complete_action_target_hint": "Megjegyzés: az entitás doménjének egyeznie kell a szolgáltatással — pl. a „button.press” csak button.* entitáson működik, a „counter.increment” csak counter.* entitáson, az „input_button.press” csak input_button.* entitáson stb. Eltérés esetén a művelet csendben meghiúsul (a HA naplóban: „Referenced entities ... missing or not currently available”).",
|
||||
"on_complete_action_data": "Adatok (JSON, opcionális)",
|
||||
"on_complete_action_test": "Konfiguráció ellenőrzése",
|
||||
"on_complete_action_test_success": "✓ A konfiguráció érvényes (a művelet csak a feladat elvégzésekor fut le)",
|
||||
"on_complete_action_test_failed": "Sikertelen",
|
||||
"quick_complete_defaults_title": "Gyorselvégzés alapértékei (QR-beolvasáshoz, opcionális)",
|
||||
"quick_complete_defaults_desc": "Előre beállított értékek a gyorselvégző QR-beolvasásokhoz. Ezek nélkül a QR az elvégzési párbeszédablakot nyitja meg.",
|
||||
"quick_complete_defaults_notes": "Megjegyzések",
|
||||
"quick_complete_defaults_cost": "Költség",
|
||||
"quick_complete_defaults_duration": "Időtartam (perc)",
|
||||
"quick_complete_defaults_feedback_none": "Nincs visszajelzés",
|
||||
"quick_complete_defaults_feedback_needed": "Szükséges volt",
|
||||
"quick_complete_defaults_feedback_not_needed": "Nem volt szükséges",
|
||||
"quick_complete_success": "Gyorsan elvégzettként jelölve",
|
||||
"show_all_objects": "Minden objektum megjelenítése",
|
||||
"show_all_tasks": "Szűrő törlése — minden feladat megjelenítése",
|
||||
"filter_to_overdue": "Szűrés csak a lejárt feladatokra",
|
||||
"filter_to_due_soon": "Szűrés csak a hamarosan esedékes feladatokra",
|
||||
"filter_to_triggered": "Szűrés csak az aktivált feladatokra",
|
||||
"open_task": "Feladat megnyitása",
|
||||
"show_details": "Előzmények és statisztikák",
|
||||
"hide_details": "Részletek elrejtése",
|
||||
"history_empty": "Még nincsenek előzmények.",
|
||||
"history_edit_button": "Bejegyzés szerkesztése",
|
||||
"total_cost": "Összköltség",
|
||||
"times_performed": "Elvégezve",
|
||||
"older_entries": "régebbi",
|
||||
"open_in_panel": "Megnyitás a Karbantartás panelen",
|
||||
"skip_reason": "Kihagyás oka (opcionális)",
|
||||
"reset_to_date": "Utolsó elvégzés visszaállítása erre:",
|
||||
"delete_task_confirm": "Törli a feladatot az előzményeivel együtt?",
|
||||
"delete_object_confirm": "Törli az objektumot az összes feladatával együtt?",
|
||||
"loading": "Betöltés…",
|
||||
"archive": "Archiválás",
|
||||
"undo": "Visszavonás",
|
||||
"task_archived": "Feladat archiválva",
|
||||
"object_archived": "Objektum archiválva",
|
||||
"unarchive": "Archiválás visszavonása",
|
||||
"archived": "Archiválva",
|
||||
"show_archived": "Archiváltak megjelenítése",
|
||||
"hide_archived": "Archiváltak elrejtése",
|
||||
"confirm_archive_object": "Archiválja az objektumot és a feladatait? Megtartják előzményeiket, és később visszaállíthatók.",
|
||||
"settings_archive": "Archiválás és megőrzés",
|
||||
"settings_archive_desc": "Elvégzett egyszeri feladatok kivezetése törlés nélkül. Az archivált elemek rejtettek és inaktívak, de megtartják előzményeiket és költségeiket.",
|
||||
"settings_archive_oneoff_days": "Elvégzett egyszeri feladatok automatikus archiválása ennyi nap után (0 = ki)",
|
||||
"settings_delete_archived_oneoff_days": "Archivált egyszeri feladatok automatikus törlése ennyi nap után (0 = soha)",
|
||||
"archive_object": "Objektum archiválása",
|
||||
"unarchive_object": "Objektum visszaállítása",
|
||||
"documents": "Dokumentumok",
|
||||
"documents_empty": "Még nincsenek dokumentumok.",
|
||||
"doc_upload": "Fájl feltöltése",
|
||||
"doc_uploading": "Feltöltés…",
|
||||
"doc_add_link": "Hivatkozás hozzáadása",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Cím (opcionális)",
|
||||
"doc_open": "Megnyitás",
|
||||
"doc_delete_confirm": "Törli a(z) „{name}” elemet?",
|
||||
"doc_too_large": "A fájl túl nagy (max. 25 MB).",
|
||||
"doc_upload_failed": "A feltöltés nem sikerült.",
|
||||
"completion_photo_optional": "Fotó az elvégzésről (opcionális)",
|
||||
"add_photo": "Fotó hozzáadása",
|
||||
"uploading": "Feltöltés…",
|
||||
"remove": "Eltávolítás",
|
||||
"doc_deduped": "Már máshol is tárolva — megosztott, nem foglal extra helyet.",
|
||||
"doc_dup_in_object": "Ez a fájl már csatolva van ehhez az objektumhoz.",
|
||||
"doc_link_invalid": "Csak http/https hivatkozás engedélyezett.",
|
||||
"doc_cat_manual": "Kézikönyv",
|
||||
"doc_cat_warranty": "Garancia",
|
||||
"doc_cat_invoice": "Számla",
|
||||
"doc_cat_spare_parts": "Pótalkatrészek",
|
||||
"doc_cat_photo": "Fotó",
|
||||
"doc_cat_other": "Egyéb",
|
||||
"doc_link_badge": "Hivatkozás",
|
||||
"doc_storage_title": "Dokumentumtárhely",
|
||||
"doc_storage_saved": "Deduplikációval megtakarítva",
|
||||
"doc_storage_refresh": "Frissítés",
|
||||
"doc_download": "Letöltés",
|
||||
"doc_close": "Bezárás",
|
||||
"doc_camera": "Fotó készítése",
|
||||
"doc_drop_hint": "Húzza ide a fájlokat",
|
||||
"doc_task_none": "Ehhez a feladathoz nincs dokumentum csatolva.",
|
||||
"doc_link_existing": "Dokumentum hozzárendelése…",
|
||||
"doc_attach": "Hozzárendelés",
|
||||
"doc_unlink": "Leválasztás",
|
||||
"doc_page": "Oldal",
|
||||
"chart_range_7d": "7 nap",
|
||||
"chart_range_30d": "30 nap",
|
||||
"chart_range_90d": "90 nap",
|
||||
"chart_range_1y": "1 év",
|
||||
"chart_since_service": "az utolsó szerviz óta",
|
||||
"chart_no_stats": "Nincs hosszú távú statisztika ehhez az entitáshoz — csak a karbantartási események értékei láthatók",
|
||||
"auto_complete_on_recovery": "Automatikus elvégzés, ha az érzékelő helyreáll",
|
||||
"auto_complete_on_recovery_help": "Elvégzést rögzít (beállítja az utolsó elvégzést), amikor a kiváltás magától megszűnik — pl. só utántöltve, szűrő kicserélve.",
|
||||
"doc_search": "Dokumentumok keresése…",
|
||||
"doc_search_none": "Nincs egyező dokumentum",
|
||||
"link_device_optional": "Meglévő eszközhöz kapcsolás (opcionális)",
|
||||
"parent_object_optional": "Szülőobjektum (opcionális)",
|
||||
"parent_none": "(Nincs szülő)",
|
||||
"paused": "Szüneteltetve",
|
||||
"pause_object": "Szüneteltetés",
|
||||
"resume_object": "Folytatás",
|
||||
"pause_until_prompt": "Az objektum ütemezéseinek befagyasztása — semmi nem válik esedékessé, és nincs értesítés a folytatásig. Megadhat automatikus folytatási dátumot is.",
|
||||
"pause_until_label": "Folytatás ekkor (opcionális)",
|
||||
"object_paused": "Objektum szüneteltetve",
|
||||
"object_resumed": "Objektum folytatva — az ütemezések újraindultak",
|
||||
"object_paused_badge": "Szüneteltetve",
|
||||
"paused_until_label": "eddig:",
|
||||
"replace_object": "Csere…",
|
||||
"replace_object_prompt": "Az objektum kivezetése és utód létrehozása. Az előzmények és a költségek archiválva a régin maradnak; a feladatok és a dokumentumok átkerülnek az újra, a számlálók nulláról indulnak.",
|
||||
"replace_name_label": "Utód neve",
|
||||
"object_replaced": "Objektum lecserélve — utód létrehozva",
|
||||
"reading_unit_label": "Leolvasás mértékegysége (pl. kWh, m³)",
|
||||
"reading_unit_help": "A rögzített érték mellett jelenik meg a feladat elvégzésekor.",
|
||||
"reading_value_label": "Leolvasott érték",
|
||||
"reading_label": "Leolvasás",
|
||||
"settings_templates_label": "Sablongaléria",
|
||||
"settings_templates_hint": "Vegye ki a pipát a sosem használt sablonoknál — így eltűnnek a „Sablonból” választókból (panel és konfigurációs folyamat). Semmi más nem változik; bármikor újra engedélyezheti őket.",
|
||||
"worksheet": "Munkalap",
|
||||
"worksheet_scan_view": "Olvassa be a feladat megnyitásához",
|
||||
"worksheet_scan_complete": "Olvassa be az elvégzéshez",
|
||||
"worksheet_manual_excerpt": "Kézikönyv-részlet",
|
||||
"worksheet_pages": "oldal",
|
||||
"worksheet_printed": "Nyomtatva",
|
||||
"worksheet_never": "Soha",
|
||||
"card_all_caught_up": "Minden rendben — semmi nem igényel figyelmet",
|
||||
"postpone": "Halasztás",
|
||||
"postpone_date_prompt": "Melyik dátumra halasztja ezt az alkalmat?",
|
||||
"postpone_date_label": "Új határidő",
|
||||
"postponed": "Elhalasztva",
|
||||
"postponed_to": "Elhalasztva erre:",
|
||||
"season_window_label": "Szezonális időablak (hónapok)",
|
||||
"season_window_hint": "Csak a kiválasztott hónapokban esedékes; a szezonon kívüli dátumok a következő aktív hónapra tolódnak. Nincs = egész évben.",
|
||||
"series_end_label": "Befejeződik",
|
||||
"series_end_never": "Soha (végtelen ismétlés)",
|
||||
"series_end_after_count": "Adott számú alkalom után",
|
||||
"series_end_until": "Egy adott dátumon",
|
||||
"series_end_count_label": "Alkalmak száma",
|
||||
"series_end_until_label": "Befejezés dátuma",
|
||||
"parts_section": "Alkatrészek és fogyóeszközök",
|
||||
"part_add": "Alkatrész hozzáadása",
|
||||
"part_name": "Név",
|
||||
"part_vendor": "Gyártó",
|
||||
"part_storage_location": "Tárolási hely",
|
||||
"part_product_url": "Termék URL",
|
||||
"part_unit": "Egység",
|
||||
"part_cost": "Egységár",
|
||||
"part_stock": "Készlet",
|
||||
"part_reorder_threshold": "Újrarendelés ennél",
|
||||
"part_restock_quantity": "Feltöltési mennyiség",
|
||||
"part_auto_buy": "Vásárlási feladat automatikus létrehozása, ha kevés van",
|
||||
"part_restock": "Készlet módosítása",
|
||||
"restock_quantity_label": "Vásárolt mennyiség",
|
||||
"consumes_parts_label": "Felhasznált alkatrészek",
|
||||
"parts_load_failed": "Az objektum alkatrészei nem tölthetők be — a felhasznált alkatrészek beállításai most nem érhetők el.",
|
||||
"adopt_problem_button": "Problémaérzékelők átvétele",
|
||||
"adopt_problem_title": "Problémaérzékelők átvétele",
|
||||
"adopt_problem_hint": "Alakítsa a HA problémaérzékelőit (nyomtatóhibák, szűrőfigyelmeztetések, gyenge elem) karbantartási feladatokká, amelyek a probléma fennállása alatt aktívak, és maguktól lezáródnak, amikor a probléma megoldódik.",
|
||||
"adopt_problem_none": "Nem található még nem követett problémaérzékelő.",
|
||||
"adopt_problem_active": "aktív",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(új)",
|
||||
"adopt_problem_adopt": "Kijelöltek átvétele",
|
||||
"adopt_problem_done": "{tasks} problémaérzékelő átvéve",
|
||||
"views_label": "Nézetek",
|
||||
"views_none": "— Nincs nézet —",
|
||||
"views_manage": "Nézetek mentése / kezelése",
|
||||
"views_dialog_title": "Mentett nézetek",
|
||||
"views_dialog_hint": "Mentse el az aktuális szűrőket névvel ellátott nézetként, amelyet mindenki használhat.",
|
||||
"views_name_placeholder": "Nézet neve",
|
||||
"views_save_current": "Aktuális szűrők mentése",
|
||||
"views_none_yet": "Még nincsenek mentett nézetek.",
|
||||
"close": "Bezárás",
|
||||
"trigger_hint_now": "Az érzékelő jelenlegi értéke: {value}.",
|
||||
"trigger_hint_above": "A feladat akkor aktiválódik, amikor az érték {target} fölé emelkedik.",
|
||||
"trigger_hint_below": "Akkor aktiválódik, amikor az érték {target} alá csökken.",
|
||||
"trigger_hint_counter_delta": "A jelenlegi értéktől ({value}) számol: esedékes {due} értéknél (+{target}), és a számlálás minden elvégzés után újraindul.",
|
||||
"trigger_hint_counter_delta_edit": "A legutóbbi elvégzés óta számolja a használatot: esedékes +{target} után; a számlálás minden elvégzés után újraindul.",
|
||||
"trigger_hint_counter_abs": "A feladat akkor válik esedékessé, amikor az érzékelő eléri a(z) {target} értéket.",
|
||||
"trigger_hint_runtime": "A feladat {hours} óra összesített üzemidő után válik esedékessé; a számláló minden elvégzés után újraindul.",
|
||||
"trigger_hint_state_change": "A feladat {count} állapotváltozás után válik esedékessé.",
|
||||
"trigger_hint_state_change_to": "A feladat {count} alkalommal „{state}” állapotra váltás után válik esedékessé.",
|
||||
"trigger_hint_state_now": "Jelenlegi állapot: {value}.",
|
||||
"adopt_problem_part": "Alkatrészt használ: {name}",
|
||||
"label_filter": "Címke",
|
||||
"all_labels": "Minden címke",
|
||||
"settings_notify_scope": "Értesítés csak erre a nézetre",
|
||||
"settings_notify_scope_all": "Minden feladat",
|
||||
"settings_notify_scope_hint": "Csak a kiválasztott mentett nézet címke-/felhasználószűrőinek megfelelő feladatok küldenek emlékeztetőt. A nézet állapot-, rendezési és csoportosítási beállításait itt figyelmen kívül hagyjuk.",
|
||||
"card_saved_view": "Mentett nézet",
|
||||
"card_saved_view_none": "Nincs",
|
||||
"card_saved_view_help": "A nézet állapot-, felhasználó- és címkeszűrőit a fenti szűrőkön felül alkalmazza. A nézet rendezése és csoportosítása a panel megjelenítési beállítása, a kártyán nem érvényesül.",
|
||||
"doc_part_none": "Ehhez az alkatrészhez nincs dokumentum csatolva.",
|
||||
"settings_templates_toggle_group": "A csoport összes sablonjának be- vagy kikapcsolása",
|
||||
"setups_button": "Javasolt beállítások",
|
||||
"setups_title": "Javasolt beállítások (béta)",
|
||||
"setups_hint": "Támogatott integrációk eszközei, amelyek fogyóeszköz-érzékelői karbantartási feladatokat vezérelhetnek. Az átvétel létrehozza az objektumot, és minden feladatot az érzékelőjéhez köt — a feladat akkor aktiválódik, amikor a fogyóeszköz fogytán van, és a csere után magától lezáródik.",
|
||||
"setups_none": "Nem található támogatott eszköz bekötetlen fogyóeszköz-érzékelővel.",
|
||||
"setups_adopt": "Kijelöltek beállítása",
|
||||
"setups_done": "{tasks} érzékelőhöz kötött feladat létrehozva.",
|
||||
"complete_parts_used": "Most felhasznált alkatrészek",
|
||||
"part_delete_confirm": "Törli a(z) „{name}” alkatrészt? A készletkövetése, a feladatkapcsolatai és minden nyitott vásárlási emlékeztetője is törlődik.",
|
||||
"baseline_start_value": "Kezdő leolvasás (opcionális)",
|
||||
"baseline_start_help": "A számlálás ettől az értéktől indul. Hagyja üresen, ha a jelenlegi értéktől számolna; adja meg az utolsó szerviz értékét, hogy az azóta felhalmozott használat is beleszámítson.",
|
||||
"setups_baseline_hint": "érték az utolsó szerviznél (opcionális)",
|
||||
"baseline_start_help_edit": "Üresen hagyva a meglévő számlálás marad. Érték megadása újrahorgonyozza a számlálást (pl. az utolsó szerviz leolvasott értéke).",
|
||||
"baseline_current_effective": "Jelenleg érvényes kezdőérték: {value}",
|
||||
"runtime_on_states": "Aktív állapotok (vesszővel elválasztva)",
|
||||
"runtime_on_states_help": "Működésként számító állapotok — alapértelmezés: on. Pl. mowing, cleaning, printing. Attribútum kiválasztásakor annak értékei számítanak.",
|
||||
"setups_target_new": "Új létrehozása: {name}",
|
||||
"schedule_preview_title": "Következő dátumok",
|
||||
"schedule_preview_ontime": "Időben történő elvégzést feltételezve.",
|
||||
"schedule_preview_ends": "(a sorozat véget ér)",
|
||||
"adopt_problem_responsible": "Felelős felhasználó az összes átvett feladathoz (opcionális)",
|
||||
"adopt_problem_configure": "Beállítás",
|
||||
"history_auto": "Automatikus",
|
||||
"battery_fleet_title": "Elemflotta",
|
||||
"battery_fleet_none_low": "Minden elem rendben — nincs mit cserélni.",
|
||||
"battery_fleet_buy_now": "Vásárlás most",
|
||||
"battery_fleet_soon": "Hamarosan szükséges",
|
||||
"battery_fleet_soon_hint": "Az utolsó cseredátumból előrejelezve — rendeljen előre.",
|
||||
"battery_fleet_mark_all": "Mind cseréltként jelölése",
|
||||
"battery_fleet_mark_one": "Elem cseréltként jelölése",
|
||||
"battery_fleet_offline": "offline",
|
||||
"battery_fleet_trigger_lost": "A feladat érzékelős kiváltója elveszett — nem fog aktiválódni és automatikusan lezáródni sem.",
|
||||
"battery_fleet_repair": "Javítás",
|
||||
"battery_fleet_exclude": "Kizárás a flottából",
|
||||
"battery_fleet_excluded": "Kizárva",
|
||||
"battery_fleet_include": "Követés újra",
|
||||
"battery_fleet_total": "{n} elem követve",
|
||||
"battery_fleet_setup_button": "Elemflotta",
|
||||
"battery_fleet_setup_done": "Elemflotta beállítva — egyetlen feladat követi az összes elemet.",
|
||||
"update_banner": "A Maintenance Supporter újabb verziója érhető el a szerveren — töltse újra az oldalt a panel frissítéséhez.",
|
||||
"update_reload": "Újratöltés"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "유지보수",
|
||||
"objects": "객체",
|
||||
"tasks": "작업",
|
||||
"overdue": "기한 초과",
|
||||
"due_soon": "기한 임박",
|
||||
"triggered": "트리거됨",
|
||||
"trigger_replaced": "트리거 교체됨",
|
||||
"ok": "정상",
|
||||
"all": "전체",
|
||||
"new_object": "+ 새 객체",
|
||||
"templates_from": "템플릿에서",
|
||||
"templates_title": "템플릿으로 시작하기",
|
||||
"templates_task_count": "작업 {n}개",
|
||||
"template_created": "템플릿에서 생성됨",
|
||||
"onboard_hint": "첫 객체를 추가하여 유지보수 추적을 시작하세요.",
|
||||
"edit": "편집",
|
||||
"duplicate": "복제",
|
||||
"task_duplicated": "작업이 복제되었습니다",
|
||||
"object_duplicated": "객체가 복제되었습니다",
|
||||
"delete": "삭제",
|
||||
"add_task": "+ 작업 추가",
|
||||
"complete": "완료",
|
||||
"completed": "완료됨",
|
||||
"skip": "건너뛰기",
|
||||
"skipped": "건너뜀",
|
||||
"missed": "놓침",
|
||||
"reset": "초기화",
|
||||
"snooze": "다시 알림",
|
||||
"snoozed": "다시 알림 설정됨",
|
||||
"cancel": "취소",
|
||||
"bulk_select": "선택",
|
||||
"bulk_select_all": "모두 선택",
|
||||
"bulk_n_selected": "{n}개 선택됨",
|
||||
"bulk_completed": "작업 {n}개 완료됨",
|
||||
"bulk_archived": "작업 {n}개 보관됨",
|
||||
"completing": "완료 처리 중…",
|
||||
"interval": "주기",
|
||||
"warning": "경고",
|
||||
"last_performed": "마지막 수행일",
|
||||
"next_due": "다음 예정일",
|
||||
"days_until_due": "남은 일수",
|
||||
"avg_duration": "평균 소요 시간",
|
||||
"trigger": "트리거",
|
||||
"trigger_type": "트리거 유형",
|
||||
"threshold_above": "상한",
|
||||
"threshold_below": "하한",
|
||||
"threshold": "임계값",
|
||||
"counter": "카운터",
|
||||
"state_change": "상태 변경",
|
||||
"runtime": "가동 시간",
|
||||
"runtime_hours": "목표 가동 시간 (시간)",
|
||||
"target_value": "목표값",
|
||||
"baseline": "기준값",
|
||||
"target_changes": "목표 변경 횟수",
|
||||
"for_minutes": "지속 시간 (분)",
|
||||
"time_based": "시간 기반",
|
||||
"sensor_based": "센서 기반",
|
||||
"manual": "수동",
|
||||
"one_time": "일회성",
|
||||
"weekdays": "요일",
|
||||
"nth_weekday": "매월 N번째 요일",
|
||||
"day_of_month": "매월 특정 일",
|
||||
"recurrence_on_days": "반복 요일",
|
||||
"recurrence_occurrence": "회차",
|
||||
"recurrence_weekday": "요일",
|
||||
"recurrence_day": "일 (1–31)",
|
||||
"recurrence_last_day": "매월 마지막 날",
|
||||
"recurrence_business_day": "평일만 (주말이면 앞당김)",
|
||||
"recurrence_offset": "오프셋 (일, ±)",
|
||||
"recurrence_offset_help": "날짜를 ±N일 이동합니다. 예: -2 = 이틀 전.",
|
||||
"last_day_month": "매월 마지막 날",
|
||||
"last_business_day_month": "마지막 평일",
|
||||
"ord_1": "첫째",
|
||||
"ord_2": "둘째",
|
||||
"ord_3": "셋째",
|
||||
"ord_4": "넷째",
|
||||
"ord_5": "다섯째",
|
||||
"ord_last": "마지막",
|
||||
"day_word": "일",
|
||||
"interval_value": "주기",
|
||||
"interval_unit": "단위",
|
||||
"unit_days": "일",
|
||||
"unit_weeks": "주",
|
||||
"unit_months": "개월",
|
||||
"unit_years": "년",
|
||||
"due_date": "예정일",
|
||||
"cleaning": "청소",
|
||||
"inspection": "점검",
|
||||
"replacement": "교체",
|
||||
"calibration": "보정",
|
||||
"service": "정비",
|
||||
"reading": "검침",
|
||||
"custom": "사용자 지정",
|
||||
"history": "기록",
|
||||
"cost": "비용",
|
||||
"report_button": "보고서",
|
||||
"report_title": "유지보수 보고서",
|
||||
"report_generated": "생성일",
|
||||
"report_times_done": "수행 횟수",
|
||||
"report_total_cost": "총 비용",
|
||||
"report_every": "{n} {unit}마다",
|
||||
"report_notes": "메모",
|
||||
"report_col_type": "유형",
|
||||
"report_col_status": "상태",
|
||||
"report_col_schedule": "일정",
|
||||
"duration": "소요 시간",
|
||||
"both": "둘 다",
|
||||
"trigger_val": "트리거 값",
|
||||
"complete_title": "완료: ",
|
||||
"checklist": "체크리스트",
|
||||
"checklist_steps_optional": "체크리스트 단계 (선택)",
|
||||
"checklist_placeholder": "필터 청소\n씰 교체\n압력 테스트",
|
||||
"checklist_help": "한 줄에 한 단계씩 입력하세요. 최대 100개.",
|
||||
"err_too_long": "{field}: 너무 깁니다 (최대 {n}자)",
|
||||
"err_too_short": "{field}: 너무 짧습니다 (최소 {n}자)",
|
||||
"err_value_too_high": "{field}: 너무 큽니다 (최대 {n})",
|
||||
"err_value_too_low": "{field}: 너무 작습니다 (최소 {n})",
|
||||
"err_required": "{field}: 필수 항목입니다",
|
||||
"err_wrong_type": "{field}: 잘못된 형식입니다 (예상: {type})",
|
||||
"err_invalid_choice": "{field}: 허용되지 않는 값입니다",
|
||||
"err_invalid_value": "{field}: 유효하지 않은 값입니다",
|
||||
"feat_schedule_time": "시각 지정 일정",
|
||||
"feat_schedule_time_desc": "작업이 자정이 아닌 지정한 시각에 기한 초과로 전환됩니다.",
|
||||
"schedule_time_optional": "기한 시각 (선택, HH:MM)",
|
||||
"schedule_time_help": "비워두면 자정(기본값)입니다. HA 시간대 기준.",
|
||||
"at_time": "시각",
|
||||
"notes_optional": "메모 (선택)",
|
||||
"cost_optional": "비용 (선택)",
|
||||
"duration_minutes": "소요 시간(분, 선택)",
|
||||
"days": "일",
|
||||
"day": "일",
|
||||
"today": "오늘",
|
||||
"d_overdue": "일 초과",
|
||||
"no_tasks": "아직 유지보수 작업이 없습니다. 객체를 만들어 시작하세요.",
|
||||
"no_tasks_short": "작업 없음",
|
||||
"no_history": "아직 기록이 없습니다.",
|
||||
"show_all": "모두 보기",
|
||||
"cost_duration_chart": "비용 및 소요 시간",
|
||||
"installed": "설치일",
|
||||
"confirm_delete_object": "이 객체와 모든 작업을 삭제할까요?",
|
||||
"confirm_delete_task": "이 작업을 삭제할까요?",
|
||||
"min": "최소",
|
||||
"max": "최대",
|
||||
"save": "저장",
|
||||
"saving": "저장 중…",
|
||||
"edit_task": "작업 편집",
|
||||
"new_task": "새 유지보수 작업",
|
||||
"task_name": "작업 이름",
|
||||
"maintenance_type": "유지보수 유형",
|
||||
"priority": "우선순위",
|
||||
"labels": "라벨",
|
||||
"labels_placeholder": "예: 안전, 계절, 세입자용",
|
||||
"labels_help": "필터링과 보고서에 쓰이는 쉼표로 구분된 태그입니다.",
|
||||
"priority_low": "낮음",
|
||||
"priority_normal": "보통",
|
||||
"priority_high": "높음",
|
||||
"schedule_type": "일정 유형",
|
||||
"interval_days": "주기 (일)",
|
||||
"warning_days": "경고 일수",
|
||||
"earliest_completion_days": "조기 완료 허용 (기한 전 일수)",
|
||||
"earliest_completion_days_help": "비워두면 언제든 완료할 수 있습니다. 0 = 기한 당일 이후에만.",
|
||||
"last_performed_optional": "마지막 수행일 (선택)",
|
||||
"interval_anchor": "주기 기준",
|
||||
"anchor_completion": "완료일 기준",
|
||||
"anchor_planned": "예정일 기준 (밀림 없음)",
|
||||
"edit_object": "객체 편집",
|
||||
"name": "이름",
|
||||
"manufacturer_optional": "제조사 (선택)",
|
||||
"model_optional": "모델 (선택)",
|
||||
"serial_number_optional": "일련번호 (선택)",
|
||||
"serial_number_label": "일련번호",
|
||||
"documentation_url_label": "설명서",
|
||||
"object_notes_label": "메모",
|
||||
"sort_due_date": "예정일",
|
||||
"sort_object": "객체 이름",
|
||||
"sort_type": "유형",
|
||||
"sort_task_name": "작업 이름",
|
||||
"all_objects": "모든 객체",
|
||||
"tasks_lower": "작업",
|
||||
"no_tasks_yet": "아직 작업 없음",
|
||||
"add_first_task": "첫 작업 추가",
|
||||
"trigger_configuration": "트리거 설정",
|
||||
"entity_id": "엔티티 ID",
|
||||
"comma_separated": "쉼표로 구분",
|
||||
"entity_logic": "엔티티 논리",
|
||||
"entity_logic_any": "하나라도 트리거되면",
|
||||
"entity_logic_all": "모든 엔티티가 트리거되어야 함",
|
||||
"entities": "엔티티",
|
||||
"attribute_optional": "속성 (선택, 비우면 상태 사용)",
|
||||
"use_entity_state": "엔티티 상태 사용 (속성 없음)",
|
||||
"trigger_above": "초과 시 트리거",
|
||||
"trigger_below": "미만 시 트리거",
|
||||
"for_at_least_minutes": "최소 지속 시간 (분)",
|
||||
"safety_interval_days": "안전 주기 (일, 선택)",
|
||||
"safety_interval": "안전 주기 (선택)",
|
||||
"delta_mode": "델타 모드",
|
||||
"from_state_optional": "변경 전 상태 (선택)",
|
||||
"to_state_optional": "변경 후 상태 (선택)",
|
||||
"documentation_url_optional": "설명서 URL (선택)",
|
||||
"object_notes_optional": "메모 (선택)",
|
||||
"nfc_tag_id_optional": "NFC 태그 ID (선택)",
|
||||
"nfc_tags_empty_help": "Home Assistant에 등록된 NFC 태그가 아직 없습니다.",
|
||||
"nfc_tags_open_settings": "태그 설정 열기",
|
||||
"nfc_tags_refresh": "새로 고침",
|
||||
"environmental_entity_optional": "환경 센서 (선택)",
|
||||
"environmental_entity_helper": "예: sensor.outdoor_temperature — 환경 조건에 따라 주기를 조정합니다",
|
||||
"environmental_attribute_optional": "환경 속성 (선택)",
|
||||
"nfc_tag_id": "NFC 태그 ID",
|
||||
"nfc_linked": "NFC 태그 연결됨",
|
||||
"nfc_link_hint": "클릭하여 NFC 태그 연결",
|
||||
"responsible_user": "담당자",
|
||||
"shared_with": "공유 대상 (순환 담당)",
|
||||
"shared_with_help": "여러 명을 선택해 작업을 공유하세요. 완료할 때마다 담당자가 교대됩니다.",
|
||||
"rotation_strategy": "교대 방식",
|
||||
"rotation_none": "교대 없음",
|
||||
"rotation_round_robin": "순서대로",
|
||||
"rotation_least_completed": "완료 횟수가 적은 사람",
|
||||
"rotation_random": "무작위",
|
||||
"no_user_assigned": "(담당자 없음)",
|
||||
"all_users": "모든 사용자",
|
||||
"my_tasks": "내 작업",
|
||||
"tab_calendar": "캘린더",
|
||||
"cal_no_events": "유지보수 없음",
|
||||
"cal_window_7": "7일",
|
||||
"cal_window_14": "14일",
|
||||
"cal_window_30": "30일",
|
||||
"cal_window_365": "1년",
|
||||
"cal_every_n_days": "{n}일마다",
|
||||
"cal_source_time": "시간 기반",
|
||||
"cal_source_time_adaptive": "시간 기반 (적응형)",
|
||||
"cal_source_sensor": "센서 기반",
|
||||
"cal_predicted": "예측됨",
|
||||
"cal_confidence_high": "높은 신뢰도",
|
||||
"cal_confidence_medium": "중간 신뢰도",
|
||||
"cal_confidence_low": "낮은 신뢰도",
|
||||
"budget_monthly": "월 예산",
|
||||
"budget_yearly": "연 예산",
|
||||
"groups": "그룹",
|
||||
"new_group": "새 그룹",
|
||||
"edit_group": "그룹 편집",
|
||||
"no_groups": "아직 그룹 없음",
|
||||
"delete_group": "그룹 삭제",
|
||||
"delete_group_confirm": "'{name}' 그룹을 삭제할까요?",
|
||||
"group_select_tasks": "작업 선택",
|
||||
"group_name_required": "이름은 필수입니다",
|
||||
"description_optional": "설명 (선택)",
|
||||
"selected": "선택됨",
|
||||
"loading_chart": "차트 데이터 불러오는 중...",
|
||||
"hide_outliers": "이상값 숨기기 (센서 오류)",
|
||||
"was_maintenance_needed": "이 유지보수가 필요했나요?",
|
||||
"feedback_needed": "필요했음",
|
||||
"feedback_not_needed": "불필요했음",
|
||||
"feedback_not_sure": "잘 모름",
|
||||
"suggested_interval": "제안 주기",
|
||||
"apply_suggestion": "적용",
|
||||
"reanalyze": "재분석",
|
||||
"reanalyze_result": "새 분석 결과",
|
||||
"reanalyze_insufficient_data": "권장값을 산출하기에 데이터가 부족합니다",
|
||||
"data_points": "데이터 포인트",
|
||||
"dismiss_suggestion": "무시",
|
||||
"confidence_low": "낮음",
|
||||
"confidence_medium": "중간",
|
||||
"confidence_high": "높음",
|
||||
"recommended": "권장",
|
||||
"seasonal_awareness": "계절 인식",
|
||||
"edit_seasonal_overrides": "계절 계수 편집",
|
||||
"seasonal_overrides_title": "계절 계수 (수동 설정)",
|
||||
"seasonal_overrides_hint": "월별 계수 (0.1–5.0). 비워두면 자동으로 학습됩니다.",
|
||||
"seasonal_override_invalid": "유효하지 않은 값",
|
||||
"seasonal_override_range": "계수는 0.1에서 5.0 사이여야 합니다",
|
||||
"clear_all": "모두 지우기",
|
||||
"seasonal_chart_title": "계절 계수",
|
||||
"seasonal_learned": "학습됨",
|
||||
"seasonal_manual": "수동",
|
||||
"month_jan": "1월",
|
||||
"month_feb": "2월",
|
||||
"month_mar": "3월",
|
||||
"month_apr": "4월",
|
||||
"month_may": "5월",
|
||||
"month_jun": "6월",
|
||||
"month_jul": "7월",
|
||||
"month_aug": "8월",
|
||||
"month_sep": "9월",
|
||||
"month_oct": "10월",
|
||||
"month_nov": "11월",
|
||||
"month_dec": "12월",
|
||||
"sensor_prediction": "센서 예측",
|
||||
"degradation_trend": "추세",
|
||||
"trend_rising": "상승",
|
||||
"trend_falling": "하강",
|
||||
"trend_stable": "안정",
|
||||
"trend_insufficient_data": "데이터 부족",
|
||||
"days_until_threshold": "임계값까지 남은 일수",
|
||||
"threshold_exceeded": "임계값 초과",
|
||||
"environmental_adjustment": "환경 계수",
|
||||
"sensor_prediction_urgency": "센서 예측: 약 {days}일 후 임계값 도달",
|
||||
"day_short": "일",
|
||||
"weibull_reliability_curve": "신뢰도 곡선",
|
||||
"weibull_failure_probability": "고장 확률",
|
||||
"weibull_r_squared": "적합도 R²",
|
||||
"beta_early_failures": "초기 고장",
|
||||
"beta_random_failures": "무작위 고장",
|
||||
"beta_wear_out": "마모 고장",
|
||||
"beta_highly_predictable": "매우 예측 가능",
|
||||
"confidence_interval": "신뢰 구간",
|
||||
"confidence_conservative": "보수적",
|
||||
"confidence_aggressive": "낙관적",
|
||||
"current_interval_marker": "현재 주기",
|
||||
"recommended_marker": "권장",
|
||||
"characteristic_life": "특성 수명",
|
||||
"chart_mini_sparkline": "추세 스파크라인",
|
||||
"chart_history": "비용 및 소요 시간 기록",
|
||||
"chart_seasonal": "계절 계수, 12개월",
|
||||
"chart_weibull": "Weibull 신뢰도 곡선",
|
||||
"chart_sparkline": "센서 트리거 값 차트",
|
||||
"days_progress": "일수 진행률",
|
||||
"qr_code": "QR 코드",
|
||||
"qr_generating": "QR 코드 생성 중…",
|
||||
"qr_error": "QR 코드 생성에 실패했습니다.",
|
||||
"qr_error_no_url": "설정된 HA URL이 없습니다. 설정 → 시스템 → 네트워크에서 외부 또는 내부 URL을 설정해 주세요.",
|
||||
"save_error": "저장에 실패했습니다. 다시 시도해 주세요.",
|
||||
"qr_print": "인쇄",
|
||||
"qr_download": "SVG 다운로드",
|
||||
"qr_action": "스캔 시 동작",
|
||||
"qr_action_view": "유지보수 정보 보기",
|
||||
"qr_action_complete": "유지보수 완료로 표시",
|
||||
"qr_url_mode": "링크 유형",
|
||||
"qr_mode_companion": "Companion 앱",
|
||||
"qr_mode_local": "로컬 (mDNS)",
|
||||
"qr_mode_server": "서버 URL",
|
||||
"overview": "개요",
|
||||
"analysis": "분석",
|
||||
"recent_activities": "최근 활동",
|
||||
"search_notes": "메모 검색",
|
||||
"avg_cost": "평균 비용",
|
||||
"no_advanced_features": "활성화된 고급 기능 없음",
|
||||
"no_advanced_features_hint": "통합구성요소 설정에서 “적응형 일정” 또는 “계절 패턴”을 활성화하면 여기에서 분석 데이터를 볼 수 있습니다.",
|
||||
"analysis_not_enough_data": "아직 분석할 데이터가 충분하지 않습니다.",
|
||||
"analysis_not_enough_data_hint": "Weibull 분석에는 최소 5회의 완료 기록이 필요하며, 계절 패턴은 월별 6개 이상의 데이터 포인트가 쌓이면 표시됩니다.",
|
||||
"analysis_manual_task_hint": "주기가 없는 수동 작업은 분석 데이터를 생성하지 않습니다.",
|
||||
"completions": "회 완료",
|
||||
"current": "현재",
|
||||
"shorter": "더 짧게",
|
||||
"longer": "더 길게",
|
||||
"normal": "보통",
|
||||
"disabled": "비활성화됨",
|
||||
"compound_logic": "복합 논리",
|
||||
"compound": "복합 (여러 조건)",
|
||||
"compound_logic_and": "AND — 모든 조건이 트리거되어야 함",
|
||||
"compound_logic_or": "OR — 하나의 조건만 트리거되면 됨",
|
||||
"compound_help": "여러 센서 조건을 하나의 트리거로 결합합니다.",
|
||||
"compound_no_conditions": "아직 조건이 없습니다 — 최소 하나를 추가하세요.",
|
||||
"compound_add_condition": "조건 추가",
|
||||
"compound_condition": "조건",
|
||||
"compound_remove_condition": "조건 제거",
|
||||
"card_title": "제목",
|
||||
"card_show_header": "통계 헤더 표시",
|
||||
"card_show_actions": "동작 버튼 표시",
|
||||
"card_compact": "컴팩트 모드",
|
||||
"card_max_items": "최대 항목 수 (0 = 전체)",
|
||||
"card_filter_status": "상태로 필터",
|
||||
"card_filter_status_help": "비워두면 모든 상태를 표시합니다.",
|
||||
"card_filter_objects": "객체로 필터",
|
||||
"card_filter_objects_help": "비워두면 모든 객체를 표시합니다.",
|
||||
"card_filter_entities": "엔티티로 필터 (entity_ids)",
|
||||
"card_filter_entities_help": "이 통합구성요소의 sensor / binary_sensor 엔티티를 선택하세요. 비워두면 전체.",
|
||||
"card_loading_objects": "객체 불러오는 중…",
|
||||
"card_load_error": "객체를 불러올 수 없습니다 — WebSocket 연결을 확인하세요.",
|
||||
"card_no_tasks_title": "아직 유지보수 작업이 없습니다",
|
||||
"card_no_tasks_cta": "→ 유지보수 패널에서 만들어 보세요",
|
||||
"no_objects": "아직 객체가 없습니다.",
|
||||
"action_error": "동작에 실패했습니다. 다시 시도해 주세요.",
|
||||
"area_id_optional": "구역 (선택)",
|
||||
"installation_date_optional": "설치일 (선택)",
|
||||
"warranty_expiry_optional": "보증 만료일 (선택)",
|
||||
"warranty": "보증",
|
||||
"warranty_valid_until": "{date}까지 유효",
|
||||
"warranty_expires_in": "{days}일 후 만료",
|
||||
"warranty_expired": "만료됨",
|
||||
"cal_past_windows": "이전 기간",
|
||||
"cal_forward_windows": "이후 기간",
|
||||
"history_edit_title": "기록 항목 편집",
|
||||
"history_edit_timestamp": "타임스탬프",
|
||||
"manufacturer": "제조사",
|
||||
"model": "모델",
|
||||
"area": "구역",
|
||||
"actions": "동작",
|
||||
"view_mode_label": "보기",
|
||||
"view_cards": "카드 보기",
|
||||
"view_table": "표 보기",
|
||||
"objects_table_columns_label": "객체 표 열",
|
||||
"objects_table_columns_hint": "객체 표 보기에 표시할 열을 선택하세요.",
|
||||
"custom_icon_optional": "아이콘 (선택, 예: mdi:wrench)",
|
||||
"task_enabled": "작업 활성화",
|
||||
"skip_reason_prompt": "이 작업을 건너뛸까요?",
|
||||
"reason_optional": "사유 (선택)",
|
||||
"reset_date_prompt": "작업을 수행한 것으로 표시할까요?",
|
||||
"reset_date_optional": "마지막 수행일 (선택, 기본값은 오늘)",
|
||||
"notes_label": "메모",
|
||||
"documentation_label": "문서",
|
||||
"no_nfc_tag": "— 태그 없음 —",
|
||||
"dashboard": "대시보드",
|
||||
"tab_today": "오늘",
|
||||
"palette_placeholder": "객체와 작업 검색…",
|
||||
"palette_no_results": "일치 항목 없음",
|
||||
"palette_hint": "↑↓ 이동 · Enter 열기 · Esc 닫기",
|
||||
"today_all_caught_up": "모두 처리했습니다! 이번 주에 예정된 작업이 없습니다.",
|
||||
"today_overdue": "기한 초과",
|
||||
"today_due_today": "오늘 예정",
|
||||
"today_this_week": "이번 주",
|
||||
"settings": "설정",
|
||||
"settings_features": "고급 기능",
|
||||
"settings_features_desc": "고급 기능을 켜거나 끕니다. 끄면 UI에서 숨겨질 뿐 데이터는 삭제되지 않습니다.",
|
||||
"feat_adaptive": "적응형 일정",
|
||||
"feat_adaptive_desc": "유지보수 기록에서 최적 주기를 학습합니다",
|
||||
"feat_predictions": "센서 예측",
|
||||
"feat_predictions_desc": "센서 열화로부터 트리거 시점을 예측합니다",
|
||||
"feat_seasonal": "계절 조정",
|
||||
"feat_seasonal_desc": "계절 패턴에 따라 주기를 조정합니다",
|
||||
"feat_environmental": "환경 상관관계",
|
||||
"feat_environmental_desc": "온도/습도와 주기의 상관관계를 분석합니다",
|
||||
"feat_budget": "예산 추적",
|
||||
"feat_budget_desc": "월별·연별 유지보수 지출을 추적합니다",
|
||||
"feat_groups": "작업 그룹",
|
||||
"feat_groups_desc": "작업을 논리적 그룹으로 정리합니다",
|
||||
"feat_checklists": "체크리스트",
|
||||
"feat_checklists_desc": "작업 완료를 위한 다단계 절차",
|
||||
"settings_general": "일반",
|
||||
"settings_default_warning": "기본 경고 일수",
|
||||
"settings_panel_enabled": "사이드바 패널",
|
||||
"settings_panel_title": "사이드바 패널 제목",
|
||||
"settings_notifications": "알림",
|
||||
"settings_notify_service": "알림 서비스",
|
||||
"test_notification": "테스트 알림",
|
||||
"send_test": "테스트 보내기",
|
||||
"testing": "보내는 중…",
|
||||
"test_notification_success": "테스트 알림을 보냈습니다",
|
||||
"test_notification_failed": "테스트 알림 전송 실패",
|
||||
"settings_notify_due_soon": "기한 임박 시 알림",
|
||||
"settings_notify_overdue": "기한 초과 시 알림",
|
||||
"settings_notify_triggered": "트리거 시 알림",
|
||||
"settings_interval_hours": "반복 주기 (시간, 0 = 한 번만)",
|
||||
"settings_quiet_hours": "방해 금지 시간",
|
||||
"settings_quiet_start": "시작",
|
||||
"settings_quiet_end": "종료",
|
||||
"settings_max_per_day": "하루 최대 알림 수 (0 = 무제한)",
|
||||
"settings_bundling": "알림 묶기",
|
||||
"settings_bundle_threshold": "묶음 기준 개수",
|
||||
"settings_reminder_leads": "추가 알림 (기한 전 일수)",
|
||||
"settings_reminder_leads_hint": "쉼표로 구분한 사전 알림 시점입니다. 예: 14, 3, 0 — 해당하는 날마다 추가 알림이 한 번 발송됩니다. 비워두면 꺼짐.",
|
||||
"settings_actions": "모바일 동작 버튼",
|
||||
"settings_action_complete": "'완료' 버튼 표시",
|
||||
"settings_action_skip": "'건너뛰기' 버튼 표시",
|
||||
"settings_action_snooze": "'다시 알림' 버튼 표시",
|
||||
"settings_weekly_digest": "주간 요약",
|
||||
"settings_weekly_digest_hint": "예정된 작업이 있으면 월요일 아침에 요약 알림을 한 번 보냅니다.",
|
||||
"settings_warranty_reminder": "보증 만료 알림",
|
||||
"settings_warranty_reminder_days": "만료 전 일수",
|
||||
"settings_warranty_reminder_hint": "객체의 보증 만료가 설정한 일수만큼 남았을 때 한 번 알립니다.",
|
||||
"settings_snooze_hours": "다시 알림 대기 시간 (시간)",
|
||||
"settings_budget": "예산",
|
||||
"settings_currency": "통화",
|
||||
"settings_budget_monthly": "월 예산",
|
||||
"settings_budget_yearly": "연 예산",
|
||||
"settings_budget_alerts": "예산 경고",
|
||||
"settings_budget_threshold": "경고 기준 (%)",
|
||||
"settings_import_export": "가져오기 / 내보내기",
|
||||
"settings_export_json": "JSON 내보내기",
|
||||
"settings_export_yaml": "YAML 내보내기",
|
||||
"settings_export_csv": "CSV 내보내기",
|
||||
"settings_import_csv": "CSV 가져오기",
|
||||
"settings_import_placeholder": "JSON 또는 CSV 내용을 여기에 붙여넣으세요…",
|
||||
"settings_import_btn": "가져오기",
|
||||
"settings_import_success": "객체 {count}개를 성공적으로 가져왔습니다.",
|
||||
"settings_export_success": "내보내기 파일이 다운로드되었습니다.",
|
||||
"settings_saved": "설정이 저장되었습니다.",
|
||||
"settings_include_history": "기록 포함",
|
||||
"settings_export_selection": "선택한 객체로 제한 (선택)",
|
||||
"settings_docs_archive": "문서 아카이브 (파일 포함)",
|
||||
"settings_docs_archive_hint": "JSON/YAML/CSV 내보내기에는 설정만 포함됩니다. 이 ZIP에는 업로드한 파일 내용까지 포함되어 완전한 복원이 가능합니다.",
|
||||
"settings_docs_export_btn": "문서 ZIP 다운로드",
|
||||
"settings_docs_import_btn": "문서 ZIP 복원",
|
||||
"settings_docs_import_success": "복원됨: 파일 {blobs}개, 문서 {docs}개",
|
||||
"sort_alphabetical": "가나다순",
|
||||
"sort_due_soonest": "예정일 빠른 순",
|
||||
"sort_task_count": "작업 수",
|
||||
"sort_area": "구역",
|
||||
"sort_assigned_user": "담당자",
|
||||
"sort_group": "그룹",
|
||||
"groupby_none": "그룹화 없음",
|
||||
"groupby_area": "구역별",
|
||||
"groupby_group": "그룹별",
|
||||
"groupby_user": "사용자별",
|
||||
"filter_label": "필터",
|
||||
"user_label": "사용자",
|
||||
"sort_label": "정렬",
|
||||
"group_by_label": "그룹화",
|
||||
"state_value_help": "HA 상태 값을 사용하세요(보통 소문자, 예: \"on\"/\"off\"). 대소문자는 저장 시 정규화됩니다.",
|
||||
"target_changes_help": "트리거가 발동하기까지 필요한 일치 전환 횟수입니다 (기본값: 1).",
|
||||
"qr_print_title": "QR 코드 인쇄",
|
||||
"qr_print_desc": "잘라서 장비에 붙일 수 있는 QR 코드 인쇄 페이지를 생성합니다.",
|
||||
"qr_print_load": "객체 불러오기",
|
||||
"qr_print_filter": "필터",
|
||||
"qr_print_objects": "객체",
|
||||
"qr_print_actions": "동작",
|
||||
"qr_print_url_mode": "링크 유형",
|
||||
"qr_print_estimate": "예상 QR 코드 수",
|
||||
"qr_print_over_limit": "최대 200개입니다. 필터를 좁혀 주세요",
|
||||
"qr_print_generate": "QR 코드 생성",
|
||||
"qr_print_generating": "생성 중…",
|
||||
"qr_print_ready": "QR 코드 준비 완료",
|
||||
"qr_print_print_button": "인쇄",
|
||||
"qr_print_empty": "생성할 항목 없음",
|
||||
"qr_action_skip": "건너뛰기",
|
||||
"vacation_title": "휴가 모드",
|
||||
"vacation_active": "활성",
|
||||
"vacation_ended": "종료됨",
|
||||
"vacation_desc": "휴가를 계획하세요. 휴가 기간과 버퍼 일수 동안 알림이 일시 중지됩니다. 특정 작업은 예외로 되돌릴 수 있습니다.",
|
||||
"vacation_enable": "휴가 모드 활성화",
|
||||
"vacation_start": "시작",
|
||||
"vacation_end": "종료",
|
||||
"vacation_buffer": "버퍼 (일)",
|
||||
"vacation_exempt_title": "휴가 중에도 알림 받기",
|
||||
"vacation_exempt_desc": "휴가 중에도 알림을 받을 작업을 선택하세요 (예: 중요한 수영장 수질 관리).",
|
||||
"vacation_load_tasks": "작업 불러오기",
|
||||
"vacation_preview_btn": "미리보기 표시",
|
||||
"vacation_preview_affected": "개 작업 영향받음",
|
||||
"vacation_event_due_soon": "기한 임박 예정",
|
||||
"vacation_event_overdue": "기한 초과 예정",
|
||||
"vacation_event_triggered_est": "센서 트리거 가능",
|
||||
"vacation_sensor_based": "(센서 기반)",
|
||||
"vacation_action_notify": "그래도 알림",
|
||||
"vacation_action_unsilence": "다시 음소거",
|
||||
"vacation_marked_complete": "완료로 표시됨",
|
||||
"vacation_marked_skip": "건너뜀",
|
||||
"vacation_end_now": "지금 휴가 종료",
|
||||
"add": "추가",
|
||||
"show_stats": "통계 + 그래프 보기",
|
||||
"hide_stats": "통계 숨기기",
|
||||
"adaptive_no_data": "적응형 분석에 필요한 완료 기록이 아직 부족합니다. 이 작업을 몇 번 더 완료하면 주기 추천과 신뢰도 차트가 열립니다.",
|
||||
"suggestion_applied": "제안 주기가 적용되었습니다",
|
||||
"vacation_mode": "휴가 모드",
|
||||
"vacation_status_active": "현재 활성",
|
||||
"vacation_status_scheduled": "예약됨",
|
||||
"vacation_status_inactive": "비활성",
|
||||
"vacation_end_now_confirm": "휴가를 지금 바로 종료할까요?",
|
||||
"vacation_exempt_count": "예외",
|
||||
"vacation_advanced": "고급…",
|
||||
"vacation_open_panel": "패널에서 열기",
|
||||
"enable": "활성화",
|
||||
"saved": "저장됨",
|
||||
"budget_monthly_set": "월 예산 설정",
|
||||
"budget_yearly_set": "연 예산 설정",
|
||||
"budget_advanced": "통화, 경고…",
|
||||
"budget_open_panel": "패널에서 열기",
|
||||
"groups_empty": "아직 그룹이 없습니다.",
|
||||
"group_new_placeholder": "그룹 추가…",
|
||||
"group_delete_confirm": "\"{name}\" 그룹을 삭제할까요?",
|
||||
"groups_manage_tasks": "작업 배정 관리…",
|
||||
"groups_open_panel": "패널에서 열기",
|
||||
"unassigned": "미배정",
|
||||
"no_area": "구역 없음",
|
||||
"has_overdue": "기한 초과 작업 있음",
|
||||
"object": "객체",
|
||||
"settings_panel_access": "패널 접근 권한",
|
||||
"settings_panel_access_desc": "관리자는 항상 전체 권한을 가집니다. 특정 비관리자에게 생성·편집·삭제를 위임하려면 이 옵션을 켜고 아래에서 선택하세요. 나머지 사용자에게는 완료와 건너뛰기만 표시됩니다.",
|
||||
"settings_operator_write": "선택한 사용자에게 생성·편집·삭제 허용",
|
||||
"settings_operator_write_desc": "끔: 관리자만 내용을 변경할 수 있습니다. 켬: 아래에서 선택한 사용자도 전체 권한을 갖습니다.",
|
||||
"no_non_admin_users": "비관리자 사용자가 없습니다. 설정 → 사람에서 추가하세요.",
|
||||
"owner_label": "소유자",
|
||||
"feat_completion_actions": "완료 동작",
|
||||
"feat_completion_actions_desc": "완료 시 작업별 HA 동작 실행 + 사전 설정값이 있는 빠른 완료 QR.",
|
||||
"on_complete_action_title": "완료 시: HA 동작 실행 (선택)",
|
||||
"on_complete_action_desc": "작업이 완료되면 HA 서비스를 호출합니다 — 예: 기기의 카운터 초기화.",
|
||||
"on_complete_action_service": "서비스",
|
||||
"on_complete_action_target": "대상 엔티티",
|
||||
"on_complete_action_target_hint": "참고: 엔티티 도메인이 서비스와 일치해야 합니다 — 예: 'button.press'는 button.*에서만, 'counter.increment'는 counter.*에서만, 'input_button.press'는 input_button.*에서만 동작합니다. 불일치 시 동작이 조용히 실패합니다 (HA 로그에 'Referenced entities ... missing or not currently available' 기록).",
|
||||
"on_complete_action_data": "데이터 (JSON, 선택)",
|
||||
"on_complete_action_test": "설정 검증",
|
||||
"on_complete_action_test_success": "✓ 설정이 유효합니다 (동작은 작업 완료 시에만 실행됩니다)",
|
||||
"on_complete_action_test_failed": "실패",
|
||||
"quick_complete_defaults_title": "빠른 완료 기본값 (QR 스캔용, 선택)",
|
||||
"quick_complete_defaults_desc": "빠른 완료 QR 스캔에 쓰이는 사전 설정값입니다. 없으면 QR이 완료 대화상자를 엽니다.",
|
||||
"quick_complete_defaults_notes": "메모",
|
||||
"quick_complete_defaults_cost": "비용",
|
||||
"quick_complete_defaults_duration": "소요 시간 (분)",
|
||||
"quick_complete_defaults_feedback_none": "피드백 없음",
|
||||
"quick_complete_defaults_feedback_needed": "필요했음",
|
||||
"quick_complete_defaults_feedback_not_needed": "불필요했음",
|
||||
"quick_complete_success": "빠르게 완료로 표시됨",
|
||||
"show_all_objects": "모든 객체 보기",
|
||||
"show_all_tasks": "필터 해제 — 모든 작업 보기",
|
||||
"filter_to_overdue": "기한 초과 작업만 보기",
|
||||
"filter_to_due_soon": "기한 임박 작업만 보기",
|
||||
"filter_to_triggered": "트리거된 작업만 보기",
|
||||
"open_task": "작업 열기",
|
||||
"show_details": "기록 + 통계 보기",
|
||||
"hide_details": "상세 숨기기",
|
||||
"history_empty": "아직 기록이 없습니다.",
|
||||
"history_edit_button": "항목 편집",
|
||||
"total_cost": "총 비용",
|
||||
"times_performed": "수행 횟수",
|
||||
"older_entries": "이전 항목",
|
||||
"open_in_panel": "유지보수 패널에서 열기",
|
||||
"skip_reason": "건너뛰기 사유 (선택)",
|
||||
"reset_to_date": "마지막 수행일 재설정",
|
||||
"delete_task_confirm": "이 작업과 기록을 삭제할까요?",
|
||||
"delete_object_confirm": "이 객체와 모든 작업을 삭제할까요?",
|
||||
"loading": "불러오는 중…",
|
||||
"archive": "보관",
|
||||
"undo": "실행 취소",
|
||||
"task_archived": "작업이 보관되었습니다",
|
||||
"object_archived": "객체가 보관되었습니다",
|
||||
"unarchive": "보관 해제",
|
||||
"archived": "보관됨",
|
||||
"show_archived": "보관된 항목 보기",
|
||||
"hide_archived": "보관된 항목 숨기기",
|
||||
"confirm_archive_object": "이 객체와 작업을 보관할까요? 기록은 유지되며 나중에 보관 해제할 수 있습니다.",
|
||||
"settings_archive": "보관 및 보존",
|
||||
"settings_archive_desc": "완료된 일회성 작업을 삭제하지 않고 정리합니다. 보관된 항목은 숨겨지고 동작하지 않지만 기록과 비용은 유지됩니다.",
|
||||
"settings_archive_oneoff_days": "완료된 일회성 작업 자동 보관 (일, 0 = 끔)",
|
||||
"settings_delete_archived_oneoff_days": "보관된 일회성 작업 자동 삭제 (일, 0 = 안 함)",
|
||||
"archive_object": "객체 보관",
|
||||
"unarchive_object": "객체 보관 해제",
|
||||
"documents": "문서",
|
||||
"documents_empty": "아직 문서가 없습니다.",
|
||||
"doc_upload": "파일 업로드",
|
||||
"doc_uploading": "업로드 중…",
|
||||
"doc_add_link": "링크 추가",
|
||||
"doc_link_url": "링크 URL (https://…)",
|
||||
"doc_link_title": "제목 (선택)",
|
||||
"doc_open": "열기",
|
||||
"doc_delete_confirm": "\"{name}\"을(를) 삭제할까요?",
|
||||
"doc_too_large": "파일이 너무 큽니다 (최대 25 MB).",
|
||||
"doc_upload_failed": "업로드에 실패했습니다.",
|
||||
"completion_photo_optional": "완료 사진 (선택)",
|
||||
"add_photo": "사진 추가",
|
||||
"uploading": "업로드 중…",
|
||||
"remove": "제거",
|
||||
"doc_deduped": "이미 다른 곳에 저장됨 — 공유되어 추가 공간을 쓰지 않습니다.",
|
||||
"doc_dup_in_object": "이 파일은 이미 이 객체에 첨부되어 있습니다.",
|
||||
"doc_link_invalid": "http/https 링크만 허용됩니다.",
|
||||
"doc_cat_manual": "설명서",
|
||||
"doc_cat_warranty": "보증서",
|
||||
"doc_cat_invoice": "영수증",
|
||||
"doc_cat_spare_parts": "예비 부품",
|
||||
"doc_cat_photo": "사진",
|
||||
"doc_cat_other": "기타",
|
||||
"doc_link_badge": "링크",
|
||||
"doc_storage_title": "문서 저장소",
|
||||
"doc_storage_saved": "중복 제거로 절약됨",
|
||||
"doc_storage_refresh": "새로 고침",
|
||||
"doc_download": "다운로드",
|
||||
"doc_close": "닫기",
|
||||
"doc_camera": "사진 촬영",
|
||||
"doc_drop_hint": "파일을 여기에 놓으세요",
|
||||
"doc_task_none": "이 작업에 연결된 문서가 없습니다.",
|
||||
"doc_link_existing": "문서 연결…",
|
||||
"doc_attach": "연결",
|
||||
"doc_unlink": "연결 해제",
|
||||
"doc_page": "페이지",
|
||||
"chart_range_7d": "7일",
|
||||
"chart_range_30d": "30일",
|
||||
"chart_range_90d": "90일",
|
||||
"chart_range_1y": "1년",
|
||||
"chart_since_service": "마지막 정비 이후",
|
||||
"chart_no_stats": "이 엔티티의 장기 통계가 없습니다 — 유지보수 이벤트 값만 표시합니다",
|
||||
"auto_complete_on_recovery": "센서가 정상으로 돌아오면 자동 완료",
|
||||
"auto_complete_on_recovery_help": "트리거가 스스로 해제되면 완료를 기록합니다 (마지막 수행일 갱신) — 예: 소금 보충, 필터 교체.",
|
||||
"doc_search": "문서 검색…",
|
||||
"doc_search_none": "일치하는 문서 없음",
|
||||
"link_device_optional": "기존 기기와 연결 (선택)",
|
||||
"parent_object_optional": "상위 객체 (선택)",
|
||||
"parent_none": "(상위 없음)",
|
||||
"paused": "일시 중지됨",
|
||||
"pause_object": "일시 중지",
|
||||
"resume_object": "재개",
|
||||
"pause_until_prompt": "이 객체의 일정을 동결합니다 — 재개할 때까지 어떤 작업도 기한이 되지 않고 알림도 오지 않습니다. 자동 재개 날짜를 선택적으로 설정할 수 있습니다.",
|
||||
"pause_until_label": "재개일 (선택)",
|
||||
"object_paused": "객체가 일시 중지되었습니다",
|
||||
"object_resumed": "객체가 재개되었습니다 — 일정이 다시 시작됩니다",
|
||||
"object_paused_badge": "일시 중지됨",
|
||||
"paused_until_label": "재개일",
|
||||
"replace_object": "교체…",
|
||||
"replace_object_prompt": "이 객체를 퇴역시키고 후속 객체를 만듭니다. 기록과 비용은 기존 객체에 보관된 채 남고, 작업과 문서는 새 객체로 이어지며 카운터는 새로 시작됩니다.",
|
||||
"replace_name_label": "후속 객체 이름",
|
||||
"object_replaced": "객체가 교체되었습니다 — 후속 객체 생성됨",
|
||||
"reading_unit_label": "검침 단위 (예: kWh, m³)",
|
||||
"reading_unit_help": "이 작업을 완료할 때 기록 값 옆에 표시됩니다.",
|
||||
"reading_value_label": "검침 값",
|
||||
"reading_label": "검침",
|
||||
"settings_templates_label": "템플릿 갤러리",
|
||||
"settings_templates_hint": "필요 없는 템플릿의 체크를 해제하세요 — \"템플릿에서\" 선택 목록(패널 및 설정 흐름)에서 사라집니다. 다른 변화는 없으며 언제든 다시 활성화할 수 있습니다.",
|
||||
"worksheet": "작업 시트",
|
||||
"worksheet_scan_view": "스캔하여 작업 열기",
|
||||
"worksheet_scan_complete": "스캔하여 완료",
|
||||
"worksheet_manual_excerpt": "설명서 발췌",
|
||||
"worksheet_pages": "페이지",
|
||||
"worksheet_printed": "인쇄됨",
|
||||
"worksheet_never": "없음",
|
||||
"card_all_caught_up": "모두 처리했습니다 — 주의가 필요한 항목이 없습니다",
|
||||
"postpone": "연기",
|
||||
"postpone_date_prompt": "이번 회차를 언제로 연기할까요?",
|
||||
"postpone_date_label": "새 예정일",
|
||||
"postponed": "연기됨",
|
||||
"postponed_to": "연기됨:",
|
||||
"season_window_label": "계절 기간 (월)",
|
||||
"season_window_hint": "선택한 달에만 기한이 됩니다. 비수기 날짜는 다음 활성 달로 넘어갑니다. 선택 없음 = 연중.",
|
||||
"series_end_label": "종료",
|
||||
"series_end_never": "없음 (무기한 반복)",
|
||||
"series_end_after_count": "지정 횟수 후",
|
||||
"series_end_until": "특정 날짜에",
|
||||
"series_end_count_label": "횟수",
|
||||
"series_end_until_label": "종료일",
|
||||
"parts_section": "부품 및 소모품",
|
||||
"part_add": "부품 추가",
|
||||
"part_name": "이름",
|
||||
"part_vendor": "제조사",
|
||||
"part_storage_location": "보관 위치",
|
||||
"part_product_url": "제품 URL",
|
||||
"part_unit": "단위",
|
||||
"part_cost": "단가",
|
||||
"part_stock": "재고",
|
||||
"part_reorder_threshold": "재주문 기준",
|
||||
"part_restock_quantity": "보충 수량",
|
||||
"part_auto_buy": "재고 부족 시 구매 작업 자동 생성",
|
||||
"part_restock": "재고 조정",
|
||||
"restock_quantity_label": "구매 수량",
|
||||
"consumes_parts_label": "사용하는 부품",
|
||||
"parts_load_failed": "이 객체의 부품을 불러올 수 없습니다 — 부품 사용 옵션을 지금은 쓸 수 없습니다.",
|
||||
"adopt_problem_button": "문제 센서 가져오기",
|
||||
"adopt_problem_title": "문제 센서 가져오기",
|
||||
"adopt_problem_hint": "HA 문제 센서(프린터 오류, 필터 경고, 배터리 부족)를 유지보수 작업으로 전환합니다. 문제가 활성인 동안 트리거되고 해결되면 자동으로 해제됩니다.",
|
||||
"adopt_problem_none": "아직 추적되지 않은 문제 센서를 찾지 못했습니다.",
|
||||
"adopt_problem_active": "활성",
|
||||
"adopt_problem_ok": "정상",
|
||||
"adopt_problem_new_object": "(신규)",
|
||||
"adopt_problem_adopt": "선택 항목 가져오기",
|
||||
"adopt_problem_done": "문제 센서 {tasks}개를 가져왔습니다",
|
||||
"views_label": "보기",
|
||||
"views_none": "— 보기 없음 —",
|
||||
"views_manage": "보기 저장 / 관리",
|
||||
"views_dialog_title": "저장된 보기",
|
||||
"views_dialog_hint": "현재 필터를 이름 있는 보기로 저장하면 모두가 다시 사용할 수 있습니다.",
|
||||
"views_name_placeholder": "보기 이름",
|
||||
"views_save_current": "현재 필터 저장",
|
||||
"views_none_yet": "저장된 보기가 아직 없습니다.",
|
||||
"close": "닫기",
|
||||
"trigger_hint_now": "센서의 현재 값은 {value}입니다.",
|
||||
"trigger_hint_above": "{target}을(를) 초과하면 작업이 트리거됩니다.",
|
||||
"trigger_hint_below": "{target} 미만으로 떨어지면 트리거됩니다.",
|
||||
"trigger_hint_counter_delta": "현재 값({value})부터 계수합니다: {due} 도달 시 기한 (+{target}), 완료할 때마다 계수가 다시 시작됩니다.",
|
||||
"trigger_hint_counter_delta_edit": "마지막 완료 이후 사용량을 계수합니다: +{target} 후 기한이 되며, 완료할 때마다 계수가 다시 시작됩니다.",
|
||||
"trigger_hint_counter_abs": "센서가 {target}에 도달하면 작업 기한이 됩니다.",
|
||||
"trigger_hint_runtime": "누적 가동 {hours}시간 후 작업 기한이 됩니다. 카운터는 완료할 때마다 다시 시작됩니다.",
|
||||
"trigger_hint_state_change": "상태가 {count}회 변경되면 작업 기한이 됩니다.",
|
||||
"trigger_hint_state_change_to": "“{state}”(으)로 {count}회 변경되면 작업 기한이 됩니다.",
|
||||
"trigger_hint_state_now": "현재 상태: {value}.",
|
||||
"adopt_problem_part": "사용 부품: {name}",
|
||||
"label_filter": "라벨",
|
||||
"all_labels": "모든 라벨",
|
||||
"settings_notify_scope": "특정 보기만 알림",
|
||||
"settings_notify_scope_all": "모든 작업",
|
||||
"settings_notify_scope_hint": "선택한 저장된 보기의 라벨/사용자 필터와 일치하는 작업만 알림을 보냅니다. 보기의 상태·정렬·그룹화는 여기서 무시됩니다.",
|
||||
"card_saved_view": "저장된 보기",
|
||||
"card_saved_view_none": "없음",
|
||||
"card_saved_view_help": "위 필터에 더해 보기의 상태·사용자·라벨 필터를 적용합니다. 보기의 정렬과 그룹화는 패널 표시 설정이며 카드에는 적용되지 않습니다.",
|
||||
"doc_part_none": "이 부품에 연결된 문서가 없습니다.",
|
||||
"settings_templates_toggle_group": "이 그룹의 모든 템플릿을 켜거나 끄기",
|
||||
"setups_button": "추천 설정",
|
||||
"setups_title": "추천 설정 (베타)",
|
||||
"setups_hint": "소모품 센서로 유지보수 작업을 구동할 수 있는 지원 통합구성요소의 기기입니다. 가져오면 객체가 생성되고 각 작업이 센서에 연결됩니다 — 소모품이 부족해지면 트리거되고 교체 후 자동으로 해제됩니다.",
|
||||
"setups_none": "연결되지 않은 소모품 센서를 가진 지원 기기를 찾지 못했습니다.",
|
||||
"setups_adopt": "선택 항목 설정",
|
||||
"setups_done": "센서 연결 작업 {tasks}개가 생성되었습니다.",
|
||||
"complete_parts_used": "이번에 사용한 부품",
|
||||
"part_delete_confirm": "'{name}' 부품을 삭제할까요? 재고 추적, 작업 연결, 진행 중인 구매 알림이 모두 제거됩니다.",
|
||||
"baseline_start_value": "시작 값 (선택)",
|
||||
"baseline_start_help": "이 값부터 계수를 시작합니다. 비워두면 현재 값부터 계수합니다. 마지막 정비 시점의 값을 입력하면 그 이후의 사용량이 바로 반영됩니다.",
|
||||
"setups_baseline_hint": "마지막 정비 시점의 값 (선택)",
|
||||
"baseline_start_help_edit": "비워두면 기존 계수를 유지합니다. 값을 입력하면 계수 기준이 다시 설정됩니다 (예: 마지막 정비 시점의 값).",
|
||||
"baseline_current_effective": "현재 적용 중인 시작 값: {value}",
|
||||
"runtime_on_states": "활성 상태 (쉼표로 구분)",
|
||||
"runtime_on_states_help": "가동 중으로 계산할 상태입니다 — 기본값: on. 예: mowing, cleaning, printing. 속성을 선택한 경우 해당 속성 값과 비교합니다.",
|
||||
"setups_target_new": "새로 만들기: {name}",
|
||||
"schedule_preview_title": "다음 예정일",
|
||||
"schedule_preview_ontime": "제때 완료한다고 가정한 일정입니다.",
|
||||
"schedule_preview_ends": "(시리즈 종료)",
|
||||
"adopt_problem_responsible": "가져온 모든 작업의 담당자 (선택)",
|
||||
"adopt_problem_configure": "구성",
|
||||
"history_auto": "자동",
|
||||
"battery_fleet_title": "배터리 플릿",
|
||||
"battery_fleet_none_low": "모든 배터리 정상 — 교체할 것이 없습니다.",
|
||||
"battery_fleet_buy_now": "지금 구매",
|
||||
"battery_fleet_soon": "곧 필요",
|
||||
"battery_fleet_soon_hint": "마지막 교체일로부터 예측한 값입니다 — 미리 주문해 두세요.",
|
||||
"battery_fleet_mark_all": "모두 교체됨으로 표시",
|
||||
"battery_fleet_mark_one": "이 배터리를 교체됨으로 표시",
|
||||
"battery_fleet_offline": "오프라인",
|
||||
"battery_fleet_trigger_lost": "이 작업의 센서 트리거가 사라졌습니다 — 트리거도 자동 완료도 되지 않습니다.",
|
||||
"battery_fleet_repair": "복구",
|
||||
"battery_fleet_exclude": "플릿에서 제외",
|
||||
"battery_fleet_excluded": "제외됨",
|
||||
"battery_fleet_include": "다시 추적",
|
||||
"battery_fleet_total": "배터리 {n}개 추적 중",
|
||||
"battery_fleet_setup_button": "배터리 플릿",
|
||||
"battery_fleet_setup_done": "배터리 플릿이 설정되었습니다 — 하나의 작업이 모든 배터리를 추적합니다.",
|
||||
"update_banner": "서버에 Maintenance Supporter의 새 버전이 있습니다 — 패널을 업데이트하려면 새로 고침하세요.",
|
||||
"update_reload": "새로 고침"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Manutenção",
|
||||
"objects": "Objetos",
|
||||
"tasks": "Tarefas",
|
||||
"overdue": "Atrasada",
|
||||
"due_soon": "Vence em breve",
|
||||
"triggered": "Acionada",
|
||||
"trigger_replaced": "Gatilho substituído",
|
||||
"ok": "OK",
|
||||
"all": "Todas",
|
||||
"new_object": "+ Novo objeto",
|
||||
"templates_from": "A partir de modelo",
|
||||
"templates_title": "Comece com um modelo",
|
||||
"templates_task_count": "{n} tarefas",
|
||||
"template_created": "Criado a partir do modelo",
|
||||
"onboard_hint": "Adicione seu primeiro objeto para começar a acompanhar a manutenção.",
|
||||
"edit": "Editar",
|
||||
"duplicate": "Duplicar",
|
||||
"task_duplicated": "Tarefa duplicada",
|
||||
"object_duplicated": "Objeto duplicado",
|
||||
"delete": "Excluir",
|
||||
"add_task": "+ Adicionar tarefa",
|
||||
"complete": "Concluir",
|
||||
"completed": "Concluída",
|
||||
"skip": "Pular",
|
||||
"skipped": "Pulada",
|
||||
"missed": "Perdida",
|
||||
"reset": "Redefinir",
|
||||
"snooze": "Soneca",
|
||||
"snoozed": "Em soneca",
|
||||
"cancel": "Cancelar",
|
||||
"bulk_select": "Selecionar",
|
||||
"bulk_select_all": "Selecionar tudo",
|
||||
"bulk_n_selected": "{n} selecionadas",
|
||||
"bulk_completed": "{n} tarefas concluídas",
|
||||
"bulk_archived": "{n} tarefas arquivadas",
|
||||
"completing": "Concluindo…",
|
||||
"interval": "Intervalo",
|
||||
"warning": "Aviso",
|
||||
"last_performed": "Última execução",
|
||||
"next_due": "Próximo vencimento",
|
||||
"days_until_due": "Dias até o vencimento",
|
||||
"avg_duration": "Duração média",
|
||||
"trigger": "Gatilho",
|
||||
"trigger_type": "Tipo de gatilho",
|
||||
"threshold_above": "Limite superior",
|
||||
"threshold_below": "Limite inferior",
|
||||
"threshold": "Limite",
|
||||
"counter": "Contador",
|
||||
"state_change": "Mudança de estado",
|
||||
"runtime": "Tempo de operação",
|
||||
"runtime_hours": "Tempo de operação alvo (horas)",
|
||||
"target_value": "Valor alvo",
|
||||
"baseline": "Linha de base",
|
||||
"target_changes": "Mudanças alvo",
|
||||
"for_minutes": "Durante (minutos)",
|
||||
"time_based": "Baseado em tempo",
|
||||
"sensor_based": "Baseado em sensor",
|
||||
"manual": "Manual",
|
||||
"one_time": "Única vez",
|
||||
"weekdays": "Dias da semana",
|
||||
"nth_weekday": "Enésimo dia da semana do mês",
|
||||
"day_of_month": "Dia do mês",
|
||||
"recurrence_on_days": "Repetir em",
|
||||
"recurrence_occurrence": "Ocorrência",
|
||||
"recurrence_weekday": "Dia da semana",
|
||||
"recurrence_day": "Dia do mês (1–31)",
|
||||
"recurrence_last_day": "Último dia do mês",
|
||||
"recurrence_business_day": "Somente dias úteis (antecipar do fim de semana)",
|
||||
"recurrence_offset": "Deslocamento (dias, ±)",
|
||||
"recurrence_offset_help": "Desloque a data em ±N dias, ex.: -2 = dois dias antes.",
|
||||
"last_day_month": "Último dia do mês",
|
||||
"last_business_day_month": "Último dia útil",
|
||||
"ord_1": "1º",
|
||||
"ord_2": "2º",
|
||||
"ord_3": "3º",
|
||||
"ord_4": "4º",
|
||||
"ord_5": "5º",
|
||||
"ord_last": "Último",
|
||||
"day_word": "Dia",
|
||||
"interval_value": "Intervalo",
|
||||
"interval_unit": "Unidade",
|
||||
"unit_days": "Dias",
|
||||
"unit_weeks": "Semanas",
|
||||
"unit_months": "Meses",
|
||||
"unit_years": "Anos",
|
||||
"due_date": "Data de vencimento",
|
||||
"cleaning": "Limpeza",
|
||||
"inspection": "Inspeção",
|
||||
"replacement": "Substituição",
|
||||
"calibration": "Calibração",
|
||||
"service": "Revisão",
|
||||
"reading": "Leitura",
|
||||
"custom": "Personalizado",
|
||||
"history": "Histórico",
|
||||
"cost": "Custo",
|
||||
"report_button": "Relatório",
|
||||
"report_title": "Relatório de manutenção",
|
||||
"report_generated": "Gerado em",
|
||||
"report_times_done": "Concluídas",
|
||||
"report_total_cost": "Custo total",
|
||||
"report_every": "a cada {n} {unit}",
|
||||
"report_notes": "Observações",
|
||||
"report_col_type": "Tipo",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Agendamento",
|
||||
"duration": "Duração",
|
||||
"both": "Ambos",
|
||||
"trigger_val": "Valor do gatilho",
|
||||
"complete_title": "Concluir: ",
|
||||
"checklist": "Checklist",
|
||||
"checklist_steps_optional": "Etapas do checklist (opcional)",
|
||||
"checklist_placeholder": "Limpar o filtro\nTrocar a vedação\nTestar a pressão",
|
||||
"checklist_help": "Uma etapa por linha. Máx. 100 itens.",
|
||||
"err_too_long": "{field}: muito longo (máx. {n} caracteres)",
|
||||
"err_too_short": "{field}: muito curto (mín. {n} caracteres)",
|
||||
"err_value_too_high": "{field}: muito grande (máx. {n})",
|
||||
"err_value_too_low": "{field}: muito pequeno (mín. {n})",
|
||||
"err_required": "{field}: obrigatório",
|
||||
"err_wrong_type": "{field}: tipo incorreto (esperado: {type})",
|
||||
"err_invalid_choice": "{field}: valor não permitido",
|
||||
"err_invalid_value": "{field}: valor inválido",
|
||||
"feat_schedule_time": "Agendamento por horário",
|
||||
"feat_schedule_time_desc": "As tarefas ficam atrasadas em um horário específico do dia, em vez de à meia-noite.",
|
||||
"schedule_time_optional": "Vence às (opcional, HH:MM)",
|
||||
"schedule_time_help": "Vazio = meia-noite (padrão). Fuso horário do HA.",
|
||||
"at_time": "às",
|
||||
"notes_optional": "Observações (opcional)",
|
||||
"cost_optional": "Custo (opcional)",
|
||||
"duration_minutes": "Duração em minutos (opcional)",
|
||||
"days": "dias",
|
||||
"day": "dia",
|
||||
"today": "Hoje",
|
||||
"d_overdue": "d de atraso",
|
||||
"no_tasks": "Ainda não há tarefas de manutenção. Crie um objeto para começar.",
|
||||
"no_tasks_short": "Sem tarefas",
|
||||
"no_history": "Ainda não há entradas no histórico.",
|
||||
"show_all": "Mostrar tudo",
|
||||
"cost_duration_chart": "Custo e duração",
|
||||
"installed": "Instalado",
|
||||
"confirm_delete_object": "Excluir este objeto e todas as suas tarefas?",
|
||||
"confirm_delete_task": "Excluir esta tarefa?",
|
||||
"min": "Mín",
|
||||
"max": "Máx",
|
||||
"save": "Salvar",
|
||||
"saving": "Salvando…",
|
||||
"edit_task": "Editar tarefa",
|
||||
"new_task": "Nova tarefa de manutenção",
|
||||
"task_name": "Nome da tarefa",
|
||||
"maintenance_type": "Tipo de manutenção",
|
||||
"priority": "Prioridade",
|
||||
"labels": "Etiquetas",
|
||||
"labels_placeholder": "ex.: segurança, sazonal, visível ao inquilino",
|
||||
"labels_help": "Tags separadas por vírgula para filtragem e relatórios.",
|
||||
"priority_low": "Baixa",
|
||||
"priority_normal": "Normal",
|
||||
"priority_high": "Alta",
|
||||
"schedule_type": "Tipo de agendamento",
|
||||
"interval_days": "Intervalo (dias)",
|
||||
"warning_days": "Dias de aviso",
|
||||
"earliest_completion_days": "Conclusão antecipada (dias antes do vencimento)",
|
||||
"earliest_completion_days_help": "Deixe vazio para permitir concluir a qualquer momento. 0 = somente no dia do vencimento ou depois.",
|
||||
"last_performed_optional": "Última execução (opcional)",
|
||||
"interval_anchor": "Âncora do intervalo",
|
||||
"anchor_completion": "A partir da data de conclusão",
|
||||
"anchor_planned": "A partir da data planejada (sem deriva)",
|
||||
"edit_object": "Editar objeto",
|
||||
"name": "Nome",
|
||||
"manufacturer_optional": "Fabricante (opcional)",
|
||||
"model_optional": "Modelo (opcional)",
|
||||
"serial_number_optional": "Número de série (opcional)",
|
||||
"serial_number_label": "N/S",
|
||||
"documentation_url_label": "Manual",
|
||||
"object_notes_label": "Observações",
|
||||
"sort_due_date": "Data de vencimento",
|
||||
"sort_object": "Nome do objeto",
|
||||
"sort_type": "Tipo",
|
||||
"sort_task_name": "Nome da tarefa",
|
||||
"all_objects": "Todos os objetos",
|
||||
"tasks_lower": "tarefas",
|
||||
"no_tasks_yet": "Ainda sem tarefas",
|
||||
"add_first_task": "Adicionar a primeira tarefa",
|
||||
"trigger_configuration": "Configuração do gatilho",
|
||||
"entity_id": "ID da entidade",
|
||||
"comma_separated": "separado por vírgulas",
|
||||
"entity_logic": "Lógica das entidades",
|
||||
"entity_logic_any": "Qualquer entidade aciona",
|
||||
"entity_logic_all": "Todas as entidades devem acionar",
|
||||
"entities": "entidades",
|
||||
"attribute_optional": "Atributo (opcional, vazio = estado)",
|
||||
"use_entity_state": "Usar o estado da entidade (sem atributo)",
|
||||
"trigger_above": "Acionar acima de",
|
||||
"trigger_below": "Acionar abaixo de",
|
||||
"for_at_least_minutes": "Por pelo menos (minutos)",
|
||||
"safety_interval_days": "Intervalo de segurança (dias, opcional)",
|
||||
"safety_interval": "Intervalo de segurança (opcional)",
|
||||
"delta_mode": "Modo delta",
|
||||
"from_state_optional": "Do estado (opcional)",
|
||||
"to_state_optional": "Para o estado (opcional)",
|
||||
"documentation_url_optional": "URL da documentação (opcional)",
|
||||
"object_notes_optional": "Observações (opcional)",
|
||||
"nfc_tag_id_optional": "ID da tag NFC (opcional)",
|
||||
"nfc_tags_empty_help": "Ainda não há tags NFC registradas no Home Assistant.",
|
||||
"nfc_tags_open_settings": "Abrir configurações de tags",
|
||||
"nfc_tags_refresh": "Atualizar",
|
||||
"environmental_entity_optional": "Sensor ambiental (opcional)",
|
||||
"environmental_entity_helper": "ex.: sensor.outdoor_temperature — ajusta o intervalo com base nas condições ambientais",
|
||||
"environmental_attribute_optional": "Atributo ambiental (opcional)",
|
||||
"nfc_tag_id": "ID da tag NFC",
|
||||
"nfc_linked": "Tag NFC vinculada",
|
||||
"nfc_link_hint": "Clique para vincular uma tag NFC",
|
||||
"responsible_user": "Usuário responsável",
|
||||
"shared_with": "Compartilhada com (rodízio)",
|
||||
"shared_with_help": "Escolha várias pessoas para compartilhar esta tarefa; o responsável muda em rodízio a cada conclusão.",
|
||||
"rotation_strategy": "Rodízio",
|
||||
"rotation_none": "Sem rodízio",
|
||||
"rotation_round_robin": "Revezamento",
|
||||
"rotation_least_completed": "Quem concluiu menos",
|
||||
"rotation_random": "Aleatório",
|
||||
"no_user_assigned": "(Nenhum usuário atribuído)",
|
||||
"all_users": "Todos os usuários",
|
||||
"my_tasks": "Minhas tarefas",
|
||||
"tab_calendar": "Calendário",
|
||||
"cal_no_events": "Sem manutenção",
|
||||
"cal_window_7": "7 dias",
|
||||
"cal_window_14": "14 dias",
|
||||
"cal_window_30": "30 dias",
|
||||
"cal_window_365": "1 ano",
|
||||
"cal_every_n_days": "a cada {n} dias",
|
||||
"cal_source_time": "Baseado em tempo",
|
||||
"cal_source_time_adaptive": "Baseado em tempo (adaptativo)",
|
||||
"cal_source_sensor": "Baseado em sensor",
|
||||
"cal_predicted": "previsto",
|
||||
"cal_confidence_high": "confiança alta",
|
||||
"cal_confidence_medium": "confiança média",
|
||||
"cal_confidence_low": "confiança baixa",
|
||||
"budget_monthly": "Orçamento mensal",
|
||||
"budget_yearly": "Orçamento anual",
|
||||
"groups": "Grupos",
|
||||
"new_group": "Novo grupo",
|
||||
"edit_group": "Editar grupo",
|
||||
"no_groups": "Ainda sem grupos",
|
||||
"delete_group": "Excluir grupo",
|
||||
"delete_group_confirm": "Excluir o grupo '{name}'?",
|
||||
"group_select_tasks": "Selecionar tarefas",
|
||||
"group_name_required": "O nome é obrigatório",
|
||||
"description_optional": "Descrição (opcional)",
|
||||
"selected": "Selecionadas",
|
||||
"loading_chart": "Carregando dados do gráfico...",
|
||||
"hide_outliers": "Ocultar valores atípicos (falhas do sensor)",
|
||||
"was_maintenance_needed": "Esta manutenção era necessária?",
|
||||
"feedback_needed": "Necessária",
|
||||
"feedback_not_needed": "Desnecessária",
|
||||
"feedback_not_sure": "Não sei",
|
||||
"suggested_interval": "Intervalo sugerido",
|
||||
"apply_suggestion": "Aplicar",
|
||||
"reanalyze": "Reanalisar",
|
||||
"reanalyze_result": "Nova análise",
|
||||
"reanalyze_insufficient_data": "Dados insuficientes para gerar uma recomendação",
|
||||
"data_points": "pontos de dados",
|
||||
"dismiss_suggestion": "Dispensar",
|
||||
"confidence_low": "Baixa",
|
||||
"confidence_medium": "Média",
|
||||
"confidence_high": "Alta",
|
||||
"recommended": "recomendado",
|
||||
"seasonal_awareness": "Sazonalidade",
|
||||
"edit_seasonal_overrides": "Editar fatores sazonais",
|
||||
"seasonal_overrides_title": "Fatores sazonais (manual)",
|
||||
"seasonal_overrides_hint": "Fator por mês (0,1–5,0). Vazio = aprendido automaticamente.",
|
||||
"seasonal_override_invalid": "Valor inválido",
|
||||
"seasonal_override_range": "O fator deve estar entre 0,1 e 5,0",
|
||||
"clear_all": "Limpar tudo",
|
||||
"seasonal_chart_title": "Fatores sazonais",
|
||||
"seasonal_learned": "Aprendido",
|
||||
"seasonal_manual": "Manual",
|
||||
"month_jan": "Jan",
|
||||
"month_feb": "Fev",
|
||||
"month_mar": "Mar",
|
||||
"month_apr": "Abr",
|
||||
"month_may": "Mai",
|
||||
"month_jun": "Jun",
|
||||
"month_jul": "Jul",
|
||||
"month_aug": "Ago",
|
||||
"month_sep": "Set",
|
||||
"month_oct": "Out",
|
||||
"month_nov": "Nov",
|
||||
"month_dec": "Dez",
|
||||
"sensor_prediction": "Previsão do sensor",
|
||||
"degradation_trend": "Tendência",
|
||||
"trend_rising": "Subindo",
|
||||
"trend_falling": "Caindo",
|
||||
"trend_stable": "Estável",
|
||||
"trend_insufficient_data": "Dados insuficientes",
|
||||
"days_until_threshold": "Dias até o limite",
|
||||
"threshold_exceeded": "Limite excedido",
|
||||
"environmental_adjustment": "Fator ambiental",
|
||||
"sensor_prediction_urgency": "O sensor prevê atingir o limite em ~{days} dias",
|
||||
"day_short": "dia",
|
||||
"weibull_reliability_curve": "Curva de confiabilidade",
|
||||
"weibull_failure_probability": "Probabilidade de falha",
|
||||
"weibull_r_squared": "R² do ajuste",
|
||||
"beta_early_failures": "Falhas precoces",
|
||||
"beta_random_failures": "Falhas aleatórias",
|
||||
"beta_wear_out": "Desgaste",
|
||||
"beta_highly_predictable": "Altamente previsível",
|
||||
"confidence_interval": "Intervalo de confiança",
|
||||
"confidence_conservative": "Conservador",
|
||||
"confidence_aggressive": "Otimista",
|
||||
"current_interval_marker": "Intervalo atual",
|
||||
"recommended_marker": "Recomendado",
|
||||
"characteristic_life": "Vida característica",
|
||||
"chart_mini_sparkline": "Minigráfico de tendência",
|
||||
"chart_history": "Histórico de custo e duração",
|
||||
"chart_seasonal": "Fatores sazonais, 12 meses",
|
||||
"chart_weibull": "Curva de confiabilidade Weibull",
|
||||
"chart_sparkline": "Gráfico do valor do gatilho do sensor",
|
||||
"days_progress": "Progresso em dias",
|
||||
"qr_code": "Código QR",
|
||||
"qr_generating": "Gerando código QR…",
|
||||
"qr_error": "Falha ao gerar o código QR.",
|
||||
"qr_error_no_url": "Nenhuma URL do HA configurada. Defina uma URL externa ou interna em Configurações → Sistema → Rede.",
|
||||
"save_error": "Falha ao salvar. Tente novamente.",
|
||||
"qr_print": "Imprimir",
|
||||
"qr_download": "Baixar SVG",
|
||||
"qr_action": "Ação ao escanear",
|
||||
"qr_action_view": "Ver informações de manutenção",
|
||||
"qr_action_complete": "Marcar a manutenção como concluída",
|
||||
"qr_url_mode": "Tipo de link",
|
||||
"qr_mode_companion": "Companion App",
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "URL do servidor",
|
||||
"overview": "Visão geral",
|
||||
"analysis": "Análise",
|
||||
"recent_activities": "Atividades recentes",
|
||||
"search_notes": "Pesquisar observações",
|
||||
"avg_cost": "Custo médio",
|
||||
"no_advanced_features": "Nenhum recurso avançado ativado",
|
||||
"no_advanced_features_hint": "Ative “Intervalos adaptativos” ou “Padrões sazonais” nas configurações da integração para ver dados de análise aqui.",
|
||||
"analysis_not_enough_data": "Ainda não há dados suficientes para análise.",
|
||||
"analysis_not_enough_data_hint": "A análise de Weibull exige pelo menos 5 manutenções concluídas; padrões sazonais aparecem após 6+ pontos de dados por mês.",
|
||||
"analysis_manual_task_hint": "Tarefas manuais sem intervalo não geram dados de análise.",
|
||||
"completions": "conclusões",
|
||||
"current": "Atual",
|
||||
"shorter": "Mais curto",
|
||||
"longer": "Mais longo",
|
||||
"normal": "Normal",
|
||||
"disabled": "Desativado",
|
||||
"compound_logic": "Lógica composta",
|
||||
"compound": "Composto (várias condições)",
|
||||
"compound_logic_and": "E — todas as condições devem acionar",
|
||||
"compound_logic_or": "OU — qualquer condição aciona",
|
||||
"compound_help": "Combine várias condições de sensor em um único gatilho.",
|
||||
"compound_no_conditions": "Ainda sem condições — adicione pelo menos uma.",
|
||||
"compound_add_condition": "Adicionar condição",
|
||||
"compound_condition": "Condição",
|
||||
"compound_remove_condition": "Remover condição",
|
||||
"card_title": "Título",
|
||||
"card_show_header": "Mostrar cabeçalho com estatísticas",
|
||||
"card_show_actions": "Mostrar botões de ação",
|
||||
"card_compact": "Modo compacto",
|
||||
"card_max_items": "Máx. de itens (0 = todos)",
|
||||
"card_filter_status": "Filtrar por status",
|
||||
"card_filter_status_help": "Vazio = mostrar todos os status.",
|
||||
"card_filter_objects": "Filtrar por objetos",
|
||||
"card_filter_objects_help": "Vazio = mostrar todos os objetos.",
|
||||
"card_filter_entities": "Filtrar por entidades (entity_ids)",
|
||||
"card_filter_entities_help": "Escolha entidades sensor / binary_sensor desta integração. Vazio = todas.",
|
||||
"card_loading_objects": "Carregando objetos…",
|
||||
"card_load_error": "Não foi possível carregar os objetos — verifique a conexão WebSocket.",
|
||||
"card_no_tasks_title": "Ainda não há tarefas de manutenção",
|
||||
"card_no_tasks_cta": "→ Crie uma no painel de Manutenção",
|
||||
"no_objects": "Ainda não há objetos.",
|
||||
"action_error": "A ação falhou. Tente novamente.",
|
||||
"area_id_optional": "Área (opcional)",
|
||||
"installation_date_optional": "Data de instalação (opcional)",
|
||||
"warranty_expiry_optional": "Fim da garantia (opcional)",
|
||||
"warranty": "Garantia",
|
||||
"warranty_valid_until": "válida até {date}",
|
||||
"warranty_expires_in": "expira em {days} dias",
|
||||
"warranty_expired": "expirada",
|
||||
"cal_past_windows": "Janelas passadas",
|
||||
"cal_forward_windows": "Janelas futuras",
|
||||
"history_edit_title": "Editar entrada do histórico",
|
||||
"history_edit_timestamp": "Data e hora",
|
||||
"manufacturer": "Fabricante",
|
||||
"model": "Modelo",
|
||||
"area": "Área",
|
||||
"actions": "Ações",
|
||||
"view_mode_label": "Visualização",
|
||||
"view_cards": "Cartões",
|
||||
"view_table": "Tabela",
|
||||
"objects_table_columns_label": "Colunas da tabela de objetos",
|
||||
"objects_table_columns_hint": "Escolha quais colunas aparecem na visualização em tabela dos objetos.",
|
||||
"custom_icon_optional": "Ícone (opcional, ex.: mdi:wrench)",
|
||||
"task_enabled": "Tarefa ativada",
|
||||
"skip_reason_prompt": "Pular esta tarefa?",
|
||||
"reason_optional": "Motivo (opcional)",
|
||||
"reset_date_prompt": "Marcar a tarefa como realizada?",
|
||||
"reset_date_optional": "Data da última execução (opcional, padrão: hoje)",
|
||||
"notes_label": "Observações",
|
||||
"documentation_label": "Documentação",
|
||||
"no_nfc_tag": "— Sem tag —",
|
||||
"dashboard": "Painel",
|
||||
"tab_today": "Hoje",
|
||||
"palette_placeholder": "Pesquisar objetos e tarefas…",
|
||||
"palette_no_results": "Nenhum resultado",
|
||||
"palette_hint": "↑↓ para navegar · Enter para abrir · Esc para fechar",
|
||||
"today_all_caught_up": "Tudo em dia! Nada vence esta semana.",
|
||||
"today_overdue": "Atrasadas",
|
||||
"today_due_today": "Vencem hoje",
|
||||
"today_this_week": "Esta semana",
|
||||
"settings": "Configurações",
|
||||
"settings_features": "Recursos avançados",
|
||||
"settings_features_desc": "Ative ou desative recursos avançados. Desativar apenas os oculta da interface, sem excluir dados.",
|
||||
"feat_adaptive": "Agendamento adaptativo",
|
||||
"feat_adaptive_desc": "Aprende intervalos ideais a partir do histórico de manutenção",
|
||||
"feat_predictions": "Previsões de sensor",
|
||||
"feat_predictions_desc": "Prevê datas de acionamento a partir da degradação do sensor",
|
||||
"feat_seasonal": "Ajustes sazonais",
|
||||
"feat_seasonal_desc": "Ajusta intervalos com base em padrões sazonais",
|
||||
"feat_environmental": "Correlação ambiental",
|
||||
"feat_environmental_desc": "Correlaciona intervalos com temperatura/umidade",
|
||||
"feat_budget": "Controle de orçamento",
|
||||
"feat_budget_desc": "Acompanha gastos mensais e anuais de manutenção",
|
||||
"feat_groups": "Grupos de tarefas",
|
||||
"feat_groups_desc": "Organiza tarefas em grupos lógicos",
|
||||
"feat_checklists": "Checklists",
|
||||
"feat_checklists_desc": "Procedimentos em várias etapas para concluir tarefas",
|
||||
"settings_general": "Geral",
|
||||
"settings_default_warning": "Dias de aviso padrão",
|
||||
"settings_panel_enabled": "Painel na barra lateral",
|
||||
"settings_panel_title": "Título do painel na barra lateral",
|
||||
"settings_notifications": "Notificações",
|
||||
"settings_notify_service": "Serviço de notificação",
|
||||
"test_notification": "Notificação de teste",
|
||||
"send_test": "Enviar teste",
|
||||
"testing": "Enviando…",
|
||||
"test_notification_success": "Notificação de teste enviada",
|
||||
"test_notification_failed": "Falha na notificação de teste",
|
||||
"settings_notify_due_soon": "Notificar quando vencer em breve",
|
||||
"settings_notify_overdue": "Notificar quando atrasada",
|
||||
"settings_notify_triggered": "Notificar quando acionada",
|
||||
"settings_interval_hours": "Intervalo de repetição (horas, 0 = uma vez)",
|
||||
"settings_quiet_hours": "Horário de silêncio",
|
||||
"settings_quiet_start": "Início",
|
||||
"settings_quiet_end": "Fim",
|
||||
"settings_max_per_day": "Máx. de notificações por dia (0 = ilimitado)",
|
||||
"settings_bundling": "Agrupar notificações",
|
||||
"settings_bundle_threshold": "Limite para agrupar",
|
||||
"settings_reminder_leads": "Lembretes extras (dias antes do vencimento)",
|
||||
"settings_reminder_leads_hint": "Antecedências separadas por vírgula, ex.: 14, 3, 0 — um lembrete extra é enviado em cada dia correspondente. Vazio = desativado.",
|
||||
"settings_actions": "Botões de ação no celular",
|
||||
"settings_action_complete": "Mostrar botão 'Concluir'",
|
||||
"settings_action_skip": "Mostrar botão 'Pular'",
|
||||
"settings_action_snooze": "Mostrar botão 'Soneca'",
|
||||
"settings_weekly_digest": "Resumo semanal",
|
||||
"settings_weekly_digest_hint": "Uma única notificação de resumo na segunda-feira de manhã quando houver tarefas vencendo.",
|
||||
"settings_warranty_reminder": "Lembrete de fim de garantia",
|
||||
"settings_warranty_reminder_days": "Dias antes do vencimento",
|
||||
"settings_warranty_reminder_hint": "Notifica uma vez quando faltar este número de dias para a garantia de um objeto expirar.",
|
||||
"settings_snooze_hours": "Duração da soneca (horas)",
|
||||
"settings_budget": "Orçamento",
|
||||
"settings_currency": "Moeda",
|
||||
"settings_budget_monthly": "Orçamento mensal",
|
||||
"settings_budget_yearly": "Orçamento anual",
|
||||
"settings_budget_alerts": "Alertas de orçamento",
|
||||
"settings_budget_threshold": "Limite de alerta (%)",
|
||||
"settings_import_export": "Importar / Exportar",
|
||||
"settings_export_json": "Exportar JSON",
|
||||
"settings_export_yaml": "Exportar YAML",
|
||||
"settings_export_csv": "Exportar CSV",
|
||||
"settings_import_csv": "Importar CSV",
|
||||
"settings_import_placeholder": "Cole o conteúdo JSON ou CSV aqui…",
|
||||
"settings_import_btn": "Importar",
|
||||
"settings_import_success": "{count} objetos importados com sucesso.",
|
||||
"settings_export_success": "Exportação baixada.",
|
||||
"settings_saved": "Configuração salva.",
|
||||
"settings_include_history": "Incluir histórico",
|
||||
"settings_export_selection": "Limitar aos objetos selecionados (opcional)",
|
||||
"settings_docs_archive": "Arquivo de documentos (com arquivos)",
|
||||
"settings_docs_archive_hint": "As exportações JSON/YAML/CSV levam apenas as configurações. Este ZIP inclui o conteúdo dos arquivos enviados para que a restauração seja completa.",
|
||||
"settings_docs_export_btn": "Baixar ZIP de documentos",
|
||||
"settings_docs_import_btn": "Restaurar ZIP de documentos",
|
||||
"settings_docs_import_success": "Restaurados: {blobs} arquivos, {docs} documentos",
|
||||
"sort_alphabetical": "Alfabética",
|
||||
"sort_due_soonest": "Vencimento mais próximo",
|
||||
"sort_task_count": "Número de tarefas",
|
||||
"sort_area": "Área",
|
||||
"sort_assigned_user": "Usuário atribuído",
|
||||
"sort_group": "Grupo",
|
||||
"groupby_none": "Sem agrupamento",
|
||||
"groupby_area": "Por área",
|
||||
"groupby_group": "Por grupo",
|
||||
"groupby_user": "Por usuário",
|
||||
"filter_label": "Filtro",
|
||||
"user_label": "Usuário",
|
||||
"sort_label": "Ordenar",
|
||||
"group_by_label": "Agrupar por",
|
||||
"state_value_help": "Use o valor de estado do HA (geralmente minúsculo, ex.: \"on\"/\"off\"). Maiúsculas e minúsculas são normalizadas ao salvar.",
|
||||
"target_changes_help": "Número de transições correspondentes antes de o gatilho disparar (padrão: 1).",
|
||||
"qr_print_title": "Imprimir códigos QR",
|
||||
"qr_print_desc": "Gere uma página imprimível de códigos QR para recortar e colar nos seus equipamentos.",
|
||||
"qr_print_load": "Carregar objetos",
|
||||
"qr_print_filter": "Filtro",
|
||||
"qr_print_objects": "Objetos",
|
||||
"qr_print_actions": "Ações",
|
||||
"qr_print_url_mode": "Tipo de link",
|
||||
"qr_print_estimate": "Códigos QR estimados",
|
||||
"qr_print_over_limit": "o limite é 200, restrinja o filtro",
|
||||
"qr_print_generate": "Gerar códigos QR",
|
||||
"qr_print_generating": "Gerando…",
|
||||
"qr_print_ready": "Códigos QR prontos",
|
||||
"qr_print_print_button": "Imprimir",
|
||||
"qr_print_empty": "Nada para gerar",
|
||||
"qr_action_skip": "Pular",
|
||||
"vacation_title": "Modo férias",
|
||||
"vacation_active": "ativo",
|
||||
"vacation_ended": "encerrado",
|
||||
"vacation_desc": "Planeje as férias: as notificações ficam pausadas durante o período mais uma margem de dias. Você pode reativar tarefas específicas.",
|
||||
"vacation_enable": "Ativar modo férias",
|
||||
"vacation_start": "Início",
|
||||
"vacation_end": "Fim",
|
||||
"vacation_buffer": "Margem (dias)",
|
||||
"vacation_exempt_title": "Notificar mesmo assim durante as férias",
|
||||
"vacation_exempt_desc": "Escolha tarefas que ainda devem notificar durante as férias (ex.: química crítica da piscina).",
|
||||
"vacation_load_tasks": "Carregar tarefas",
|
||||
"vacation_preview_btn": "Mostrar prévia",
|
||||
"vacation_preview_affected": "tarefas afetadas",
|
||||
"vacation_event_due_soon": "passa a vencer em breve",
|
||||
"vacation_event_overdue": "fica atrasada",
|
||||
"vacation_event_triggered_est": "possível acionamento por sensor",
|
||||
"vacation_sensor_based": "(baseado em sensor)",
|
||||
"vacation_action_notify": "Notificar mesmo assim",
|
||||
"vacation_action_unsilence": "Silenciar novamente",
|
||||
"vacation_marked_complete": "Marcada como concluída",
|
||||
"vacation_marked_skip": "Pulada",
|
||||
"vacation_end_now": "Encerrar as férias agora",
|
||||
"add": "Adicionar",
|
||||
"show_stats": "Mostrar estatísticas + gráficos",
|
||||
"hide_stats": "Ocultar estatísticas",
|
||||
"adaptive_no_data": "Ainda não há histórico de conclusões suficiente para a análise adaptativa. Conclua esta tarefa mais algumas vezes para desbloquear recomendações de intervalo e gráficos de confiabilidade.",
|
||||
"suggestion_applied": "Intervalo sugerido aplicado",
|
||||
"vacation_mode": "Modo férias",
|
||||
"vacation_status_active": "Ativo agora",
|
||||
"vacation_status_scheduled": "Agendado",
|
||||
"vacation_status_inactive": "Inativo",
|
||||
"vacation_end_now_confirm": "Encerrar as férias imediatamente?",
|
||||
"vacation_exempt_count": "isentas",
|
||||
"vacation_advanced": "Avançado…",
|
||||
"vacation_open_panel": "Abrir no painel",
|
||||
"enable": "Ativar",
|
||||
"saved": "Salvo",
|
||||
"budget_monthly_set": "Definir mensal",
|
||||
"budget_yearly_set": "Definir anual",
|
||||
"budget_advanced": "Moeda, alertas…",
|
||||
"budget_open_panel": "Abrir no painel",
|
||||
"groups_empty": "Ainda sem grupos.",
|
||||
"group_new_placeholder": "Adicionar grupo…",
|
||||
"group_delete_confirm": "Excluir o grupo \"{name}\"?",
|
||||
"groups_manage_tasks": "Gerenciar atribuições de tarefas…",
|
||||
"groups_open_panel": "Abrir no painel",
|
||||
"unassigned": "Sem atribuição",
|
||||
"no_area": "Sem área",
|
||||
"has_overdue": "Tem tarefas atrasadas",
|
||||
"object": "Objeto",
|
||||
"settings_panel_access": "Acesso ao painel",
|
||||
"settings_panel_access_desc": "Administradores sempre têm acesso total. Para delegar criação, edição e exclusão a não administradores específicos, ative esta opção e selecione-os abaixo — os demais veem apenas Concluir e Pular.",
|
||||
"settings_operator_write": "Permitir que os usuários selecionados criem, editem e excluam",
|
||||
"settings_operator_write_desc": "Desligado: apenas administradores podem alterar o conteúdo. Ligado: os usuários selecionados abaixo também recebem acesso total.",
|
||||
"no_non_admin_users": "Nenhum usuário não administrador encontrado. Adicione em Configurações → Pessoas.",
|
||||
"owner_label": "Proprietário",
|
||||
"feat_completion_actions": "Ações de conclusão",
|
||||
"feat_completion_actions_desc": "Ação do HA por tarefa ao concluir + QR de conclusão rápida com valores predefinidos.",
|
||||
"on_complete_action_title": "Ao concluir: acionar ação do HA (opcional)",
|
||||
"on_complete_action_desc": "Chama um serviço do HA quando a tarefa é concluída — ex.: zerar um contador no dispositivo.",
|
||||
"on_complete_action_service": "Serviço",
|
||||
"on_complete_action_target": "Entidade alvo",
|
||||
"on_complete_action_target_hint": "Atenção: o domínio da entidade deve corresponder ao serviço — ex.: 'button.press' só funciona em button.*, 'counter.increment' só em counter.*, 'input_button.press' só em input_button.* etc. Em caso de divergência, a ação falhará silenciosamente (o HA registra 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Dados (JSON, opcional)",
|
||||
"on_complete_action_test": "Validar configuração",
|
||||
"on_complete_action_test_success": "✓ Configuração válida (a ação só disparará na conclusão da tarefa)",
|
||||
"on_complete_action_test_failed": "Falhou",
|
||||
"quick_complete_defaults_title": "Padrões de conclusão rápida (para leituras de QR, opcional)",
|
||||
"quick_complete_defaults_desc": "Valores predefinidos para conclusões rápidas via QR. Sem eles, o QR abre o diálogo de conclusão.",
|
||||
"quick_complete_defaults_notes": "Observações",
|
||||
"quick_complete_defaults_cost": "Custo",
|
||||
"quick_complete_defaults_duration": "Duração (minutos)",
|
||||
"quick_complete_defaults_feedback_none": "Sem feedback",
|
||||
"quick_complete_defaults_feedback_needed": "Era necessária",
|
||||
"quick_complete_defaults_feedback_not_needed": "Não era necessária",
|
||||
"quick_complete_success": "Concluída rapidamente",
|
||||
"show_all_objects": "Mostrar todos os objetos",
|
||||
"show_all_tasks": "Limpar filtro — mostrar todas as tarefas",
|
||||
"filter_to_overdue": "Filtrar a lista de tarefas para apenas atrasadas",
|
||||
"filter_to_due_soon": "Filtrar a lista de tarefas para apenas vencendo em breve",
|
||||
"filter_to_triggered": "Filtrar a lista de tarefas para apenas acionadas",
|
||||
"open_task": "Abrir tarefa",
|
||||
"show_details": "Mostrar histórico + estatísticas",
|
||||
"hide_details": "Ocultar detalhes",
|
||||
"history_empty": "Ainda sem histórico.",
|
||||
"history_edit_button": "Editar entrada",
|
||||
"total_cost": "Custo total",
|
||||
"times_performed": "Realizada",
|
||||
"older_entries": "mais antigas",
|
||||
"open_in_panel": "Abrir no painel de Manutenção",
|
||||
"skip_reason": "Motivo para pular (opcional)",
|
||||
"reset_to_date": "Redefinir última execução para",
|
||||
"delete_task_confirm": "Excluir esta tarefa e seu histórico?",
|
||||
"delete_object_confirm": "Excluir este objeto e todas as suas tarefas?",
|
||||
"loading": "Carregando…",
|
||||
"archive": "Arquivar",
|
||||
"undo": "Desfazer",
|
||||
"task_archived": "Tarefa arquivada",
|
||||
"object_archived": "Objeto arquivado",
|
||||
"unarchive": "Desarquivar",
|
||||
"archived": "Arquivada",
|
||||
"show_archived": "Mostrar arquivados",
|
||||
"hide_archived": "Ocultar arquivados",
|
||||
"confirm_archive_object": "Arquivar este objeto e suas tarefas? Eles mantêm o histórico e podem ser desarquivados depois.",
|
||||
"settings_archive": "Arquivamento e retenção",
|
||||
"settings_archive_desc": "Aposente tarefas únicas concluídas sem excluí-las. Itens arquivados ficam ocultos e inativos, mas mantêm o histórico e o custo.",
|
||||
"settings_archive_oneoff_days": "Arquivar automaticamente tarefas únicas concluídas após (dias, 0 = desativado)",
|
||||
"settings_delete_archived_oneoff_days": "Excluir automaticamente tarefas únicas arquivadas após (dias, 0 = nunca)",
|
||||
"archive_object": "Arquivar objeto",
|
||||
"unarchive_object": "Desarquivar objeto",
|
||||
"documents": "Documentos",
|
||||
"documents_empty": "Ainda não há documentos.",
|
||||
"doc_upload": "Enviar arquivo",
|
||||
"doc_uploading": "Enviando…",
|
||||
"doc_add_link": "Adicionar link",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Título (opcional)",
|
||||
"doc_open": "Abrir",
|
||||
"doc_delete_confirm": "Excluir \"{name}\"?",
|
||||
"doc_too_large": "O arquivo é muito grande (máx. 25 MB).",
|
||||
"doc_upload_failed": "Falha no envio.",
|
||||
"completion_photo_optional": "Foto da conclusão (opcional)",
|
||||
"add_photo": "Adicionar foto",
|
||||
"uploading": "Enviando…",
|
||||
"remove": "Remover",
|
||||
"doc_deduped": "Já armazenado em outro lugar — compartilhado, sem uso de espaço extra.",
|
||||
"doc_dup_in_object": "Este arquivo já está anexado a este objeto.",
|
||||
"doc_link_invalid": "Apenas links http/https são permitidos.",
|
||||
"doc_cat_manual": "Manual",
|
||||
"doc_cat_warranty": "Garantia",
|
||||
"doc_cat_invoice": "Nota fiscal",
|
||||
"doc_cat_spare_parts": "Peças de reposição",
|
||||
"doc_cat_photo": "Foto",
|
||||
"doc_cat_other": "Outros",
|
||||
"doc_link_badge": "Link",
|
||||
"doc_storage_title": "Armazenamento de documentos",
|
||||
"doc_storage_saved": "Economizado por deduplicação",
|
||||
"doc_storage_refresh": "Atualizar",
|
||||
"doc_download": "Baixar",
|
||||
"doc_close": "Fechar",
|
||||
"doc_camera": "Tirar foto",
|
||||
"doc_drop_hint": "Solte os arquivos aqui",
|
||||
"doc_task_none": "Nenhum documento vinculado a esta tarefa.",
|
||||
"doc_link_existing": "Vincular um documento…",
|
||||
"doc_attach": "Vincular",
|
||||
"doc_unlink": "Desvincular",
|
||||
"doc_page": "Página",
|
||||
"chart_range_7d": "7d",
|
||||
"chart_range_30d": "30d",
|
||||
"chart_range_90d": "90d",
|
||||
"chart_range_1y": "1a",
|
||||
"chart_since_service": "desde a última manutenção",
|
||||
"chart_no_stats": "Sem estatísticas de longo prazo para esta entidade — mostrando apenas valores de eventos de manutenção",
|
||||
"auto_complete_on_recovery": "Concluir automaticamente quando o sensor se recuperar",
|
||||
"auto_complete_on_recovery_help": "Registra uma conclusão (define a última execução) quando o gatilho se resolve sozinho — ex.: sal reposto, filtro trocado.",
|
||||
"doc_search": "Pesquisar documentos…",
|
||||
"doc_search_none": "Nenhum documento correspondente",
|
||||
"link_device_optional": "Vincular a um dispositivo existente (opcional)",
|
||||
"parent_object_optional": "Objeto pai (opcional)",
|
||||
"parent_none": "(Sem pai)",
|
||||
"paused": "Pausado",
|
||||
"pause_object": "Pausar",
|
||||
"resume_object": "Retomar",
|
||||
"pause_until_prompt": "Congele os agendamentos deste objeto — nada vence e nada notifica até que ele seja retomado. Opcionalmente, defina uma data de retomada automática.",
|
||||
"pause_until_label": "Retomar em (opcional)",
|
||||
"object_paused": "Objeto pausado",
|
||||
"object_resumed": "Objeto retomado — agendamentos reiniciados",
|
||||
"object_paused_badge": "Pausado",
|
||||
"paused_until_label": "até",
|
||||
"replace_object": "Substituir…",
|
||||
"replace_object_prompt": "Aposente este objeto e crie um sucessor. O histórico e os custos ficam arquivados no antigo; as tarefas e os documentos passam para o novo, e os contadores recomeçam do zero.",
|
||||
"replace_name_label": "Nome do sucessor",
|
||||
"object_replaced": "Objeto substituído — sucessor criado",
|
||||
"reading_unit_label": "Unidade da leitura (ex.: kWh, m³)",
|
||||
"reading_unit_help": "Exibida ao lado do valor registrado ao concluir esta tarefa.",
|
||||
"reading_value_label": "Valor da leitura",
|
||||
"reading_label": "Leitura",
|
||||
"settings_templates_label": "Galeria de modelos",
|
||||
"settings_templates_hint": "Desmarque os modelos de que você nunca precisará — eles somem dos seletores \"A partir de modelo\" (painel e fluxo de configuração). Nada mais muda; você pode reativá-los a qualquer momento.",
|
||||
"worksheet": "Folha de trabalho",
|
||||
"worksheet_scan_view": "Escaneie para abrir a tarefa",
|
||||
"worksheet_scan_complete": "Escaneie para concluir",
|
||||
"worksheet_manual_excerpt": "Trecho do manual",
|
||||
"worksheet_pages": "páginas",
|
||||
"worksheet_printed": "Impressa em",
|
||||
"worksheet_never": "Nunca",
|
||||
"card_all_caught_up": "Tudo em dia — nada precisa de atenção",
|
||||
"postpone": "Adiar",
|
||||
"postpone_date_prompt": "Adiar esta ocorrência para qual data?",
|
||||
"postpone_date_label": "Nova data de vencimento",
|
||||
"postponed": "Adiada",
|
||||
"postponed_to": "Adiada para",
|
||||
"season_window_label": "Janela sazonal (meses)",
|
||||
"season_window_hint": "Vence apenas nos meses selecionados; datas fora de temporada passam para o próximo mês ativo. Nenhum = o ano todo.",
|
||||
"series_end_label": "Termina",
|
||||
"series_end_never": "Nunca (repete indefinidamente)",
|
||||
"series_end_after_count": "Após um número de vezes",
|
||||
"series_end_until": "Em uma data",
|
||||
"series_end_count_label": "Número de vezes",
|
||||
"series_end_until_label": "Data final",
|
||||
"parts_section": "Peças e consumíveis",
|
||||
"part_add": "Adicionar peça",
|
||||
"part_name": "Nome",
|
||||
"part_vendor": "Fabricante",
|
||||
"part_storage_location": "Local de armazenamento",
|
||||
"part_product_url": "URL do produto",
|
||||
"part_unit": "Unidade",
|
||||
"part_cost": "Preço unitário",
|
||||
"part_stock": "Estoque",
|
||||
"part_reorder_threshold": "Repor em",
|
||||
"part_restock_quantity": "Quantidade de reposição",
|
||||
"part_auto_buy": "Criar tarefa de compra automaticamente quando estiver baixo",
|
||||
"part_restock": "Ajustar estoque",
|
||||
"restock_quantity_label": "Quantidade comprada",
|
||||
"consumes_parts_label": "Consome peças",
|
||||
"parts_load_failed": "Não foi possível carregar as peças deste objeto — as opções de consumo de peças estão indisponíveis no momento.",
|
||||
"adopt_problem_button": "Adotar sensores de problema",
|
||||
"adopt_problem_title": "Adotar sensores de problema",
|
||||
"adopt_problem_hint": "Transforme sensores de problema do HA (erros de impressora, avisos de filtro, bateria fraca) em tarefas de manutenção que são acionadas enquanto o problema está ativo e se resolvem sozinhas quando ele desaparece.",
|
||||
"adopt_problem_none": "Nenhum sensor de problema encontrado que ainda não seja acompanhado.",
|
||||
"adopt_problem_active": "ativo",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(novo)",
|
||||
"adopt_problem_adopt": "Adotar selecionados",
|
||||
"adopt_problem_done": "{tasks} sensor(es) de problema adotado(s)",
|
||||
"views_label": "Visualizações",
|
||||
"views_none": "— Nenhuma visualização —",
|
||||
"views_manage": "Salvar / gerenciar visualizações",
|
||||
"views_dialog_title": "Visualizações salvas",
|
||||
"views_dialog_hint": "Salve os filtros atuais como uma visualização nomeada que todos podem reutilizar.",
|
||||
"views_name_placeholder": "Nome da visualização",
|
||||
"views_save_current": "Salvar filtros atuais",
|
||||
"views_none_yet": "Ainda não há visualizações salvas.",
|
||||
"close": "Fechar",
|
||||
"trigger_hint_now": "O sensor lê {value} neste momento.",
|
||||
"trigger_hint_above": "A tarefa é acionada quando o valor sobe acima de {target}.",
|
||||
"trigger_hint_below": "É acionada quando o valor cai abaixo de {target}.",
|
||||
"trigger_hint_counter_delta": "Conta a partir da leitura atual ({value}): vence em {due} (+{target}), e a contagem recomeça após cada conclusão.",
|
||||
"trigger_hint_counter_delta_edit": "Conta o uso desde a última conclusão: vence após +{target}; a contagem recomeça após cada conclusão.",
|
||||
"trigger_hint_counter_abs": "A tarefa vence quando o sensor atinge {target}.",
|
||||
"trigger_hint_runtime": "A tarefa vence após {hours} h de funcionamento acumulado; o contador recomeça após cada conclusão.",
|
||||
"trigger_hint_state_change": "A tarefa vence após {count} mudança(s) de estado.",
|
||||
"trigger_hint_state_change_to": "A tarefa vence após {count} mudança(s) para “{state}”.",
|
||||
"trigger_hint_state_now": "Estado atual: {value}.",
|
||||
"adopt_problem_part": "Usa a peça: {name}",
|
||||
"label_filter": "Etiqueta",
|
||||
"all_labels": "Todas as etiquetas",
|
||||
"settings_notify_scope": "Notificar apenas para a visualização",
|
||||
"settings_notify_scope_all": "Todas as tarefas",
|
||||
"settings_notify_scope_hint": "Apenas tarefas que correspondem aos filtros de etiqueta/usuário da visualização salva selecionada enviam lembretes. Status, ordenação e agrupamento da visualização são ignorados aqui.",
|
||||
"card_saved_view": "Visualização salva",
|
||||
"card_saved_view_none": "Nenhuma",
|
||||
"card_saved_view_help": "Aplica os filtros de status, usuário e etiqueta da visualização por cima dos filtros acima. A ordenação e o agrupamento da visualização são configurações de exibição do painel e não se aplicam ao cartão.",
|
||||
"doc_part_none": "Nenhum documento vinculado a esta peça.",
|
||||
"settings_templates_toggle_group": "Ativar ou desativar todos os modelos deste grupo",
|
||||
"setups_button": "Configurações sugeridas",
|
||||
"setups_title": "Configurações sugeridas (Beta)",
|
||||
"setups_hint": "Dispositivos de integrações compatíveis cujos sensores de consumíveis podem alimentar tarefas de manutenção. Adotar cria o objeto e conecta cada tarefa ao seu sensor — ela é acionada quando o consumível fica baixo e se resolve sozinha após a troca.",
|
||||
"setups_none": "Nenhum dispositivo compatível com sensores de consumíveis ainda não conectados foi encontrado.",
|
||||
"setups_adopt": "Configurar selecionados",
|
||||
"setups_done": "{tasks} tarefas conectadas a sensores foram criadas.",
|
||||
"complete_parts_used": "Peças usadas desta vez",
|
||||
"part_delete_confirm": "Excluir a peça '{name}'? O controle de estoque, os vínculos com tarefas e qualquer lembrete de compra aberto serão removidos.",
|
||||
"baseline_start_value": "Leitura inicial (opcional)",
|
||||
"baseline_start_help": "A contagem começa a partir desta leitura. Deixe vazio para contar a partir do valor atual; informe a leitura da última manutenção para que o uso desde então já seja contado.",
|
||||
"setups_baseline_hint": "leitura na última manutenção (opcional)",
|
||||
"baseline_start_help_edit": "Deixe vazio para manter a contagem existente. Informar um valor reancora a contagem (ex.: a leitura da última manutenção).",
|
||||
"baseline_current_effective": "Valor inicial efetivo atual: {value}",
|
||||
"runtime_on_states": "Estados ativos (separados por vírgula)",
|
||||
"runtime_on_states_help": "Estados que contam como em funcionamento — padrão: on. Ex.: mowing, cleaning, printing. Com um atributo selecionado, os valores dele são comparados.",
|
||||
"setups_target_new": "Criar novo: {name}",
|
||||
"schedule_preview_title": "Próximas datas",
|
||||
"schedule_preview_ontime": "Supondo conclusão em dia.",
|
||||
"schedule_preview_ends": "(a série termina)",
|
||||
"adopt_problem_responsible": "Usuário responsável por todas as tarefas adotadas (opcional)",
|
||||
"adopt_problem_configure": "Configurar",
|
||||
"history_auto": "Automática",
|
||||
"battery_fleet_title": "Frota de baterias",
|
||||
"battery_fleet_none_low": "Todas as baterias OK — nada a substituir.",
|
||||
"battery_fleet_buy_now": "Comprar agora",
|
||||
"battery_fleet_soon": "Necessárias em breve",
|
||||
"battery_fleet_soon_hint": "Previsto a partir da data da última troca — compre com antecedência.",
|
||||
"battery_fleet_mark_all": "Marcar todas como trocadas",
|
||||
"battery_fleet_mark_one": "Marcar esta bateria como trocada",
|
||||
"battery_fleet_offline": "offline",
|
||||
"battery_fleet_trigger_lost": "O gatilho do sensor desta tarefa foi perdido — ela não será acionada nem concluída automaticamente.",
|
||||
"battery_fleet_repair": "Reparar",
|
||||
"battery_fleet_exclude": "Remover da frota",
|
||||
"battery_fleet_excluded": "Removida",
|
||||
"battery_fleet_include": "Acompanhar novamente",
|
||||
"battery_fleet_total": "{n} baterias acompanhadas",
|
||||
"battery_fleet_setup_button": "Frota de baterias",
|
||||
"battery_fleet_setup_done": "Frota de baterias configurada — uma única tarefa acompanha todas as suas baterias.",
|
||||
"update_banner": "Há uma versão mais nova do Maintenance Supporter no servidor — recarregue para atualizar o painel.",
|
||||
"update_reload": "Recarregar"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Bakım",
|
||||
"objects": "Nesneler",
|
||||
"tasks": "Görevler",
|
||||
"overdue": "Gecikmiş",
|
||||
"due_soon": "Yaklaşan",
|
||||
"triggered": "Tetiklendi",
|
||||
"trigger_replaced": "Tetikleyici değiştirildi",
|
||||
"ok": "Tamam",
|
||||
"all": "Tümü",
|
||||
"new_object": "+ Yeni Nesne",
|
||||
"templates_from": "Şablondan",
|
||||
"templates_title": "Bir şablonla başlayın",
|
||||
"templates_task_count": "{n} görev",
|
||||
"template_created": "Şablondan oluşturuldu",
|
||||
"onboard_hint": "Bakım takibine başlamak için ilk nesnenizi ekleyin.",
|
||||
"edit": "Düzenle",
|
||||
"duplicate": "Çoğalt",
|
||||
"task_duplicated": "Görev çoğaltıldı",
|
||||
"object_duplicated": "Nesne çoğaltıldı",
|
||||
"delete": "Sil",
|
||||
"add_task": "+ Görev Ekle",
|
||||
"complete": "Tamamla",
|
||||
"completed": "Tamamlandı",
|
||||
"skip": "Atla",
|
||||
"skipped": "Atlandı",
|
||||
"missed": "Kaçırıldı",
|
||||
"reset": "Sıfırla",
|
||||
"snooze": "Ertele",
|
||||
"snoozed": "Ertelendi",
|
||||
"cancel": "İptal",
|
||||
"bulk_select": "Seç",
|
||||
"bulk_select_all": "Tümünü seç",
|
||||
"bulk_n_selected": "{n} seçildi",
|
||||
"bulk_completed": "{n} görev tamamlandı",
|
||||
"bulk_archived": "{n} görev arşivlendi",
|
||||
"completing": "Tamamlanıyor…",
|
||||
"interval": "Aralık",
|
||||
"warning": "Uyarı",
|
||||
"last_performed": "Son yapılma",
|
||||
"next_due": "Sonraki vade",
|
||||
"days_until_due": "Vadeye kalan gün",
|
||||
"avg_duration": "Ort. süre",
|
||||
"trigger": "Tetikleyici",
|
||||
"trigger_type": "Tetikleyici türü",
|
||||
"threshold_above": "Üst sınır",
|
||||
"threshold_below": "Alt sınır",
|
||||
"threshold": "Eşik",
|
||||
"counter": "Sayaç",
|
||||
"state_change": "Durum değişikliği",
|
||||
"runtime": "Çalışma süresi",
|
||||
"runtime_hours": "Hedef çalışma süresi (saat)",
|
||||
"target_value": "Hedef değer",
|
||||
"baseline": "Başlangıç değeri",
|
||||
"target_changes": "Hedef değişiklik sayısı",
|
||||
"for_minutes": "Süre (dakika)",
|
||||
"time_based": "Zamana dayalı",
|
||||
"sensor_based": "Sensöre dayalı",
|
||||
"manual": "Manuel",
|
||||
"one_time": "Tek seferlik",
|
||||
"weekdays": "Haftanın günleri",
|
||||
"nth_weekday": "Ayın n. hafta günü",
|
||||
"day_of_month": "Ayın günü",
|
||||
"recurrence_on_days": "Tekrar günleri",
|
||||
"recurrence_occurrence": "Kaçıncı",
|
||||
"recurrence_weekday": "Haftanın günü",
|
||||
"recurrence_day": "Ayın günü (1–31)",
|
||||
"recurrence_last_day": "Ayın son günü",
|
||||
"recurrence_business_day": "Yalnızca iş günleri (hafta sonundan geriye kaydır)",
|
||||
"recurrence_offset": "Kaydırma (gün, ±)",
|
||||
"recurrence_offset_help": "Tarihi ±N gün kaydırır, örn. -2 = iki gün önce.",
|
||||
"last_day_month": "Ayın son günü",
|
||||
"last_business_day_month": "Son iş günü",
|
||||
"ord_1": "1.",
|
||||
"ord_2": "2.",
|
||||
"ord_3": "3.",
|
||||
"ord_4": "4.",
|
||||
"ord_5": "5.",
|
||||
"ord_last": "Son",
|
||||
"day_word": "Gün",
|
||||
"interval_value": "Aralık",
|
||||
"interval_unit": "Birim",
|
||||
"unit_days": "Gün",
|
||||
"unit_weeks": "Hafta",
|
||||
"unit_months": "Ay",
|
||||
"unit_years": "Yıl",
|
||||
"due_date": "Vade tarihi",
|
||||
"cleaning": "Temizlik",
|
||||
"inspection": "Kontrol",
|
||||
"replacement": "Değişim",
|
||||
"calibration": "Kalibrasyon",
|
||||
"service": "Servis",
|
||||
"reading": "Okuma",
|
||||
"custom": "Özel",
|
||||
"history": "Geçmiş",
|
||||
"cost": "Maliyet",
|
||||
"report_button": "Rapor",
|
||||
"report_title": "Bakım raporu",
|
||||
"report_generated": "Oluşturulma",
|
||||
"report_times_done": "Yapıldı",
|
||||
"report_total_cost": "Toplam maliyet",
|
||||
"report_every": "her {n} {unit}",
|
||||
"report_notes": "Notlar",
|
||||
"report_col_type": "Tür",
|
||||
"report_col_status": "Durum",
|
||||
"report_col_schedule": "Zamanlama",
|
||||
"duration": "Süre",
|
||||
"both": "Her ikisi",
|
||||
"trigger_val": "Tetikleme değeri",
|
||||
"complete_title": "Tamamla: ",
|
||||
"checklist": "Kontrol listesi",
|
||||
"checklist_steps_optional": "Kontrol listesi adımları (isteğe bağlı)",
|
||||
"checklist_placeholder": "Filtreyi temizle\nContayı değiştir\nBasıncı test et",
|
||||
"checklist_help": "Her satıra bir adım. En fazla 100 madde.",
|
||||
"err_too_long": "{field}: çok uzun (en fazla {n} karakter)",
|
||||
"err_too_short": "{field}: çok kısa (en az {n} karakter)",
|
||||
"err_value_too_high": "{field}: çok büyük (en fazla {n})",
|
||||
"err_value_too_low": "{field}: çok küçük (en az {n})",
|
||||
"err_required": "{field}: zorunlu",
|
||||
"err_wrong_type": "{field}: yanlış tür (beklenen: {type})",
|
||||
"err_invalid_choice": "{field}: izin verilen bir değer değil",
|
||||
"err_invalid_value": "{field}: geçersiz değer",
|
||||
"feat_schedule_time": "Gün içi saat zamanlaması",
|
||||
"feat_schedule_time_desc": "Görevler gece yarısı yerine günün belirli bir saatinde gecikmiş olur.",
|
||||
"schedule_time_optional": "Vade saati (isteğe bağlı, SS:DD)",
|
||||
"schedule_time_help": "Boş = gece yarısı (varsayılan). HA saat dilimi.",
|
||||
"at_time": "saat",
|
||||
"notes_optional": "Notlar (isteğe bağlı)",
|
||||
"cost_optional": "Maliyet (isteğe bağlı)",
|
||||
"duration_minutes": "Dakika cinsinden süre (isteğe bağlı)",
|
||||
"days": "gün",
|
||||
"day": "gün",
|
||||
"today": "Bugün",
|
||||
"d_overdue": "g gecikmiş",
|
||||
"no_tasks": "Henüz bakım görevi yok. Başlamak için bir nesne oluşturun.",
|
||||
"no_tasks_short": "Görev yok",
|
||||
"no_history": "Henüz geçmiş kaydı yok.",
|
||||
"show_all": "Tümünü göster",
|
||||
"cost_duration_chart": "Maliyet ve Süre",
|
||||
"installed": "Kurulum",
|
||||
"confirm_delete_object": "Bu nesne ve tüm görevleri silinsin mi?",
|
||||
"confirm_delete_task": "Bu görev silinsin mi?",
|
||||
"min": "Min",
|
||||
"max": "Maks",
|
||||
"save": "Kaydet",
|
||||
"saving": "Kaydediliyor…",
|
||||
"edit_task": "Görevi Düzenle",
|
||||
"new_task": "Yeni Bakım Görevi",
|
||||
"task_name": "Görev adı",
|
||||
"maintenance_type": "Bakım türü",
|
||||
"priority": "Öncelik",
|
||||
"labels": "Etiketler",
|
||||
"labels_placeholder": "örn. güvenlik, mevsimlik, kiracıya görünür",
|
||||
"labels_help": "Filtreleme ve raporlama için virgülle ayrılmış etiketler.",
|
||||
"priority_low": "Düşük",
|
||||
"priority_normal": "Normal",
|
||||
"priority_high": "Yüksek",
|
||||
"schedule_type": "Zamanlama türü",
|
||||
"interval_days": "Aralık (gün)",
|
||||
"warning_days": "Uyarı günleri",
|
||||
"earliest_completion_days": "En erken tamamlama (vadeden gün önce)",
|
||||
"earliest_completion_days_help": "Her zaman tamamlanabilmesi için boş bırakın. 0 = yalnızca vade gününde veya sonrasında.",
|
||||
"last_performed_optional": "Son yapılma (isteğe bağlı)",
|
||||
"interval_anchor": "Aralık referansı",
|
||||
"anchor_completion": "Tamamlama tarihinden",
|
||||
"anchor_planned": "Planlanan tarihten (kayma olmaz)",
|
||||
"edit_object": "Nesneyi Düzenle",
|
||||
"name": "Ad",
|
||||
"manufacturer_optional": "Üretici (isteğe bağlı)",
|
||||
"model_optional": "Model (isteğe bağlı)",
|
||||
"serial_number_optional": "Seri numarası (isteğe bağlı)",
|
||||
"serial_number_label": "S/N",
|
||||
"documentation_url_label": "Kılavuz",
|
||||
"object_notes_label": "Notlar",
|
||||
"sort_due_date": "Vade tarihi",
|
||||
"sort_object": "Nesne adı",
|
||||
"sort_type": "Tür",
|
||||
"sort_task_name": "Görev adı",
|
||||
"all_objects": "Tüm nesneler",
|
||||
"tasks_lower": "görev",
|
||||
"no_tasks_yet": "Henüz görev yok",
|
||||
"add_first_task": "İlk görevi ekle",
|
||||
"trigger_configuration": "Tetikleyici Yapılandırması",
|
||||
"entity_id": "Varlık kimliği",
|
||||
"comma_separated": "virgülle ayrılmış",
|
||||
"entity_logic": "Varlık mantığı",
|
||||
"entity_logic_any": "Herhangi bir varlık tetikler",
|
||||
"entity_logic_all": "Tüm varlıklar tetiklemeli",
|
||||
"entities": "varlık",
|
||||
"attribute_optional": "Öznitelik (isteğe bağlı, boş = durum)",
|
||||
"use_entity_state": "Varlık durumunu kullan (öznitelik yok)",
|
||||
"trigger_above": "Üstünde tetikle",
|
||||
"trigger_below": "Altında tetikle",
|
||||
"for_at_least_minutes": "En az (dakika)",
|
||||
"safety_interval_days": "Güvenlik aralığı (gün, isteğe bağlı)",
|
||||
"safety_interval": "Güvenlik aralığı (isteğe bağlı)",
|
||||
"delta_mode": "Fark modu",
|
||||
"from_state_optional": "Başlangıç durumu (isteğe bağlı)",
|
||||
"to_state_optional": "Hedef durum (isteğe bağlı)",
|
||||
"documentation_url_optional": "Dokümantasyon URL'si (isteğe bağlı)",
|
||||
"object_notes_optional": "Notlar (isteğe bağlı)",
|
||||
"nfc_tag_id_optional": "NFC Etiket Kimliği (isteğe bağlı)",
|
||||
"nfc_tags_empty_help": "Home Assistant'ta henüz kayıtlı NFC etiketi yok.",
|
||||
"nfc_tags_open_settings": "Etiket ayarlarını aç",
|
||||
"nfc_tags_refresh": "Yenile",
|
||||
"environmental_entity_optional": "Çevresel sensör (isteğe bağlı)",
|
||||
"environmental_entity_helper": "örn. sensor.outdoor_temperature — aralığı çevresel koşullara göre ayarlar",
|
||||
"environmental_attribute_optional": "Çevresel öznitelik (isteğe bağlı)",
|
||||
"nfc_tag_id": "NFC Etiket Kimliği",
|
||||
"nfc_linked": "NFC etiketi bağlandı",
|
||||
"nfc_link_hint": "NFC etiketi bağlamak için tıklayın",
|
||||
"responsible_user": "Sorumlu Kullanıcı",
|
||||
"shared_with": "Paylaşılanlar (rotasyon)",
|
||||
"shared_with_help": "Bu görevi paylaşmak için birden fazla kişi seçin; sorumlu kişi her tamamlamada sırayla değişir.",
|
||||
"rotation_strategy": "Rotasyon",
|
||||
"rotation_none": "Rotasyon yok",
|
||||
"rotation_round_robin": "Sırayla",
|
||||
"rotation_least_completed": "En az tamamlayan",
|
||||
"rotation_random": "Rastgele",
|
||||
"no_user_assigned": "(Kullanıcı atanmadı)",
|
||||
"all_users": "Tüm Kullanıcılar",
|
||||
"my_tasks": "Görevlerim",
|
||||
"tab_calendar": "Takvim",
|
||||
"cal_no_events": "Bakım yok",
|
||||
"cal_window_7": "7 gün",
|
||||
"cal_window_14": "14 gün",
|
||||
"cal_window_30": "30 gün",
|
||||
"cal_window_365": "1 yıl",
|
||||
"cal_every_n_days": "her {n} günde bir",
|
||||
"cal_source_time": "Zamana dayalı",
|
||||
"cal_source_time_adaptive": "Zamana dayalı (uyarlanabilir)",
|
||||
"cal_source_sensor": "Sensöre dayalı",
|
||||
"cal_predicted": "tahmini",
|
||||
"cal_confidence_high": "yüksek güven",
|
||||
"cal_confidence_medium": "orta güven",
|
||||
"cal_confidence_low": "düşük güven",
|
||||
"budget_monthly": "Aylık bütçe",
|
||||
"budget_yearly": "Yıllık bütçe",
|
||||
"groups": "Gruplar",
|
||||
"new_group": "Yeni grup",
|
||||
"edit_group": "Grubu düzenle",
|
||||
"no_groups": "Henüz grup yok",
|
||||
"delete_group": "Grubu sil",
|
||||
"delete_group_confirm": "'{name}' grubu silinsin mi?",
|
||||
"group_select_tasks": "Görevleri seç",
|
||||
"group_name_required": "Ad zorunludur",
|
||||
"description_optional": "Açıklama (isteğe bağlı)",
|
||||
"selected": "Seçili",
|
||||
"loading_chart": "Grafik verileri yükleniyor...",
|
||||
"hide_outliers": "Aykırı değerleri gizle (sensör hataları)",
|
||||
"was_maintenance_needed": "Bu bakım gerekli miydi?",
|
||||
"feedback_needed": "Gerekliydi",
|
||||
"feedback_not_needed": "Gerekli değildi",
|
||||
"feedback_not_sure": "Emin değilim",
|
||||
"suggested_interval": "Önerilen aralık",
|
||||
"apply_suggestion": "Uygula",
|
||||
"reanalyze": "Yeniden analiz et",
|
||||
"reanalyze_result": "Yeni analiz",
|
||||
"reanalyze_insufficient_data": "Öneri üretmek için yeterli veri yok",
|
||||
"data_points": "veri noktası",
|
||||
"dismiss_suggestion": "Yoksay",
|
||||
"confidence_low": "Düşük",
|
||||
"confidence_medium": "Orta",
|
||||
"confidence_high": "Yüksek",
|
||||
"recommended": "önerilen",
|
||||
"seasonal_awareness": "Mevsimsel Farkındalık",
|
||||
"edit_seasonal_overrides": "Mevsimsel faktörleri düzenle",
|
||||
"seasonal_overrides_title": "Mevsimsel faktörler (elle ayar)",
|
||||
"seasonal_overrides_hint": "Ay başına faktör (0.1–5.0). Boş = otomatik öğrenilir.",
|
||||
"seasonal_override_invalid": "Geçersiz değer",
|
||||
"seasonal_override_range": "Faktör 0.1 ile 5.0 arasında olmalıdır",
|
||||
"clear_all": "Tümünü temizle",
|
||||
"seasonal_chart_title": "Mevsimsel Faktörler",
|
||||
"seasonal_learned": "Öğrenilmiş",
|
||||
"seasonal_manual": "Manuel",
|
||||
"month_jan": "Oca",
|
||||
"month_feb": "Şub",
|
||||
"month_mar": "Mar",
|
||||
"month_apr": "Nis",
|
||||
"month_may": "May",
|
||||
"month_jun": "Haz",
|
||||
"month_jul": "Tem",
|
||||
"month_aug": "Ağu",
|
||||
"month_sep": "Eyl",
|
||||
"month_oct": "Eki",
|
||||
"month_nov": "Kas",
|
||||
"month_dec": "Ara",
|
||||
"sensor_prediction": "Sensör Tahmini",
|
||||
"degradation_trend": "Eğilim",
|
||||
"trend_rising": "Yükseliyor",
|
||||
"trend_falling": "Düşüyor",
|
||||
"trend_stable": "Sabit",
|
||||
"trend_insufficient_data": "Yetersiz veri",
|
||||
"days_until_threshold": "Eşiğe kalan gün",
|
||||
"threshold_exceeded": "Eşik aşıldı",
|
||||
"environmental_adjustment": "Çevresel faktör",
|
||||
"sensor_prediction_urgency": "Sensör, eşiğe ~{days} gün kaldığını öngörüyor",
|
||||
"day_short": "gün",
|
||||
"weibull_reliability_curve": "Güvenilirlik Eğrisi",
|
||||
"weibull_failure_probability": "Arıza Olasılığı",
|
||||
"weibull_r_squared": "Uyum R²",
|
||||
"beta_early_failures": "Erken Arızalar",
|
||||
"beta_random_failures": "Rastgele Arızalar",
|
||||
"beta_wear_out": "Aşınma",
|
||||
"beta_highly_predictable": "Yüksek Öngörülebilirlik",
|
||||
"confidence_interval": "Güven Aralığı",
|
||||
"confidence_conservative": "Temkinli",
|
||||
"confidence_aggressive": "İyimser",
|
||||
"current_interval_marker": "Mevcut aralık",
|
||||
"recommended_marker": "Önerilen",
|
||||
"characteristic_life": "Karakteristik ömür",
|
||||
"chart_mini_sparkline": "Eğilim mini grafiği",
|
||||
"chart_history": "Maliyet ve süre geçmişi",
|
||||
"chart_seasonal": "Mevsimsel faktörler, 12 ay",
|
||||
"chart_weibull": "Weibull güvenilirlik eğrisi",
|
||||
"chart_sparkline": "Sensör tetikleme değeri grafiği",
|
||||
"days_progress": "Gün ilerlemesi",
|
||||
"qr_code": "QR Kodu",
|
||||
"qr_generating": "QR kodu oluşturuluyor…",
|
||||
"qr_error": "QR kodu oluşturulamadı.",
|
||||
"qr_error_no_url": "Yapılandırılmış bir HA URL'si yok. Lütfen Ayarlar → Sistem → Ağ bölümünden bir dış veya iç URL ayarlayın.",
|
||||
"save_error": "Kaydedilemedi. Lütfen tekrar deneyin.",
|
||||
"qr_print": "Yazdır",
|
||||
"qr_download": "SVG indir",
|
||||
"qr_action": "Tarama eylemi",
|
||||
"qr_action_view": "Bakım bilgisini görüntüle",
|
||||
"qr_action_complete": "Bakımı tamamlandı olarak işaretle",
|
||||
"qr_url_mode": "Bağlantı türü",
|
||||
"qr_mode_companion": "Companion uygulaması",
|
||||
"qr_mode_local": "Yerel (mDNS)",
|
||||
"qr_mode_server": "Sunucu URL'si",
|
||||
"overview": "Genel Bakış",
|
||||
"analysis": "Analiz",
|
||||
"recent_activities": "Son Etkinlikler",
|
||||
"search_notes": "Notlarda ara",
|
||||
"avg_cost": "Ort. Maliyet",
|
||||
"no_advanced_features": "Etkin gelişmiş özellik yok",
|
||||
"no_advanced_features_hint": "Burada analiz verilerini görmek için entegrasyon ayarlarından “Uyarlanabilir Aralıklar” veya “Mevsimsel Desenler” özelliğini etkinleştirin.",
|
||||
"analysis_not_enough_data": "Analiz için henüz yeterli veri yok.",
|
||||
"analysis_not_enough_data_hint": "Weibull analizi en az 5 tamamlanmış bakım gerektirir; mevsimsel desenler ay başına 6+ veri noktasından sonra görünür olur.",
|
||||
"analysis_manual_task_hint": "Aralığı olmayan manuel görevler analiz verisi üretmez.",
|
||||
"completions": "tamamlama",
|
||||
"current": "Mevcut",
|
||||
"shorter": "Daha kısa",
|
||||
"longer": "Daha uzun",
|
||||
"normal": "Normal",
|
||||
"disabled": "Devre dışı",
|
||||
"compound_logic": "Bileşik mantık",
|
||||
"compound": "Bileşik (birden fazla koşul)",
|
||||
"compound_logic_and": "VE — tüm koşullar tetiklenmeli",
|
||||
"compound_logic_or": "VEYA — herhangi bir koşul tetikler",
|
||||
"compound_help": "Birden fazla sensör koşulunu tek bir tetikleyicide birleştirin.",
|
||||
"compound_no_conditions": "Henüz koşul yok — en az bir tane ekleyin.",
|
||||
"compound_add_condition": "Koşul ekle",
|
||||
"compound_condition": "Koşul",
|
||||
"compound_remove_condition": "Koşulu kaldır",
|
||||
"card_title": "Başlık",
|
||||
"card_show_header": "İstatistikli başlığı göster",
|
||||
"card_show_actions": "Eylem düğmelerini göster",
|
||||
"card_compact": "Kompakt mod",
|
||||
"card_max_items": "En fazla öğe (0 = tümü)",
|
||||
"card_filter_status": "Duruma göre filtrele",
|
||||
"card_filter_status_help": "Boş = tüm durumları göster.",
|
||||
"card_filter_objects": "Nesnelere göre filtrele",
|
||||
"card_filter_objects_help": "Boş = tüm nesneleri göster.",
|
||||
"card_filter_entities": "Varlıklara göre filtrele (entity_id)",
|
||||
"card_filter_entities_help": "Bu entegrasyonun sensor / binary_sensor varlıklarını seçin. Boş = tümü.",
|
||||
"card_loading_objects": "Nesneler yükleniyor…",
|
||||
"card_load_error": "Nesneler yüklenemedi — WebSocket bağlantısını kontrol edin.",
|
||||
"card_no_tasks_title": "Henüz bakım görevi yok",
|
||||
"card_no_tasks_cta": "→ Bakım panelinde bir tane oluşturun",
|
||||
"no_objects": "Henüz nesne yok.",
|
||||
"action_error": "Eylem başarısız oldu. Lütfen tekrar deneyin.",
|
||||
"area_id_optional": "Alan (isteğe bağlı)",
|
||||
"installation_date_optional": "Kurulum tarihi (isteğe bağlı)",
|
||||
"warranty_expiry_optional": "Garanti bitişi (isteğe bağlı)",
|
||||
"warranty": "Garanti",
|
||||
"warranty_valid_until": "{date} tarihine kadar geçerli",
|
||||
"warranty_expires_in": "{days} gün içinde sona eriyor",
|
||||
"warranty_expired": "süresi doldu",
|
||||
"cal_past_windows": "Geçmiş dönemler",
|
||||
"cal_forward_windows": "Gelecek dönemler",
|
||||
"history_edit_title": "Geçmiş kaydını düzenle",
|
||||
"history_edit_timestamp": "Zaman damgası",
|
||||
"manufacturer": "Üretici",
|
||||
"model": "Model",
|
||||
"area": "Alan",
|
||||
"actions": "Eylemler",
|
||||
"view_mode_label": "Görünüm",
|
||||
"view_cards": "Kart görünümü",
|
||||
"view_table": "Tablo görünümü",
|
||||
"objects_table_columns_label": "Nesne tablosu sütunları",
|
||||
"objects_table_columns_hint": "Nesne tablosu görünümünde hangi sütunların görüneceğini seçin.",
|
||||
"custom_icon_optional": "Simge (isteğe bağlı, örn. mdi:wrench)",
|
||||
"task_enabled": "Görev etkin",
|
||||
"skip_reason_prompt": "Bu görev atlansın mı?",
|
||||
"reason_optional": "Neden (isteğe bağlı)",
|
||||
"reset_date_prompt": "Görev yapıldı olarak işaretlensin mi?",
|
||||
"reset_date_optional": "Son yapılma tarihi (isteğe bağlı, varsayılan bugün)",
|
||||
"notes_label": "Notlar",
|
||||
"documentation_label": "Dokümantasyon",
|
||||
"no_nfc_tag": "— Etiket yok —",
|
||||
"dashboard": "Gösterge Paneli",
|
||||
"tab_today": "Bugün",
|
||||
"palette_placeholder": "Nesne ve görevlerde ara…",
|
||||
"palette_no_results": "Eşleşme yok",
|
||||
"palette_hint": "↑↓ gezinme · Enter açma · Esc kapatma",
|
||||
"today_all_caught_up": "Her şey tamam! Bu hafta vadesi gelen yok.",
|
||||
"today_overdue": "Gecikmiş",
|
||||
"today_due_today": "Bugün vadeli",
|
||||
"today_this_week": "Bu hafta",
|
||||
"settings": "Ayarlar",
|
||||
"settings_features": "Gelişmiş Özellikler",
|
||||
"settings_features_desc": "Gelişmiş özellikleri etkinleştirin veya devre dışı bırakın. Devre dışı bırakmak onları arayüzden gizler ancak verileri silmez.",
|
||||
"feat_adaptive": "Uyarlanabilir Zamanlama",
|
||||
"feat_adaptive_desc": "Bakım geçmişinden en uygun aralıkları öğren",
|
||||
"feat_predictions": "Sensör Tahminleri",
|
||||
"feat_predictions_desc": "Sensör bozulmasından tetiklenme tarihlerini öngör",
|
||||
"feat_seasonal": "Mevsimsel Ayarlamalar",
|
||||
"feat_seasonal_desc": "Aralıkları mevsimsel desenlere göre ayarla",
|
||||
"feat_environmental": "Çevresel Korelasyon",
|
||||
"feat_environmental_desc": "Aralıkları sıcaklık/nemle ilişkilendir",
|
||||
"feat_budget": "Bütçe Takibi",
|
||||
"feat_budget_desc": "Aylık ve yıllık bakım harcamalarını takip et",
|
||||
"feat_groups": "Görev Grupları",
|
||||
"feat_groups_desc": "Görevleri mantıksal gruplar halinde düzenle",
|
||||
"feat_checklists": "Kontrol Listeleri",
|
||||
"feat_checklists_desc": "Görev tamamlama için çok adımlı prosedürler",
|
||||
"settings_general": "Genel",
|
||||
"settings_default_warning": "Varsayılan uyarı günleri",
|
||||
"settings_panel_enabled": "Kenar çubuğu paneli",
|
||||
"settings_panel_title": "Kenar çubuğu paneli başlığı",
|
||||
"settings_notifications": "Bildirimler",
|
||||
"settings_notify_service": "Bildirim servisi",
|
||||
"test_notification": "Test bildirimi",
|
||||
"send_test": "Test gönder",
|
||||
"testing": "Gönderiliyor…",
|
||||
"test_notification_success": "Test bildirimi gönderildi",
|
||||
"test_notification_failed": "Test bildirimi başarısız oldu",
|
||||
"settings_notify_due_soon": "Vade yaklaştığında bildir",
|
||||
"settings_notify_overdue": "Geciktiğinde bildir",
|
||||
"settings_notify_triggered": "Tetiklendiğinde bildir",
|
||||
"settings_interval_hours": "Tekrar aralığı (saat, 0 = bir kez)",
|
||||
"settings_quiet_hours": "Sessiz saatler",
|
||||
"settings_quiet_start": "Başlangıç",
|
||||
"settings_quiet_end": "Bitiş",
|
||||
"settings_max_per_day": "Günlük en fazla bildirim (0 = sınırsız)",
|
||||
"settings_bundling": "Bildirimleri grupla",
|
||||
"settings_bundle_threshold": "Gruplama eşiği",
|
||||
"settings_reminder_leads": "Ek hatırlatmalar (vadeden gün önce)",
|
||||
"settings_reminder_leads_hint": "Virgülle ayrılmış süreler, örn. 14, 3, 0 — eşleşen her günde bir ek hatırlatma gönderilir. Boş = kapalı.",
|
||||
"settings_actions": "Mobil Eylem Düğmeleri",
|
||||
"settings_action_complete": "'Tamamla' düğmesini göster",
|
||||
"settings_action_skip": "'Atla' düğmesini göster",
|
||||
"settings_action_snooze": "'Ertele' düğmesini göster",
|
||||
"settings_weekly_digest": "Haftalık özet",
|
||||
"settings_weekly_digest_hint": "Vadesi gelen görevler olduğunda pazartesi sabahı tek bir özet bildirimi.",
|
||||
"settings_warranty_reminder": "Garanti bitiş hatırlatması",
|
||||
"settings_warranty_reminder_days": "Bitişten gün önce",
|
||||
"settings_warranty_reminder_hint": "Bir nesnenin garantisinin bitmesine bu kadar gün kaldığında bir kez bildir.",
|
||||
"settings_snooze_hours": "Erteleme süresi (saat)",
|
||||
"settings_budget": "Bütçe",
|
||||
"settings_currency": "Para birimi",
|
||||
"settings_budget_monthly": "Aylık bütçe",
|
||||
"settings_budget_yearly": "Yıllık bütçe",
|
||||
"settings_budget_alerts": "Bütçe uyarıları",
|
||||
"settings_budget_threshold": "Uyarı eşiği (%)",
|
||||
"settings_import_export": "İçe / Dışa Aktarma",
|
||||
"settings_export_json": "JSON dışa aktar",
|
||||
"settings_export_yaml": "YAML dışa aktar",
|
||||
"settings_export_csv": "CSV dışa aktar",
|
||||
"settings_import_csv": "CSV içe aktar",
|
||||
"settings_import_placeholder": "JSON veya CSV içeriğini buraya yapıştırın…",
|
||||
"settings_import_btn": "İçe aktar",
|
||||
"settings_import_success": "{count} nesne başarıyla içe aktarıldı.",
|
||||
"settings_export_success": "Dışa aktarma indirildi.",
|
||||
"settings_saved": "Ayar kaydedildi.",
|
||||
"settings_include_history": "Geçmişi dahil et",
|
||||
"settings_export_selection": "Seçili nesnelerle sınırla (isteğe bağlı)",
|
||||
"settings_docs_archive": "Belge arşivi (dosyalarla birlikte)",
|
||||
"settings_docs_archive_hint": "JSON/YAML/CSV dışa aktarmaları yalnızca ayarları içerir. Bu ZIP, geri yüklemenin eksiksiz olması için yüklenen dosya içeriklerini de kapsar.",
|
||||
"settings_docs_export_btn": "Belge ZIP'ini indir",
|
||||
"settings_docs_import_btn": "Belge ZIP'ini geri yükle",
|
||||
"settings_docs_import_success": "Geri yüklendi: {blobs} dosya, {docs} belge",
|
||||
"sort_alphabetical": "Alfabetik",
|
||||
"sort_due_soonest": "En yakın vade",
|
||||
"sort_task_count": "Görev sayısı",
|
||||
"sort_area": "Alan",
|
||||
"sort_assigned_user": "Atanan kullanıcı",
|
||||
"sort_group": "Grup",
|
||||
"groupby_none": "Gruplama yok",
|
||||
"groupby_area": "Alana göre",
|
||||
"groupby_group": "Gruba göre",
|
||||
"groupby_user": "Kullanıcıya göre",
|
||||
"filter_label": "Filtre",
|
||||
"user_label": "Kullanıcı",
|
||||
"sort_label": "Sırala",
|
||||
"group_by_label": "Grupla",
|
||||
"state_value_help": "HA durum değerini kullanın (genellikle küçük harf, örn. \"on\"/\"off\"). Büyük/küçük harf kaydederken normalleştirilir.",
|
||||
"target_changes_help": "Tetikleyici çalışmadan önceki eşleşen geçiş sayısı (varsayılan: 1).",
|
||||
"qr_print_title": "QR kodlarını yazdır",
|
||||
"qr_print_desc": "Kesip ekipmanınıza yapıştırmak için yazdırılabilir bir QR kodu sayfası oluşturun.",
|
||||
"qr_print_load": "Nesneleri yükle",
|
||||
"qr_print_filter": "Filtre",
|
||||
"qr_print_objects": "Nesneler",
|
||||
"qr_print_actions": "Eylemler",
|
||||
"qr_print_url_mode": "Bağlantı türü",
|
||||
"qr_print_estimate": "Tahmini QR kodu sayısı",
|
||||
"qr_print_over_limit": "üst sınır 200, filtreyi daraltın",
|
||||
"qr_print_generate": "QR kodları oluştur",
|
||||
"qr_print_generating": "Oluşturuluyor…",
|
||||
"qr_print_ready": "QR kodları hazır",
|
||||
"qr_print_print_button": "Yazdır",
|
||||
"qr_print_empty": "Oluşturulacak bir şey yok",
|
||||
"qr_action_skip": "Atla",
|
||||
"vacation_title": "Tatil modu",
|
||||
"vacation_active": "etkin",
|
||||
"vacation_ended": "sona erdi",
|
||||
"vacation_desc": "Bir tatil planlayın: bildirimler bu dönem artı tampon günler boyunca duraklatılır. Belirli görevleri yine de bildirime dahil edebilirsiniz.",
|
||||
"vacation_enable": "Tatil modunu etkinleştir",
|
||||
"vacation_start": "Başlangıç",
|
||||
"vacation_end": "Bitiş",
|
||||
"vacation_buffer": "Tampon (gün)",
|
||||
"vacation_exempt_title": "Tatilde yine de bildir",
|
||||
"vacation_exempt_desc": "Tatil sırasında yine de bildirim göndermesi gereken görevleri seçin (örn. kritik havuz kimyası).",
|
||||
"vacation_load_tasks": "Görevleri yükle",
|
||||
"vacation_preview_btn": "Önizlemeyi göster",
|
||||
"vacation_preview_affected": "görev etkileniyor",
|
||||
"vacation_event_due_soon": "vadesi yaklaşacak",
|
||||
"vacation_event_overdue": "gecikecek",
|
||||
"vacation_event_triggered_est": "sensör tetiklemesi olası",
|
||||
"vacation_sensor_based": "(sensöre dayalı)",
|
||||
"vacation_action_notify": "Yine de bildir",
|
||||
"vacation_action_unsilence": "Yeniden sustur",
|
||||
"vacation_marked_complete": "Tamamlandı olarak işaretlendi",
|
||||
"vacation_marked_skip": "Atlandı",
|
||||
"vacation_end_now": "Tatili şimdi bitir",
|
||||
"add": "Ekle",
|
||||
"show_stats": "İstatistik + grafikleri göster",
|
||||
"hide_stats": "İstatistikleri gizle",
|
||||
"adaptive_no_data": "Uyarlanabilir analiz için henüz yeterli tamamlama geçmişi yok. Aralık önerilerini ve güvenilirlik grafiklerini açmak için bu görevi birkaç kez daha tamamlayın.",
|
||||
"suggestion_applied": "Önerilen aralık uygulandı",
|
||||
"vacation_mode": "Tatil modu",
|
||||
"vacation_status_active": "Şu an etkin",
|
||||
"vacation_status_scheduled": "Planlandı",
|
||||
"vacation_status_inactive": "Devre dışı",
|
||||
"vacation_end_now_confirm": "Tatil hemen bitirilsin mi?",
|
||||
"vacation_exempt_count": "muaf",
|
||||
"vacation_advanced": "Gelişmiş…",
|
||||
"vacation_open_panel": "Panelde aç",
|
||||
"enable": "Etkinleştir",
|
||||
"saved": "Kaydedildi",
|
||||
"budget_monthly_set": "Aylık ayarla",
|
||||
"budget_yearly_set": "Yıllık ayarla",
|
||||
"budget_advanced": "Para birimi, uyarılar…",
|
||||
"budget_open_panel": "Panelde aç",
|
||||
"groups_empty": "Henüz grup yok.",
|
||||
"group_new_placeholder": "Grup ekle…",
|
||||
"group_delete_confirm": "\"{name}\" grubu silinsin mi?",
|
||||
"groups_manage_tasks": "Görev atamalarını yönet…",
|
||||
"groups_open_panel": "Panelde aç",
|
||||
"unassigned": "Atanmamış",
|
||||
"no_area": "Alan yok",
|
||||
"has_overdue": "Gecikmiş görevi var",
|
||||
"object": "Nesne",
|
||||
"settings_panel_access": "Panel erişimi",
|
||||
"settings_panel_access_desc": "Yöneticiler her zaman tam erişime sahiptir. Oluşturma, düzenleme ve silmeyi belirli yönetici olmayan kullanıcılara devretmek için bunu açın ve onları aşağıdan seçin — diğer herkes yalnızca Tamamla ve Atla görür.",
|
||||
"settings_operator_write": "Seçili kullanıcılara oluşturma, düzenleme ve silme izni ver",
|
||||
"settings_operator_write_desc": "Kapalı: içeriği yalnızca yöneticiler değiştirebilir. Açık: aşağıda seçilen kullanıcılar da tam erişim alır.",
|
||||
"no_non_admin_users": "Yönetici olmayan kullanıcı bulunamadı. Ayarlar → Kişiler bölümünden ekleyin.",
|
||||
"owner_label": "Sahip",
|
||||
"feat_completion_actions": "Tamamlama eylemleri",
|
||||
"feat_completion_actions_desc": "Görev başına tamamlamada HA eylemi + önceden ayarlı değerlerle hızlı tamamlama QR'ı.",
|
||||
"on_complete_action_title": "Tamamlandığında: HA eylemi tetikle (isteğe bağlı)",
|
||||
"on_complete_action_desc": "Görev tamamlandığında bir HA servisi çağırır — örn. cihazdaki bir sayacı sıfırlar.",
|
||||
"on_complete_action_service": "Servis",
|
||||
"on_complete_action_target": "Hedef varlık",
|
||||
"on_complete_action_target_hint": "Not: varlık alan adı servisle eşleşmelidir — örn. 'button.press' yalnızca button.* üzerinde, 'counter.increment' yalnızca counter.* üzerinde, 'input_button.press' yalnızca input_button.* üzerinde çalışır. Eşleşmezse eylem sessizce başarısız olur (HA günlüğü: 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Veri (JSON, isteğe bağlı)",
|
||||
"on_complete_action_test": "Yapılandırmayı doğrula",
|
||||
"on_complete_action_test_success": "✓ Yapılandırma geçerli (eylem yalnızca görev tamamlandığında çalışır)",
|
||||
"on_complete_action_test_failed": "Başarısız",
|
||||
"quick_complete_defaults_title": "Hızlı tamamlama varsayılanları (QR taramaları için, isteğe bağlı)",
|
||||
"quick_complete_defaults_desc": "Hızlı tamamlama QR taramaları için önceden ayarlı değerler. Bunlar olmadan QR, tamamlama penceresini açar.",
|
||||
"quick_complete_defaults_notes": "Notlar",
|
||||
"quick_complete_defaults_cost": "Maliyet",
|
||||
"quick_complete_defaults_duration": "Süre (dakika)",
|
||||
"quick_complete_defaults_feedback_none": "Geri bildirim yok",
|
||||
"quick_complete_defaults_feedback_needed": "Gerekliydi",
|
||||
"quick_complete_defaults_feedback_not_needed": "Gerekli değildi",
|
||||
"quick_complete_success": "Hızlıca tamamlandı olarak işaretlendi",
|
||||
"show_all_objects": "Tüm nesneleri göster",
|
||||
"show_all_tasks": "Filtreyi temizle — tüm görevleri göster",
|
||||
"filter_to_overdue": "Görev listesini yalnızca gecikmişlere filtrele",
|
||||
"filter_to_due_soon": "Görev listesini yalnızca vadesi yaklaşanlara filtrele",
|
||||
"filter_to_triggered": "Görev listesini yalnızca tetiklenenlere filtrele",
|
||||
"open_task": "Görevi aç",
|
||||
"show_details": "Geçmiş + istatistikleri göster",
|
||||
"hide_details": "Ayrıntıları gizle",
|
||||
"history_empty": "Henüz geçmiş yok.",
|
||||
"history_edit_button": "Kaydı düzenle",
|
||||
"total_cost": "Toplam maliyet",
|
||||
"times_performed": "Yapılma sayısı",
|
||||
"older_entries": "daha eski",
|
||||
"open_in_panel": "Bakım panelinde aç",
|
||||
"skip_reason": "Atlama nedeni (isteğe bağlı)",
|
||||
"reset_to_date": "Son yapılmayı şu tarihe sıfırla",
|
||||
"delete_task_confirm": "Bu görev ve geçmişi silinsin mi?",
|
||||
"delete_object_confirm": "Bu nesne ve tüm görevleri silinsin mi?",
|
||||
"loading": "Yükleniyor…",
|
||||
"archive": "Arşivle",
|
||||
"undo": "Geri al",
|
||||
"task_archived": "Görev arşivlendi",
|
||||
"object_archived": "Nesne arşivlendi",
|
||||
"unarchive": "Arşivden çıkar",
|
||||
"archived": "Arşivlendi",
|
||||
"show_archived": "Arşivlenenleri göster",
|
||||
"hide_archived": "Arşivlenenleri gizle",
|
||||
"confirm_archive_object": "Bu nesne ve görevleri arşivlensin mi? Geçmişleri korunur ve daha sonra arşivden çıkarılabilirler.",
|
||||
"settings_archive": "Arşiv ve Saklama",
|
||||
"settings_archive_desc": "Tamamlanmış tek seferlik görevleri silmeden emekliye ayırın. Arşivlenen öğeler gizlenir ve pasiftir ancak geçmişlerini ve maliyetlerini korurlar.",
|
||||
"settings_archive_oneoff_days": "Tamamlanan tek seferlik görevleri şu kadar gün sonra otomatik arşivle (0 = kapalı)",
|
||||
"settings_delete_archived_oneoff_days": "Arşivlenen tek seferlik görevleri şu kadar gün sonra otomatik sil (0 = asla)",
|
||||
"archive_object": "Nesneyi arşivle",
|
||||
"unarchive_object": "Nesneyi arşivden çıkar",
|
||||
"documents": "Belgeler",
|
||||
"documents_empty": "Henüz belge yok.",
|
||||
"doc_upload": "Dosya yükle",
|
||||
"doc_uploading": "Yükleniyor…",
|
||||
"doc_add_link": "Bağlantı ekle",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Başlık (isteğe bağlı)",
|
||||
"doc_open": "Aç",
|
||||
"doc_delete_confirm": "\"{name}\" silinsin mi?",
|
||||
"doc_too_large": "Dosya çok büyük (en fazla 25 MB).",
|
||||
"doc_upload_failed": "Yükleme başarısız oldu.",
|
||||
"completion_photo_optional": "Tamamlama fotoğrafı (isteğe bağlı)",
|
||||
"add_photo": "Fotoğraf ekle",
|
||||
"uploading": "Yükleniyor…",
|
||||
"remove": "Kaldır",
|
||||
"doc_deduped": "Zaten başka bir yerde saklı — paylaşıldı, ek alan kullanılmadı.",
|
||||
"doc_dup_in_object": "Bu dosya zaten bu nesneye ekli.",
|
||||
"doc_link_invalid": "Yalnızca http/https bağlantılarına izin verilir.",
|
||||
"doc_cat_manual": "Kılavuz",
|
||||
"doc_cat_warranty": "Garanti",
|
||||
"doc_cat_invoice": "Fatura",
|
||||
"doc_cat_spare_parts": "Yedek parçalar",
|
||||
"doc_cat_photo": "Fotoğraf",
|
||||
"doc_cat_other": "Diğer",
|
||||
"doc_link_badge": "Bağlantı",
|
||||
"doc_storage_title": "Belge depolama",
|
||||
"doc_storage_saved": "Tekilleştirmeyle kazanıldı",
|
||||
"doc_storage_refresh": "Yenile",
|
||||
"doc_download": "İndir",
|
||||
"doc_close": "Kapat",
|
||||
"doc_camera": "Fotoğraf çek",
|
||||
"doc_drop_hint": "Dosyaları buraya bırakın",
|
||||
"doc_task_none": "Bu göreve bağlı belge yok.",
|
||||
"doc_link_existing": "Belge bağla…",
|
||||
"doc_attach": "Bağla",
|
||||
"doc_unlink": "Bağlantıyı kaldır",
|
||||
"doc_page": "Sayfa",
|
||||
"chart_range_7d": "7g",
|
||||
"chart_range_30d": "30g",
|
||||
"chart_range_90d": "90g",
|
||||
"chart_range_1y": "1y",
|
||||
"chart_since_service": "son servisten beri",
|
||||
"chart_no_stats": "Bu varlık için uzun dönem istatistiği yok — yalnızca bakım olayı değerleri gösteriliyor",
|
||||
"auto_complete_on_recovery": "Sensör düzelince otomatik tamamla",
|
||||
"auto_complete_on_recovery_help": "Tetikleyici kendiliğinden temizlendiğinde bir tamamlama kaydeder (son yapılmayı ayarlar) — örn. tuz dolduruldu, filtre değiştirildi.",
|
||||
"doc_search": "Belgelerde ara…",
|
||||
"doc_search_none": "Eşleşen belge yok",
|
||||
"link_device_optional": "Mevcut bir cihaza bağla (isteğe bağlı)",
|
||||
"parent_object_optional": "Üst nesne (isteğe bağlı)",
|
||||
"parent_none": "(Üst nesne yok)",
|
||||
"paused": "Duraklatıldı",
|
||||
"pause_object": "Duraklat",
|
||||
"resume_object": "Devam ettir",
|
||||
"pause_until_prompt": "Bu nesnenin zamanlamalarını dondurur — devam ettirilene kadar hiçbir şeyin vadesi gelmez ve bildirim gönderilmez. İsteğe bağlı olarak bir otomatik devam tarihi ayarlayın.",
|
||||
"pause_until_label": "Devam tarihi (isteğe bağlı)",
|
||||
"object_paused": "Nesne duraklatıldı",
|
||||
"object_resumed": "Nesne devam ettirildi — zamanlamalar yeniden başlatıldı",
|
||||
"object_paused_badge": "Duraklatıldı",
|
||||
"paused_until_label": "şu tarihe kadar",
|
||||
"replace_object": "Değiştir…",
|
||||
"replace_object_prompt": "Bu nesneyi emekliye ayırın ve bir halef oluşturun. Geçmiş ve maliyetler eski nesnede arşivli kalır; görevler ve belgeler yenisine taşınır, sayaçlar sıfırdan başlar.",
|
||||
"replace_name_label": "Yeni nesne adı",
|
||||
"object_replaced": "Nesne değiştirildi — halefi oluşturuldu",
|
||||
"reading_unit_label": "Okuma birimi (örn. kWh, m³)",
|
||||
"reading_unit_help": "Bu görevi tamamlarken kaydedilen değerin yanında gösterilir.",
|
||||
"reading_value_label": "Okuma değeri",
|
||||
"reading_label": "Okuma",
|
||||
"settings_templates_label": "Şablon galerisi",
|
||||
"settings_templates_hint": "Asla ihtiyaç duymayacağınız şablonların işaretini kaldırın — \"Şablondan\" seçicilerinden (panel ve yapılandırma akışı) kaybolurlar. Başka hiçbir şey değişmez; istediğiniz zaman yeniden etkinleştirebilirsiniz.",
|
||||
"worksheet": "Çalışma sayfası",
|
||||
"worksheet_scan_view": "Görevi açmak için tarayın",
|
||||
"worksheet_scan_complete": "Tamamlamak için tarayın",
|
||||
"worksheet_manual_excerpt": "Kılavuz alıntısı",
|
||||
"worksheet_pages": "sayfa",
|
||||
"worksheet_printed": "Yazdırıldı",
|
||||
"worksheet_never": "Hiç",
|
||||
"card_all_caught_up": "Her şey tamam — ilgilenilmesi gereken bir şey yok",
|
||||
"postpone": "Ötele",
|
||||
"postpone_date_prompt": "Bu tekrar hangi tarihe ötelensin?",
|
||||
"postpone_date_label": "Yeni vade tarihi",
|
||||
"postponed": "Ötelendi",
|
||||
"postponed_to": "Şu tarihe ötelendi",
|
||||
"season_window_label": "Mevsim penceresi (aylar)",
|
||||
"season_window_hint": "Yalnızca seçili aylarda vadesi gelir; sezon dışı tarihler bir sonraki etkin aya kayar. Hiçbiri = tüm yıl.",
|
||||
"series_end_label": "Bitiş",
|
||||
"series_end_never": "Asla (süresiz tekrar eder)",
|
||||
"series_end_after_count": "Belirli bir sayıdan sonra",
|
||||
"series_end_until": "Bir tarihte",
|
||||
"series_end_count_label": "Tekrar sayısı",
|
||||
"series_end_until_label": "Bitiş tarihi",
|
||||
"parts_section": "Parçalar ve sarf malzemeleri",
|
||||
"part_add": "Parça ekle",
|
||||
"part_name": "Ad",
|
||||
"part_vendor": "Üretici",
|
||||
"part_storage_location": "Saklama yeri",
|
||||
"part_product_url": "Ürün URL'si",
|
||||
"part_unit": "Birim",
|
||||
"part_cost": "Birim fiyat",
|
||||
"part_stock": "Stok",
|
||||
"part_reorder_threshold": "Sipariş eşiği",
|
||||
"part_restock_quantity": "Stok yenileme miktarı",
|
||||
"part_auto_buy": "Azaldığında otomatik satın alma görevi oluştur",
|
||||
"part_restock": "Stoku ayarla",
|
||||
"restock_quantity_label": "Satın alınan miktar",
|
||||
"consumes_parts_label": "Parça tüketir",
|
||||
"parts_load_failed": "Bu nesnenin parçaları yüklenemedi — parça tüketimi seçenekleri şu anda kullanılamıyor.",
|
||||
"adopt_problem_button": "Sorun sensörlerini devral",
|
||||
"adopt_problem_title": "Sorun sensörlerini devral",
|
||||
"adopt_problem_hint": "HA sorun sensörlerini (yazıcı hataları, filtre uyarıları, düşük pil) sorun etkinken tetiklenen ve sorun çözülünce kendini temizleyen bakım görevlerine dönüştürün.",
|
||||
"adopt_problem_none": "Halihazırda takip edilmeyen sorun sensörü bulunamadı.",
|
||||
"adopt_problem_active": "etkin",
|
||||
"adopt_problem_ok": "tamam",
|
||||
"adopt_problem_new_object": "(yeni)",
|
||||
"adopt_problem_adopt": "Seçilenleri devral",
|
||||
"adopt_problem_done": "{tasks} sorun sensörü devralındı",
|
||||
"views_label": "Görünümler",
|
||||
"views_none": "— Görünüm yok —",
|
||||
"views_manage": "Görünümleri kaydet / yönet",
|
||||
"views_dialog_title": "Kayıtlı görünümler",
|
||||
"views_dialog_hint": "Geçerli filtreleri herkesin yeniden kullanabileceği adlandırılmış bir görünüm olarak kaydedin.",
|
||||
"views_name_placeholder": "Görünüm adı",
|
||||
"views_save_current": "Geçerli filtreleri kaydet",
|
||||
"views_none_yet": "Henüz kayıtlı görünüm yok.",
|
||||
"close": "Kapat",
|
||||
"trigger_hint_now": "Sensör şu anda {value} değerini okuyor.",
|
||||
"trigger_hint_above": "Görev, değer {target} üzerine çıktığında tetiklenir.",
|
||||
"trigger_hint_below": "Değer {target} altına düştüğünde tetiklenir.",
|
||||
"trigger_hint_counter_delta": "Mevcut okumadan ({value}) itibaren sayar: {due} değerinde vadesi gelir (+{target}) ve sayım her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_counter_delta_edit": "Son tamamlamadan bu yana kullanımı sayar: +{target} sonrasında vadesi gelir; sayım her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_counter_abs": "Sensör {target} değerine ulaştığında görevin vadesi gelir.",
|
||||
"trigger_hint_runtime": "Görevin vadesi, toplam {hours} saatlik çalışma süresinden sonra gelir; sayaç her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_state_change": "Görevin vadesi {count} durum değişikliğinden sonra gelir.",
|
||||
"trigger_hint_state_change_to": "Görevin vadesi, “{state}” durumuna {count} geçişten sonra gelir.",
|
||||
"trigger_hint_state_now": "Mevcut durum: {value}.",
|
||||
"adopt_problem_part": "Kullanılan parça: {name}",
|
||||
"label_filter": "Etiket",
|
||||
"all_labels": "Tüm etiketler",
|
||||
"settings_notify_scope": "Yalnızca şu görünüm için bildir",
|
||||
"settings_notify_scope_all": "Tüm görevler",
|
||||
"settings_notify_scope_hint": "Yalnızca seçili kayıtlı görünümün etiket/kullanıcı filtreleriyle eşleşen görevler hatırlatma gönderir. Görünümün durum, sıralama ve gruplaması burada dikkate alınmaz.",
|
||||
"card_saved_view": "Kayıtlı görünüm",
|
||||
"card_saved_view_none": "Yok",
|
||||
"card_saved_view_help": "Görünümün durum, kullanıcı ve etiket filtrelerini yukarıdaki filtrelerin üzerine uygular. Görünümün sıralaması ve gruplaması panel görüntüleme ayarlarıdır ve kartta uygulanmaz.",
|
||||
"doc_part_none": "Bu parçaya bağlı belge yok.",
|
||||
"settings_templates_toggle_group": "Bu gruptaki tüm şablonları etkinleştir veya devre dışı bırak",
|
||||
"setups_button": "Önerilen kurulumlar",
|
||||
"setups_title": "Önerilen kurulumlar (Beta)",
|
||||
"setups_hint": "Sarf malzemesi sensörleri bakım görevlerini yönetebilecek, desteklenen entegrasyonlara ait cihazlar. Devralma, nesneyi oluşturur ve her görevi sensörüne bağlar — sarf malzemesi azalınca tetiklenir ve değişimden sonra kendini çözer.",
|
||||
"setups_none": "Bağlanmamış sarf malzemesi sensörü olan desteklenen cihaz bulunamadı.",
|
||||
"setups_adopt": "Seçilenleri kur",
|
||||
"setups_done": "{tasks} sensöre bağlı görev oluşturuldu.",
|
||||
"complete_parts_used": "Bu sefer kullanılan parçalar",
|
||||
"part_delete_confirm": "'{name}' parçası silinsin mi? Stok takibi, görev bağlantıları ve açık satın alma hatırlatmaları kaldırılacak.",
|
||||
"baseline_start_value": "Başlangıç okuması (isteğe bağlı)",
|
||||
"baseline_start_help": "Sayım bu okumadan başlar. Mevcut değerden saymak için boş bırakın; son servisteki okumayı girerseniz o zamandan beri olan kullanım da sayılır.",
|
||||
"setups_baseline_hint": "son servisteki okuma (isteğe bağlı)",
|
||||
"baseline_start_help_edit": "Mevcut sayımı korumak için boş bırakın. Bir değer girmek sayımı yeniden sabitler (örn. son servisteki okuma).",
|
||||
"baseline_current_effective": "Şu anda geçerli başlangıç değeri: {value}",
|
||||
"runtime_on_states": "Etkin durumlar (virgülle ayrılmış)",
|
||||
"runtime_on_states_help": "Çalışıyor sayılan durumlar — varsayılan: on. Örn. mowing, cleaning, printing. Bir öznitelik seçiliyse onun değerleri eşleştirilir.",
|
||||
"setups_target_new": "Yeni oluştur: {name}",
|
||||
"schedule_preview_title": "Sonraki tarihler",
|
||||
"schedule_preview_ontime": "Zamanında tamamlama varsayılarak.",
|
||||
"schedule_preview_ends": "(seri sona erer)",
|
||||
"adopt_problem_responsible": "Devralınan tüm görevler için sorumlu kullanıcı (isteğe bağlı)",
|
||||
"adopt_problem_configure": "Yapılandır",
|
||||
"history_auto": "Otomatik",
|
||||
"battery_fleet_title": "Pil filosu",
|
||||
"battery_fleet_none_low": "Tüm piller iyi durumda — değiştirilecek bir şey yok.",
|
||||
"battery_fleet_buy_now": "Şimdi satın al",
|
||||
"battery_fleet_soon": "Yakında gerekli",
|
||||
"battery_fleet_soon_hint": "Son değişim tarihinden tahmin edildi — önceden sipariş verin.",
|
||||
"battery_fleet_mark_all": "Tümünü değiştirildi olarak işaretle",
|
||||
"battery_fleet_mark_one": "Bu pili değiştirildi olarak işaretle",
|
||||
"battery_fleet_offline": "çevrimdışı",
|
||||
"battery_fleet_trigger_lost": "Bu görevin sensör tetikleyicisi kayboldu — tetiklenmeyecek ve otomatik tamamlanmayacak.",
|
||||
"battery_fleet_repair": "Onar",
|
||||
"battery_fleet_exclude": "Filodan hariç tut",
|
||||
"battery_fleet_excluded": "Hariç tutuldu",
|
||||
"battery_fleet_include": "Yeniden takip et",
|
||||
"battery_fleet_total": "{n} pil takip ediliyor",
|
||||
"battery_fleet_setup_button": "Pil filosu",
|
||||
"battery_fleet_setup_done": "Pil filosu kuruldu — tek bir görev tüm pillerinizi takip ediyor.",
|
||||
"update_banner": "Sunucuda Maintenance Supporter'ın daha yeni bir sürümü var — paneli güncellemek için sayfayı yeniden yükleyin.",
|
||||
"update_reload": "Yeniden yükle"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Karbantartás",
|
||||
"objects": "Objektumok",
|
||||
"tasks": "Feladatok",
|
||||
"overdue": "Lejárt",
|
||||
"due_soon": "Hamarosan esedékes",
|
||||
"triggered": "Aktiválva",
|
||||
"trigger_replaced": "Kiváltó lecserélve",
|
||||
"ok": "OK",
|
||||
"all": "Összes",
|
||||
"new_object": "+ Új objektum",
|
||||
"templates_from": "Sablonból",
|
||||
"templates_title": "Kezdés sablonból",
|
||||
"templates_task_count": "{n} feladat",
|
||||
"template_created": "Létrehozva sablonból",
|
||||
"onboard_hint": "Adja hozzá az első objektumot a karbantartások nyomon követéséhez.",
|
||||
"edit": "Szerkesztés",
|
||||
"duplicate": "Duplikálás",
|
||||
"task_duplicated": "Feladat duplikálva",
|
||||
"object_duplicated": "Objektum duplikálva",
|
||||
"delete": "Törlés",
|
||||
"add_task": "+ Új feladat",
|
||||
"complete": "Elvégzés",
|
||||
"completed": "Elvégezve",
|
||||
"skip": "Kihagyás",
|
||||
"skipped": "Kihagyva",
|
||||
"missed": "Elmulasztva",
|
||||
"reset": "Visszaállítás",
|
||||
"snooze": "Szundi",
|
||||
"snoozed": "Szundiztatva",
|
||||
"cancel": "Mégse",
|
||||
"bulk_select": "Kijelölés",
|
||||
"bulk_select_all": "Összes kijelölése",
|
||||
"bulk_n_selected": "{n} kijelölve",
|
||||
"bulk_completed": "{n} feladat elvégezve",
|
||||
"bulk_archived": "{n} feladat archiválva",
|
||||
"completing": "Elvégzés…",
|
||||
"interval": "Intervallum",
|
||||
"warning": "Figyelmeztetés",
|
||||
"last_performed": "Utoljára elvégezve",
|
||||
"next_due": "Következő esedékesség",
|
||||
"days_until_due": "Napok az esedékességig",
|
||||
"avg_duration": "Átl. időtartam",
|
||||
"trigger": "Kiváltó",
|
||||
"trigger_type": "Kiváltó típusa",
|
||||
"threshold_above": "Felső határ",
|
||||
"threshold_below": "Alsó határ",
|
||||
"threshold": "Küszöbérték",
|
||||
"counter": "Számláló",
|
||||
"state_change": "Állapotváltozás",
|
||||
"runtime": "Üzemidő",
|
||||
"runtime_hours": "Cél üzemidő (óra)",
|
||||
"target_value": "Célérték",
|
||||
"baseline": "Kiindulási érték",
|
||||
"target_changes": "Cél változásszám",
|
||||
"for_minutes": "Ennyi ideig (perc)",
|
||||
"time_based": "Időalapú",
|
||||
"sensor_based": "Érzékelőalapú",
|
||||
"manual": "Kézi",
|
||||
"one_time": "Egyszeri",
|
||||
"weekdays": "Hét napjai",
|
||||
"nth_weekday": "A hónap n. hétnapja",
|
||||
"day_of_month": "A hónap napja",
|
||||
"recurrence_on_days": "Ismétlés ezeken a napokon",
|
||||
"recurrence_occurrence": "Előfordulás",
|
||||
"recurrence_weekday": "Hét napja",
|
||||
"recurrence_day": "A hónap napja (1–31)",
|
||||
"recurrence_last_day": "A hónap utolsó napja",
|
||||
"recurrence_business_day": "Csak munkanapokon (hétvégéről visszalépve)",
|
||||
"recurrence_offset": "Eltolás (nap, ±)",
|
||||
"recurrence_offset_help": "A dátum eltolása ±N nappal, pl. -2 = két nappal korábban.",
|
||||
"last_day_month": "A hónap utolsó napja",
|
||||
"last_business_day_month": "Utolsó munkanap",
|
||||
"ord_1": "1.",
|
||||
"ord_2": "2.",
|
||||
"ord_3": "3.",
|
||||
"ord_4": "4.",
|
||||
"ord_5": "5.",
|
||||
"ord_last": "Utolsó",
|
||||
"day_word": "Nap",
|
||||
"interval_value": "Intervallum",
|
||||
"interval_unit": "Egység",
|
||||
"unit_days": "Nap",
|
||||
"unit_weeks": "Hét",
|
||||
"unit_months": "Hónap",
|
||||
"unit_years": "Év",
|
||||
"due_date": "Határidő",
|
||||
"cleaning": "Tisztítás",
|
||||
"inspection": "Ellenőrzés",
|
||||
"replacement": "Csere",
|
||||
"calibration": "Kalibrálás",
|
||||
"service": "Szerviz",
|
||||
"reading": "Leolvasás",
|
||||
"custom": "Egyéni",
|
||||
"history": "Előzmények",
|
||||
"cost": "Költség",
|
||||
"report_button": "Jelentés",
|
||||
"report_title": "Karbantartási jelentés",
|
||||
"report_generated": "Létrehozva",
|
||||
"report_times_done": "Elvégezve",
|
||||
"report_total_cost": "Összköltség",
|
||||
"report_every": "minden {n}. {unit}",
|
||||
"report_notes": "Megjegyzések",
|
||||
"report_col_type": "Típus",
|
||||
"report_col_status": "Állapot",
|
||||
"report_col_schedule": "Ütemezés",
|
||||
"duration": "Időtartam",
|
||||
"both": "Mindkettő",
|
||||
"trigger_val": "Kiváltó érték",
|
||||
"complete_title": "Elvégzés: ",
|
||||
"checklist": "Ellenőrzőlista",
|
||||
"checklist_steps_optional": "Ellenőrzőlista lépései (opcionális)",
|
||||
"checklist_placeholder": "Szűrő tisztítása\nTömítés cseréje\nNyomáspróba",
|
||||
"checklist_help": "Soronként egy lépés. Legfeljebb 100 elem.",
|
||||
"err_too_long": "{field}: túl hosszú (max. {n} karakter)",
|
||||
"err_too_short": "{field}: túl rövid (min. {n} karakter)",
|
||||
"err_value_too_high": "{field}: túl nagy (max. {n})",
|
||||
"err_value_too_low": "{field}: túl kicsi (min. {n})",
|
||||
"err_required": "{field}: kötelező",
|
||||
"err_wrong_type": "{field}: hibás típus (várt: {type})",
|
||||
"err_invalid_choice": "{field}: nem megengedett érték",
|
||||
"err_invalid_value": "{field}: érvénytelen érték",
|
||||
"feat_schedule_time": "Napszakhoz kötött ütemezés",
|
||||
"feat_schedule_time_desc": "A feladatok nem éjfélkor, hanem egy megadott napszakban válnak lejárttá.",
|
||||
"schedule_time_optional": "Esedékesség időpontja (opcionális, ÓÓ:PP)",
|
||||
"schedule_time_help": "Üres = éjfél (alapértelmezés). HA időzóna.",
|
||||
"at_time": "ekkor:",
|
||||
"notes_optional": "Megjegyzések (opcionális)",
|
||||
"cost_optional": "Költség (opcionális)",
|
||||
"duration_minutes": "Időtartam percben (opcionális)",
|
||||
"days": "nap",
|
||||
"day": "nap",
|
||||
"today": "Ma",
|
||||
"d_overdue": "napja lejárt",
|
||||
"no_tasks": "Még nincsenek karbantartási feladatok. Első lépésként hozzon létre egy objektumot.",
|
||||
"no_tasks_short": "Nincs feladat",
|
||||
"no_history": "Még nincsenek előzmények.",
|
||||
"show_all": "Összes megjelenítése",
|
||||
"cost_duration_chart": "Költség és időtartam",
|
||||
"installed": "Telepítve",
|
||||
"confirm_delete_object": "Törli az objektumot az összes feladatával együtt?",
|
||||
"confirm_delete_task": "Törli ezt a feladatot?",
|
||||
"min": "Min",
|
||||
"max": "Max",
|
||||
"save": "Mentés",
|
||||
"saving": "Mentés…",
|
||||
"edit_task": "Feladat szerkesztése",
|
||||
"new_task": "Új karbantartási feladat",
|
||||
"task_name": "Feladat neve",
|
||||
"maintenance_type": "Karbantartás típusa",
|
||||
"priority": "Prioritás",
|
||||
"labels": "Címkék",
|
||||
"labels_placeholder": "pl. biztonság, szezonális, bérlőnek látható",
|
||||
"labels_help": "Vesszővel elválasztott címkék szűréshez és jelentésekhez.",
|
||||
"priority_low": "Alacsony",
|
||||
"priority_normal": "Normál",
|
||||
"priority_high": "Magas",
|
||||
"schedule_type": "Ütemezés típusa",
|
||||
"interval_days": "Intervallum (nap)",
|
||||
"warning_days": "Figyelmeztetési napok",
|
||||
"earliest_completion_days": "Legkorábbi elvégzés (nappal az esedékesség előtt)",
|
||||
"earliest_completion_days_help": "Hagyja üresen, ha bármikor elvégezhető. 0 = csak az esedékesség napján vagy utána.",
|
||||
"last_performed_optional": "Utoljára elvégezve (opcionális)",
|
||||
"interval_anchor": "Intervallum horgonya",
|
||||
"anchor_completion": "Az elvégzés dátumától",
|
||||
"anchor_planned": "A tervezett dátumtól (nincs csúszás)",
|
||||
"edit_object": "Objektum szerkesztése",
|
||||
"name": "Név",
|
||||
"manufacturer_optional": "Gyártó (opcionális)",
|
||||
"model_optional": "Modell (opcionális)",
|
||||
"serial_number_optional": "Sorozatszám (opcionális)",
|
||||
"serial_number_label": "Sorozatszám",
|
||||
"documentation_url_label": "Kézikönyv",
|
||||
"object_notes_label": "Megjegyzések",
|
||||
"sort_due_date": "Határidő",
|
||||
"sort_object": "Objektum neve",
|
||||
"sort_type": "Típus",
|
||||
"sort_task_name": "Feladat neve",
|
||||
"all_objects": "Minden objektum",
|
||||
"tasks_lower": "feladat",
|
||||
"no_tasks_yet": "Még nincs feladat",
|
||||
"add_first_task": "Első feladat hozzáadása",
|
||||
"trigger_configuration": "Kiváltó beállítása",
|
||||
"entity_id": "Entitásazonosító",
|
||||
"comma_separated": "vesszővel elválasztva",
|
||||
"entity_logic": "Entitáslogika",
|
||||
"entity_logic_any": "Bármely entitás kivált",
|
||||
"entity_logic_all": "Minden entitásnak ki kell váltania",
|
||||
"entities": "entitás",
|
||||
"attribute_optional": "Attribútum (opcionális, üres = állapot)",
|
||||
"use_entity_state": "Entitás állapotának használata (attribútum nélkül)",
|
||||
"trigger_above": "Kiváltás e fölött",
|
||||
"trigger_below": "Kiváltás ez alatt",
|
||||
"for_at_least_minutes": "Legalább ennyi ideig (perc)",
|
||||
"safety_interval_days": "Biztonsági intervallum (nap, opcionális)",
|
||||
"safety_interval": "Biztonsági intervallum (opcionális)",
|
||||
"delta_mode": "Delta mód",
|
||||
"from_state_optional": "Kezdő állapot (opcionális)",
|
||||
"to_state_optional": "Célállapot (opcionális)",
|
||||
"documentation_url_optional": "Dokumentáció URL (opcionális)",
|
||||
"object_notes_optional": "Megjegyzések (opcionális)",
|
||||
"nfc_tag_id_optional": "NFC címke azonosító (opcionális)",
|
||||
"nfc_tags_empty_help": "Még nincs NFC címke regisztrálva a Home Assistantban.",
|
||||
"nfc_tags_open_settings": "Címkebeállítások megnyitása",
|
||||
"nfc_tags_refresh": "Frissítés",
|
||||
"environmental_entity_optional": "Környezeti érzékelő (opcionális)",
|
||||
"environmental_entity_helper": "pl. sensor.outdoor_temperature — a környezeti feltételek alapján igazítja az intervallumot",
|
||||
"environmental_attribute_optional": "Környezeti attribútum (opcionális)",
|
||||
"nfc_tag_id": "NFC címke azonosító",
|
||||
"nfc_linked": "NFC címke hozzárendelve",
|
||||
"nfc_link_hint": "Kattintson az NFC címke hozzárendeléséhez",
|
||||
"responsible_user": "Felelős felhasználó",
|
||||
"shared_with": "Megosztva (rotáció)",
|
||||
"shared_with_help": "Válasszon több személyt a feladat megosztásához; a felelős minden elvégzés után váltakozik.",
|
||||
"rotation_strategy": "Rotáció",
|
||||
"rotation_none": "Nincs rotáció",
|
||||
"rotation_round_robin": "Körforgás",
|
||||
"rotation_least_completed": "Legkevesebbet végezte",
|
||||
"rotation_random": "Véletlenszerű",
|
||||
"no_user_assigned": "(Nincs felhasználó hozzárendelve)",
|
||||
"all_users": "Minden felhasználó",
|
||||
"my_tasks": "Saját feladataim",
|
||||
"tab_calendar": "Naptár",
|
||||
"cal_no_events": "Nincs karbantartás",
|
||||
"cal_window_7": "7 nap",
|
||||
"cal_window_14": "14 nap",
|
||||
"cal_window_30": "30 nap",
|
||||
"cal_window_365": "1 év",
|
||||
"cal_every_n_days": "{n} naponta",
|
||||
"cal_source_time": "Időalapú",
|
||||
"cal_source_time_adaptive": "Időalapú (adaptív)",
|
||||
"cal_source_sensor": "Érzékelőalapú",
|
||||
"cal_predicted": "előrejelzett",
|
||||
"cal_confidence_high": "nagy megbízhatóság",
|
||||
"cal_confidence_medium": "közepes megbízhatóság",
|
||||
"cal_confidence_low": "alacsony megbízhatóság",
|
||||
"budget_monthly": "Havi költségkeret",
|
||||
"budget_yearly": "Éves költségkeret",
|
||||
"groups": "Csoportok",
|
||||
"new_group": "Új csoport",
|
||||
"edit_group": "Csoport szerkesztése",
|
||||
"no_groups": "Még nincsenek csoportok",
|
||||
"delete_group": "Csoport törlése",
|
||||
"delete_group_confirm": "Törli a(z) „{name}” csoportot?",
|
||||
"group_select_tasks": "Feladatok kiválasztása",
|
||||
"group_name_required": "A név megadása kötelező",
|
||||
"description_optional": "Leírás (opcionális)",
|
||||
"selected": "Kiválasztva",
|
||||
"loading_chart": "Diagramadatok betöltése…",
|
||||
"hide_outliers": "Kiugró értékek elrejtése (érzékelőhibák)",
|
||||
"was_maintenance_needed": "Szükség volt erre a karbantartásra?",
|
||||
"feedback_needed": "Szükséges volt",
|
||||
"feedback_not_needed": "Nem volt szükséges",
|
||||
"feedback_not_sure": "Nem biztos",
|
||||
"suggested_interval": "Javasolt intervallum",
|
||||
"apply_suggestion": "Alkalmaz",
|
||||
"reanalyze": "Újraelemzés",
|
||||
"reanalyze_result": "Új elemzés",
|
||||
"reanalyze_insufficient_data": "Nincs elég adat ajánlás készítéséhez",
|
||||
"data_points": "adatpont",
|
||||
"dismiss_suggestion": "Elvetés",
|
||||
"confidence_low": "Alacsony",
|
||||
"confidence_medium": "Közepes",
|
||||
"confidence_high": "Magas",
|
||||
"recommended": "ajánlott",
|
||||
"seasonal_awareness": "Szezonális igazodás",
|
||||
"edit_seasonal_overrides": "Szezonális tényezők szerkesztése",
|
||||
"seasonal_overrides_title": "Szezonális tényezők (felülbírálat)",
|
||||
"seasonal_overrides_hint": "Tényező havonta (0,1–5,0). Üres = automatikusan tanult.",
|
||||
"seasonal_override_invalid": "Érvénytelen érték",
|
||||
"seasonal_override_range": "A tényezőnek 0,1 és 5,0 között kell lennie",
|
||||
"clear_all": "Összes törlése",
|
||||
"seasonal_chart_title": "Szezonális tényezők",
|
||||
"seasonal_learned": "Tanult",
|
||||
"seasonal_manual": "Kézi",
|
||||
"month_jan": "Jan",
|
||||
"month_feb": "Febr",
|
||||
"month_mar": "Márc",
|
||||
"month_apr": "Ápr",
|
||||
"month_may": "Máj",
|
||||
"month_jun": "Jún",
|
||||
"month_jul": "Júl",
|
||||
"month_aug": "Aug",
|
||||
"month_sep": "Szept",
|
||||
"month_oct": "Okt",
|
||||
"month_nov": "Nov",
|
||||
"month_dec": "Dec",
|
||||
"sensor_prediction": "Érzékelő-előrejelzés",
|
||||
"degradation_trend": "Trend",
|
||||
"trend_rising": "Emelkedő",
|
||||
"trend_falling": "Csökkenő",
|
||||
"trend_stable": "Stabil",
|
||||
"trend_insufficient_data": "Nincs elég adat",
|
||||
"days_until_threshold": "Napok a küszöbértékig",
|
||||
"threshold_exceeded": "Küszöbérték túllépve",
|
||||
"environmental_adjustment": "Környezeti tényező",
|
||||
"sensor_prediction_urgency": "Az érzékelő ~{days} napon belül jelzi a küszöbérték elérését",
|
||||
"day_short": "nap",
|
||||
"weibull_reliability_curve": "Megbízhatósági görbe",
|
||||
"weibull_failure_probability": "Meghibásodási valószínűség",
|
||||
"weibull_r_squared": "Illeszkedés R²",
|
||||
"beta_early_failures": "Korai meghibásodások",
|
||||
"beta_random_failures": "Véletlen meghibásodások",
|
||||
"beta_wear_out": "Elhasználódás",
|
||||
"beta_highly_predictable": "Jól előrejelezhető",
|
||||
"confidence_interval": "Konfidenciaintervallum",
|
||||
"confidence_conservative": "Konzervatív",
|
||||
"confidence_aggressive": "Optimista",
|
||||
"current_interval_marker": "Jelenlegi intervallum",
|
||||
"recommended_marker": "Ajánlott",
|
||||
"characteristic_life": "Karakterisztikus élettartam",
|
||||
"chart_mini_sparkline": "Trendvonal",
|
||||
"chart_history": "Költség- és időtartam-előzmények",
|
||||
"chart_seasonal": "Szezonális tényezők, 12 hónap",
|
||||
"chart_weibull": "Weibull megbízhatósági görbe",
|
||||
"chart_sparkline": "Érzékelő kiváltóérték-diagram",
|
||||
"days_progress": "Napok előrehaladása",
|
||||
"qr_code": "QR-kód",
|
||||
"qr_generating": "QR-kód generálása…",
|
||||
"qr_error": "A QR-kód generálása nem sikerült.",
|
||||
"qr_error_no_url": "Nincs HA URL beállítva. Adjon meg külső vagy belső URL-t a Beállítások → Rendszer → Hálózat alatt.",
|
||||
"save_error": "A mentés nem sikerült. Próbálja újra.",
|
||||
"qr_print": "Nyomtatás",
|
||||
"qr_download": "SVG letöltése",
|
||||
"qr_action": "Művelet beolvasáskor",
|
||||
"qr_action_view": "Karbantartási adatok megtekintése",
|
||||
"qr_action_complete": "Karbantartás elvégzettként jelölése",
|
||||
"qr_url_mode": "Hivatkozás típusa",
|
||||
"qr_mode_companion": "Companion alkalmazás",
|
||||
"qr_mode_local": "Helyi (mDNS)",
|
||||
"qr_mode_server": "Szerver URL",
|
||||
"overview": "Áttekintés",
|
||||
"analysis": "Elemzés",
|
||||
"recent_activities": "Legutóbbi tevékenységek",
|
||||
"search_notes": "Keresés a megjegyzésekben",
|
||||
"avg_cost": "Átl. költség",
|
||||
"no_advanced_features": "Nincsenek engedélyezett speciális funkciók",
|
||||
"no_advanced_features_hint": "Az elemzési adatok megjelenítéséhez engedélyezze az „Adaptív ütemezés” vagy a „Szezonális minták” funkciót az integráció beállításaiban.",
|
||||
"analysis_not_enough_data": "Még nincs elég adat az elemzéshez.",
|
||||
"analysis_not_enough_data_hint": "A Weibull-elemzéshez legalább 5 elvégzett karbantartás szükséges; a szezonális minták havi 6+ adatpont után válnak láthatóvá.",
|
||||
"analysis_manual_task_hint": "Az intervallum nélküli kézi feladatok nem termelnek elemzési adatot.",
|
||||
"completions": "elvégzés",
|
||||
"current": "Jelenlegi",
|
||||
"shorter": "Rövidebb",
|
||||
"longer": "Hosszabb",
|
||||
"normal": "Normál",
|
||||
"disabled": "Letiltva",
|
||||
"compound_logic": "Összetett logika",
|
||||
"compound": "Összetett (több feltétel)",
|
||||
"compound_logic_and": "ÉS — minden feltételnek teljesülnie kell",
|
||||
"compound_logic_or": "VAGY — bármely feltétel kivált",
|
||||
"compound_help": "Több érzékelőfeltétel egyetlen kiváltóvá kombinálása.",
|
||||
"compound_no_conditions": "Még nincs feltétel — adjon hozzá legalább egyet.",
|
||||
"compound_add_condition": "Feltétel hozzáadása",
|
||||
"compound_condition": "Feltétel",
|
||||
"compound_remove_condition": "Feltétel eltávolítása",
|
||||
"card_title": "Cím",
|
||||
"card_show_header": "Fejléc megjelenítése statisztikákkal",
|
||||
"card_show_actions": "Műveletgombok megjelenítése",
|
||||
"card_compact": "Kompakt mód",
|
||||
"card_max_items": "Max. elemszám (0 = mind)",
|
||||
"card_filter_status": "Szűrés állapot szerint",
|
||||
"card_filter_status_help": "Üres = minden állapot megjelenik.",
|
||||
"card_filter_objects": "Szűrés objektumok szerint",
|
||||
"card_filter_objects_help": "Üres = minden objektum megjelenik.",
|
||||
"card_filter_entities": "Szűrés entitások szerint (entity_id-k)",
|
||||
"card_filter_entities_help": "Válasszon sensor / binary_sensor entitásokat ebből az integrációból. Üres = mind.",
|
||||
"card_loading_objects": "Objektumok betöltése…",
|
||||
"card_load_error": "Az objektumok betöltése nem sikerült — ellenőrizze a WebSocket-kapcsolatot.",
|
||||
"card_no_tasks_title": "Még nincsenek karbantartási feladatok",
|
||||
"card_no_tasks_cta": "→ Hozzon létre egyet a Karbantartás panelen",
|
||||
"no_objects": "Még nincsenek objektumok.",
|
||||
"action_error": "A művelet nem sikerült. Próbálja újra.",
|
||||
"area_id_optional": "Terület (opcionális)",
|
||||
"installation_date_optional": "Telepítés dátuma (opcionális)",
|
||||
"warranty_expiry_optional": "Garancia lejárta (opcionális)",
|
||||
"warranty": "Garancia",
|
||||
"warranty_valid_until": "érvényes eddig: {date}",
|
||||
"warranty_expires_in": "{days} nap múlva lejár",
|
||||
"warranty_expired": "lejárt",
|
||||
"cal_past_windows": "Korábbi időszakok",
|
||||
"cal_forward_windows": "Jövőbeli időszakok",
|
||||
"history_edit_title": "Előzménybejegyzés szerkesztése",
|
||||
"history_edit_timestamp": "Időbélyeg",
|
||||
"manufacturer": "Gyártó",
|
||||
"model": "Modell",
|
||||
"area": "Terület",
|
||||
"actions": "Műveletek",
|
||||
"view_mode_label": "Nézet",
|
||||
"view_cards": "Kártyanézet",
|
||||
"view_table": "Táblázatnézet",
|
||||
"objects_table_columns_label": "Objektumtáblázat oszlopai",
|
||||
"objects_table_columns_hint": "Válassza ki, mely oszlopok jelenjenek meg az objektumok táblázatnézetében.",
|
||||
"custom_icon_optional": "Ikon (opcionális, pl. mdi:wrench)",
|
||||
"task_enabled": "Feladat engedélyezve",
|
||||
"skip_reason_prompt": "Kihagyja ezt a feladatot?",
|
||||
"reason_optional": "Indoklás (opcionális)",
|
||||
"reset_date_prompt": "Elvégzettként jelöli a feladatot?",
|
||||
"reset_date_optional": "Utolsó elvégzés dátuma (opcionális, alapértelmezés: ma)",
|
||||
"notes_label": "Megjegyzések",
|
||||
"documentation_label": "Dokumentáció",
|
||||
"no_nfc_tag": "— Nincs címke —",
|
||||
"dashboard": "Irányítópult",
|
||||
"tab_today": "Ma",
|
||||
"palette_placeholder": "Objektumok és feladatok keresése…",
|
||||
"palette_no_results": "Nincs találat",
|
||||
"palette_hint": "↑↓ navigálás · Enter megnyitás · Esc bezárás",
|
||||
"today_all_caught_up": "Minden rendben! Ezen a héten nincs esedékes feladat.",
|
||||
"today_overdue": "Lejárt",
|
||||
"today_due_today": "Ma esedékes",
|
||||
"today_this_week": "Ezen a héten",
|
||||
"settings": "Beállítások",
|
||||
"settings_features": "Speciális funkciók",
|
||||
"settings_features_desc": "Speciális funkciók be- és kikapcsolása. A kikapcsolás elrejti őket a felületről, de nem töröl adatot.",
|
||||
"feat_adaptive": "Adaptív ütemezés",
|
||||
"feat_adaptive_desc": "Optimális intervallumok tanulása a karbantartási előzményekből",
|
||||
"feat_predictions": "Érzékelő-előrejelzések",
|
||||
"feat_predictions_desc": "Kiváltási dátumok előrejelzése az érzékelőértékek romlásából",
|
||||
"feat_seasonal": "Szezonális igazítások",
|
||||
"feat_seasonal_desc": "Intervallumok igazítása szezonális minták alapján",
|
||||
"feat_environmental": "Környezeti korreláció",
|
||||
"feat_environmental_desc": "Intervallumok korrelálása hőmérséklettel/páratartalommal",
|
||||
"feat_budget": "Költségkeret követése",
|
||||
"feat_budget_desc": "Havi és éves karbantartási kiadások követése",
|
||||
"feat_groups": "Feladatcsoportok",
|
||||
"feat_groups_desc": "Feladatok logikai csoportokba rendezése",
|
||||
"feat_checklists": "Ellenőrzőlisták",
|
||||
"feat_checklists_desc": "Többlépéses eljárások a feladatok elvégzéséhez",
|
||||
"settings_general": "Általános",
|
||||
"settings_default_warning": "Alapértelmezett figyelmeztetési napok",
|
||||
"settings_panel_enabled": "Oldalsáv-panel",
|
||||
"settings_panel_title": "Oldalsáv-panel címe",
|
||||
"settings_notifications": "Értesítések",
|
||||
"settings_notify_service": "Értesítési szolgáltatás",
|
||||
"test_notification": "Tesztértesítés",
|
||||
"send_test": "Teszt küldése",
|
||||
"testing": "Küldés…",
|
||||
"test_notification_success": "Tesztértesítés elküldve",
|
||||
"test_notification_failed": "A tesztértesítés nem sikerült",
|
||||
"settings_notify_due_soon": "Értesítés, ha hamarosan esedékes",
|
||||
"settings_notify_overdue": "Értesítés lejáratkor",
|
||||
"settings_notify_triggered": "Értesítés kiváltáskor",
|
||||
"settings_interval_hours": "Ismétlési intervallum (óra, 0 = egyszer)",
|
||||
"settings_quiet_hours": "Csendes órák",
|
||||
"settings_quiet_start": "Kezdete",
|
||||
"settings_quiet_end": "Vége",
|
||||
"settings_max_per_day": "Max. értesítés naponta (0 = korlátlan)",
|
||||
"settings_bundling": "Értesítések összevonása",
|
||||
"settings_bundle_threshold": "Összevonási küszöb",
|
||||
"settings_reminder_leads": "Extra emlékeztetők (nappal az esedékesség előtt)",
|
||||
"settings_reminder_leads_hint": "Vesszővel elválasztott napok, pl. 14, 3, 0 — minden egyező napon egy extra emlékeztető megy ki. Üres = kikapcsolva.",
|
||||
"settings_actions": "Mobil műveletgombok",
|
||||
"settings_action_complete": "„Elvégzés” gomb megjelenítése",
|
||||
"settings_action_skip": "„Kihagyás” gomb megjelenítése",
|
||||
"settings_action_snooze": "„Szundi” gomb megjelenítése",
|
||||
"settings_weekly_digest": "Heti összefoglaló",
|
||||
"settings_weekly_digest_hint": "Egyetlen összefoglaló értesítés hétfő reggel, ha vannak esedékes feladatok.",
|
||||
"settings_warranty_reminder": "Garancialejárati emlékeztető",
|
||||
"settings_warranty_reminder_days": "Nappal a lejárat előtt",
|
||||
"settings_warranty_reminder_hint": "Egyszeri értesítés, amikor egy objektum garanciája ennyi napra van a lejárattól.",
|
||||
"settings_snooze_hours": "Szundi időtartama (óra)",
|
||||
"settings_budget": "Költségkeret",
|
||||
"settings_currency": "Pénznem",
|
||||
"settings_budget_monthly": "Havi költségkeret",
|
||||
"settings_budget_yearly": "Éves költségkeret",
|
||||
"settings_budget_alerts": "Költségkeret-riasztások",
|
||||
"settings_budget_threshold": "Riasztási küszöb (%)",
|
||||
"settings_import_export": "Importálás / Exportálás",
|
||||
"settings_export_json": "JSON exportálása",
|
||||
"settings_export_yaml": "YAML exportálása",
|
||||
"settings_export_csv": "CSV exportálása",
|
||||
"settings_import_csv": "CSV importálása",
|
||||
"settings_import_placeholder": "Illessze be ide a JSON vagy CSV tartalmat…",
|
||||
"settings_import_btn": "Importálás",
|
||||
"settings_import_success": "{count} objektum sikeresen importálva.",
|
||||
"settings_export_success": "Export letöltve.",
|
||||
"settings_saved": "Beállítás mentve.",
|
||||
"settings_include_history": "Előzményekkel együtt",
|
||||
"settings_export_selection": "Csak a kiválasztott objektumok (opcionális)",
|
||||
"settings_docs_archive": "Dokumentumarchívum (fájlokkal)",
|
||||
"settings_docs_archive_hint": "A JSON/YAML/CSV export csak a beállításokat tartalmazza. Ez a ZIP a feltöltött fájlok tartalmát is magában foglalja, így a visszaállítás teljes.",
|
||||
"settings_docs_export_btn": "Dokumentum-ZIP letöltése",
|
||||
"settings_docs_import_btn": "Dokumentum-ZIP visszaállítása",
|
||||
"settings_docs_import_success": "Visszaállítva: {blobs} fájl, {docs} dokumentum",
|
||||
"sort_alphabetical": "Ábécésorrend",
|
||||
"sort_due_soonest": "Leghamarabb esedékes",
|
||||
"sort_task_count": "Feladatok száma",
|
||||
"sort_area": "Terület",
|
||||
"sort_assigned_user": "Hozzárendelt felhasználó",
|
||||
"sort_group": "Csoport",
|
||||
"groupby_none": "Nincs csoportosítás",
|
||||
"groupby_area": "Terület szerint",
|
||||
"groupby_group": "Csoport szerint",
|
||||
"groupby_user": "Felhasználó szerint",
|
||||
"filter_label": "Szűrő",
|
||||
"user_label": "Felhasználó",
|
||||
"sort_label": "Rendezés",
|
||||
"group_by_label": "Csoportosítás",
|
||||
"state_value_help": "A HA állapotértékét használja (általában kisbetűs, pl. „on”/„off”). A kis- és nagybetűk mentéskor normalizálódnak.",
|
||||
"target_changes_help": "Az egyező átmenetek száma a kiváltás előtt (alapértelmezés: 1).",
|
||||
"qr_print_title": "QR-kódok nyomtatása",
|
||||
"qr_print_desc": "Nyomtatható oldal QR-kódokkal — vágja ki és ragassza fel a berendezésekre.",
|
||||
"qr_print_load": "Objektumok betöltése",
|
||||
"qr_print_filter": "Szűrő",
|
||||
"qr_print_objects": "Objektumok",
|
||||
"qr_print_actions": "Műveletek",
|
||||
"qr_print_url_mode": "Hivatkozás típusa",
|
||||
"qr_print_estimate": "Becsült QR-kódok száma",
|
||||
"qr_print_over_limit": "a korlát 200, szűkítse a szűrőt",
|
||||
"qr_print_generate": "QR-kódok generálása",
|
||||
"qr_print_generating": "Generálás…",
|
||||
"qr_print_ready": "QR-kódok készen",
|
||||
"qr_print_print_button": "Nyomtatás",
|
||||
"qr_print_empty": "Nincs mit generálni",
|
||||
"qr_action_skip": "Kihagyás",
|
||||
"vacation_title": "Nyaralási mód",
|
||||
"vacation_active": "aktív",
|
||||
"vacation_ended": "véget ért",
|
||||
"vacation_desc": "Tervezzen nyaralást: az értesítések szünetelnek az időszak alatt, plusz egy puffernyi napig. Egyes feladatokat kivételként visszakapcsolhat.",
|
||||
"vacation_enable": "Nyaralási mód bekapcsolása",
|
||||
"vacation_start": "Kezdete",
|
||||
"vacation_end": "Vége",
|
||||
"vacation_buffer": "Puffer (nap)",
|
||||
"vacation_exempt_title": "Értesítés a nyaralás alatt is",
|
||||
"vacation_exempt_desc": "Válassza ki azokat a feladatokat, amelyek a nyaralás alatt is értesítsenek (pl. kritikus medencekémia).",
|
||||
"vacation_load_tasks": "Feladatok betöltése",
|
||||
"vacation_preview_btn": "Előnézet megjelenítése",
|
||||
"vacation_preview_affected": "érintett feladat",
|
||||
"vacation_event_due_soon": "hamarosan esedékessé válik",
|
||||
"vacation_event_overdue": "lejárttá válik",
|
||||
"vacation_event_triggered_est": "érzékelős kiváltás lehetséges",
|
||||
"vacation_sensor_based": "(érzékelőalapú)",
|
||||
"vacation_action_notify": "Értesítsen mégis",
|
||||
"vacation_action_unsilence": "Némítás újra",
|
||||
"vacation_marked_complete": "Elvégzettként jelölve",
|
||||
"vacation_marked_skip": "Kihagyva",
|
||||
"vacation_end_now": "Nyaralás befejezése most",
|
||||
"add": "Hozzáadás",
|
||||
"show_stats": "Statisztikák és grafikonok",
|
||||
"hide_stats": "Statisztikák elrejtése",
|
||||
"adaptive_no_data": "Még nincs elég elvégzési előzmény az adaptív elemzéshez. Végezze el a feladatot még néhányszor az intervallumjavaslatok és a megbízhatósági diagramok feloldásához.",
|
||||
"suggestion_applied": "Javasolt intervallum alkalmazva",
|
||||
"vacation_mode": "Nyaralási mód",
|
||||
"vacation_status_active": "Most aktív",
|
||||
"vacation_status_scheduled": "Ütemezve",
|
||||
"vacation_status_inactive": "Inaktív",
|
||||
"vacation_end_now_confirm": "Azonnal befejezi a nyaralást?",
|
||||
"vacation_exempt_count": "kivétel",
|
||||
"vacation_advanced": "Speciális…",
|
||||
"vacation_open_panel": "Megnyitás a panelen",
|
||||
"enable": "Engedélyezés",
|
||||
"saved": "Mentve",
|
||||
"budget_monthly_set": "Havi keret beállítása",
|
||||
"budget_yearly_set": "Éves keret beállítása",
|
||||
"budget_advanced": "Pénznem, riasztások…",
|
||||
"budget_open_panel": "Megnyitás a panelen",
|
||||
"groups_empty": "Még nincsenek csoportok.",
|
||||
"group_new_placeholder": "Csoport hozzáadása…",
|
||||
"group_delete_confirm": "Törli a(z) „{name}” csoportot?",
|
||||
"groups_manage_tasks": "Feladat-hozzárendelések kezelése…",
|
||||
"groups_open_panel": "Megnyitás a panelen",
|
||||
"unassigned": "Nincs hozzárendelve",
|
||||
"no_area": "Nincs terület",
|
||||
"has_overdue": "Van lejárt feladata",
|
||||
"object": "Objektum",
|
||||
"settings_panel_access": "Panel-hozzáférés",
|
||||
"settings_panel_access_desc": "Az adminok mindig teljes hozzáféréssel rendelkeznek. Ha a létrehozást, szerkesztést és törlést adott nem admin felhasználókra bízná, kapcsolja be ezt, és válassza ki őket lent — mindenki más csak az Elvégzés és a Kihagyás gombot látja.",
|
||||
"settings_operator_write": "A kiválasztott felhasználók létrehozhatnak, szerkeszthetnek és törölhetnek",
|
||||
"settings_operator_write_desc": "Ki: csak adminok módosíthatnak tartalmat. Be: a lent kiválasztott felhasználók is teljes hozzáférést kapnak.",
|
||||
"no_non_admin_users": "Nem található nem admin felhasználó. Vegyen fel néhányat a Beállítások → Személyek alatt.",
|
||||
"owner_label": "Tulajdonos",
|
||||
"feat_completion_actions": "Elvégzési műveletek",
|
||||
"feat_completion_actions_desc": "Feladatonkénti HA művelet elvégzéskor + gyorselvégző QR előre beállított értékekkel.",
|
||||
"on_complete_action_title": "Elvégzéskor: HA művelet indítása (opcionális)",
|
||||
"on_complete_action_desc": "HA szolgáltatást hív meg a feladat elvégzésekor — pl. számláló nullázása az eszközön.",
|
||||
"on_complete_action_service": "Szolgáltatás",
|
||||
"on_complete_action_target": "Cél entitás",
|
||||
"on_complete_action_target_hint": "Megjegyzés: az entitás doménjének egyeznie kell a szolgáltatással — pl. a „button.press” csak button.* entitáson működik, a „counter.increment” csak counter.* entitáson, az „input_button.press” csak input_button.* entitáson stb. Eltérés esetén a művelet csendben meghiúsul (a HA naplóban: „Referenced entities ... missing or not currently available”).",
|
||||
"on_complete_action_data": "Adatok (JSON, opcionális)",
|
||||
"on_complete_action_test": "Konfiguráció ellenőrzése",
|
||||
"on_complete_action_test_success": "✓ A konfiguráció érvényes (a művelet csak a feladat elvégzésekor fut le)",
|
||||
"on_complete_action_test_failed": "Sikertelen",
|
||||
"quick_complete_defaults_title": "Gyorselvégzés alapértékei (QR-beolvasáshoz, opcionális)",
|
||||
"quick_complete_defaults_desc": "Előre beállított értékek a gyorselvégző QR-beolvasásokhoz. Ezek nélkül a QR az elvégzési párbeszédablakot nyitja meg.",
|
||||
"quick_complete_defaults_notes": "Megjegyzések",
|
||||
"quick_complete_defaults_cost": "Költség",
|
||||
"quick_complete_defaults_duration": "Időtartam (perc)",
|
||||
"quick_complete_defaults_feedback_none": "Nincs visszajelzés",
|
||||
"quick_complete_defaults_feedback_needed": "Szükséges volt",
|
||||
"quick_complete_defaults_feedback_not_needed": "Nem volt szükséges",
|
||||
"quick_complete_success": "Gyorsan elvégzettként jelölve",
|
||||
"show_all_objects": "Minden objektum megjelenítése",
|
||||
"show_all_tasks": "Szűrő törlése — minden feladat megjelenítése",
|
||||
"filter_to_overdue": "Szűrés csak a lejárt feladatokra",
|
||||
"filter_to_due_soon": "Szűrés csak a hamarosan esedékes feladatokra",
|
||||
"filter_to_triggered": "Szűrés csak az aktivált feladatokra",
|
||||
"open_task": "Feladat megnyitása",
|
||||
"show_details": "Előzmények és statisztikák",
|
||||
"hide_details": "Részletek elrejtése",
|
||||
"history_empty": "Még nincsenek előzmények.",
|
||||
"history_edit_button": "Bejegyzés szerkesztése",
|
||||
"total_cost": "Összköltség",
|
||||
"times_performed": "Elvégezve",
|
||||
"older_entries": "régebbi",
|
||||
"open_in_panel": "Megnyitás a Karbantartás panelen",
|
||||
"skip_reason": "Kihagyás oka (opcionális)",
|
||||
"reset_to_date": "Utolsó elvégzés visszaállítása erre:",
|
||||
"delete_task_confirm": "Törli a feladatot az előzményeivel együtt?",
|
||||
"delete_object_confirm": "Törli az objektumot az összes feladatával együtt?",
|
||||
"loading": "Betöltés…",
|
||||
"archive": "Archiválás",
|
||||
"undo": "Visszavonás",
|
||||
"task_archived": "Feladat archiválva",
|
||||
"object_archived": "Objektum archiválva",
|
||||
"unarchive": "Archiválás visszavonása",
|
||||
"archived": "Archiválva",
|
||||
"show_archived": "Archiváltak megjelenítése",
|
||||
"hide_archived": "Archiváltak elrejtése",
|
||||
"confirm_archive_object": "Archiválja az objektumot és a feladatait? Megtartják előzményeiket, és később visszaállíthatók.",
|
||||
"settings_archive": "Archiválás és megőrzés",
|
||||
"settings_archive_desc": "Elvégzett egyszeri feladatok kivezetése törlés nélkül. Az archivált elemek rejtettek és inaktívak, de megtartják előzményeiket és költségeiket.",
|
||||
"settings_archive_oneoff_days": "Elvégzett egyszeri feladatok automatikus archiválása ennyi nap után (0 = ki)",
|
||||
"settings_delete_archived_oneoff_days": "Archivált egyszeri feladatok automatikus törlése ennyi nap után (0 = soha)",
|
||||
"archive_object": "Objektum archiválása",
|
||||
"unarchive_object": "Objektum visszaállítása",
|
||||
"documents": "Dokumentumok",
|
||||
"documents_empty": "Még nincsenek dokumentumok.",
|
||||
"doc_upload": "Fájl feltöltése",
|
||||
"doc_uploading": "Feltöltés…",
|
||||
"doc_add_link": "Hivatkozás hozzáadása",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Cím (opcionális)",
|
||||
"doc_open": "Megnyitás",
|
||||
"doc_delete_confirm": "Törli a(z) „{name}” elemet?",
|
||||
"doc_too_large": "A fájl túl nagy (max. 25 MB).",
|
||||
"doc_upload_failed": "A feltöltés nem sikerült.",
|
||||
"completion_photo_optional": "Fotó az elvégzésről (opcionális)",
|
||||
"add_photo": "Fotó hozzáadása",
|
||||
"uploading": "Feltöltés…",
|
||||
"remove": "Eltávolítás",
|
||||
"doc_deduped": "Már máshol is tárolva — megosztott, nem foglal extra helyet.",
|
||||
"doc_dup_in_object": "Ez a fájl már csatolva van ehhez az objektumhoz.",
|
||||
"doc_link_invalid": "Csak http/https hivatkozás engedélyezett.",
|
||||
"doc_cat_manual": "Kézikönyv",
|
||||
"doc_cat_warranty": "Garancia",
|
||||
"doc_cat_invoice": "Számla",
|
||||
"doc_cat_spare_parts": "Pótalkatrészek",
|
||||
"doc_cat_photo": "Fotó",
|
||||
"doc_cat_other": "Egyéb",
|
||||
"doc_link_badge": "Hivatkozás",
|
||||
"doc_storage_title": "Dokumentumtárhely",
|
||||
"doc_storage_saved": "Deduplikációval megtakarítva",
|
||||
"doc_storage_refresh": "Frissítés",
|
||||
"doc_download": "Letöltés",
|
||||
"doc_close": "Bezárás",
|
||||
"doc_camera": "Fotó készítése",
|
||||
"doc_drop_hint": "Húzza ide a fájlokat",
|
||||
"doc_task_none": "Ehhez a feladathoz nincs dokumentum csatolva.",
|
||||
"doc_link_existing": "Dokumentum hozzárendelése…",
|
||||
"doc_attach": "Hozzárendelés",
|
||||
"doc_unlink": "Leválasztás",
|
||||
"doc_page": "Oldal",
|
||||
"chart_range_7d": "7 nap",
|
||||
"chart_range_30d": "30 nap",
|
||||
"chart_range_90d": "90 nap",
|
||||
"chart_range_1y": "1 év",
|
||||
"chart_since_service": "az utolsó szerviz óta",
|
||||
"chart_no_stats": "Nincs hosszú távú statisztika ehhez az entitáshoz — csak a karbantartási események értékei láthatók",
|
||||
"auto_complete_on_recovery": "Automatikus elvégzés, ha az érzékelő helyreáll",
|
||||
"auto_complete_on_recovery_help": "Elvégzést rögzít (beállítja az utolsó elvégzést), amikor a kiváltás magától megszűnik — pl. só utántöltve, szűrő kicserélve.",
|
||||
"doc_search": "Dokumentumok keresése…",
|
||||
"doc_search_none": "Nincs egyező dokumentum",
|
||||
"link_device_optional": "Meglévő eszközhöz kapcsolás (opcionális)",
|
||||
"parent_object_optional": "Szülőobjektum (opcionális)",
|
||||
"parent_none": "(Nincs szülő)",
|
||||
"paused": "Szüneteltetve",
|
||||
"pause_object": "Szüneteltetés",
|
||||
"resume_object": "Folytatás",
|
||||
"pause_until_prompt": "Az objektum ütemezéseinek befagyasztása — semmi nem válik esedékessé, és nincs értesítés a folytatásig. Megadhat automatikus folytatási dátumot is.",
|
||||
"pause_until_label": "Folytatás ekkor (opcionális)",
|
||||
"object_paused": "Objektum szüneteltetve",
|
||||
"object_resumed": "Objektum folytatva — az ütemezések újraindultak",
|
||||
"object_paused_badge": "Szüneteltetve",
|
||||
"paused_until_label": "eddig:",
|
||||
"replace_object": "Csere…",
|
||||
"replace_object_prompt": "Az objektum kivezetése és utód létrehozása. Az előzmények és a költségek archiválva a régin maradnak; a feladatok és a dokumentumok átkerülnek az újra, a számlálók nulláról indulnak.",
|
||||
"replace_name_label": "Utód neve",
|
||||
"object_replaced": "Objektum lecserélve — utód létrehozva",
|
||||
"reading_unit_label": "Leolvasás mértékegysége (pl. kWh, m³)",
|
||||
"reading_unit_help": "A rögzített érték mellett jelenik meg a feladat elvégzésekor.",
|
||||
"reading_value_label": "Leolvasott érték",
|
||||
"reading_label": "Leolvasás",
|
||||
"settings_templates_label": "Sablongaléria",
|
||||
"settings_templates_hint": "Vegye ki a pipát a sosem használt sablonoknál — így eltűnnek a „Sablonból” választókból (panel és konfigurációs folyamat). Semmi más nem változik; bármikor újra engedélyezheti őket.",
|
||||
"worksheet": "Munkalap",
|
||||
"worksheet_scan_view": "Olvassa be a feladat megnyitásához",
|
||||
"worksheet_scan_complete": "Olvassa be az elvégzéshez",
|
||||
"worksheet_manual_excerpt": "Kézikönyv-részlet",
|
||||
"worksheet_pages": "oldal",
|
||||
"worksheet_printed": "Nyomtatva",
|
||||
"worksheet_never": "Soha",
|
||||
"card_all_caught_up": "Minden rendben — semmi nem igényel figyelmet",
|
||||
"postpone": "Halasztás",
|
||||
"postpone_date_prompt": "Melyik dátumra halasztja ezt az alkalmat?",
|
||||
"postpone_date_label": "Új határidő",
|
||||
"postponed": "Elhalasztva",
|
||||
"postponed_to": "Elhalasztva erre:",
|
||||
"season_window_label": "Szezonális időablak (hónapok)",
|
||||
"season_window_hint": "Csak a kiválasztott hónapokban esedékes; a szezonon kívüli dátumok a következő aktív hónapra tolódnak. Nincs = egész évben.",
|
||||
"series_end_label": "Befejeződik",
|
||||
"series_end_never": "Soha (végtelen ismétlés)",
|
||||
"series_end_after_count": "Adott számú alkalom után",
|
||||
"series_end_until": "Egy adott dátumon",
|
||||
"series_end_count_label": "Alkalmak száma",
|
||||
"series_end_until_label": "Befejezés dátuma",
|
||||
"parts_section": "Alkatrészek és fogyóeszközök",
|
||||
"part_add": "Alkatrész hozzáadása",
|
||||
"part_name": "Név",
|
||||
"part_vendor": "Gyártó",
|
||||
"part_storage_location": "Tárolási hely",
|
||||
"part_product_url": "Termék URL",
|
||||
"part_unit": "Egység",
|
||||
"part_cost": "Egységár",
|
||||
"part_stock": "Készlet",
|
||||
"part_reorder_threshold": "Újrarendelés ennél",
|
||||
"part_restock_quantity": "Feltöltési mennyiség",
|
||||
"part_auto_buy": "Vásárlási feladat automatikus létrehozása, ha kevés van",
|
||||
"part_restock": "Készlet módosítása",
|
||||
"restock_quantity_label": "Vásárolt mennyiség",
|
||||
"consumes_parts_label": "Felhasznált alkatrészek",
|
||||
"parts_load_failed": "Az objektum alkatrészei nem tölthetők be — a felhasznált alkatrészek beállításai most nem érhetők el.",
|
||||
"adopt_problem_button": "Problémaérzékelők átvétele",
|
||||
"adopt_problem_title": "Problémaérzékelők átvétele",
|
||||
"adopt_problem_hint": "Alakítsa a HA problémaérzékelőit (nyomtatóhibák, szűrőfigyelmeztetések, gyenge elem) karbantartási feladatokká, amelyek a probléma fennállása alatt aktívak, és maguktól lezáródnak, amikor a probléma megoldódik.",
|
||||
"adopt_problem_none": "Nem található még nem követett problémaérzékelő.",
|
||||
"adopt_problem_active": "aktív",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(új)",
|
||||
"adopt_problem_adopt": "Kijelöltek átvétele",
|
||||
"adopt_problem_done": "{tasks} problémaérzékelő átvéve",
|
||||
"views_label": "Nézetek",
|
||||
"views_none": "— Nincs nézet —",
|
||||
"views_manage": "Nézetek mentése / kezelése",
|
||||
"views_dialog_title": "Mentett nézetek",
|
||||
"views_dialog_hint": "Mentse el az aktuális szűrőket névvel ellátott nézetként, amelyet mindenki használhat.",
|
||||
"views_name_placeholder": "Nézet neve",
|
||||
"views_save_current": "Aktuális szűrők mentése",
|
||||
"views_none_yet": "Még nincsenek mentett nézetek.",
|
||||
"close": "Bezárás",
|
||||
"trigger_hint_now": "Az érzékelő jelenlegi értéke: {value}.",
|
||||
"trigger_hint_above": "A feladat akkor aktiválódik, amikor az érték {target} fölé emelkedik.",
|
||||
"trigger_hint_below": "Akkor aktiválódik, amikor az érték {target} alá csökken.",
|
||||
"trigger_hint_counter_delta": "A jelenlegi értéktől ({value}) számol: esedékes {due} értéknél (+{target}), és a számlálás minden elvégzés után újraindul.",
|
||||
"trigger_hint_counter_delta_edit": "A legutóbbi elvégzés óta számolja a használatot: esedékes +{target} után; a számlálás minden elvégzés után újraindul.",
|
||||
"trigger_hint_counter_abs": "A feladat akkor válik esedékessé, amikor az érzékelő eléri a(z) {target} értéket.",
|
||||
"trigger_hint_runtime": "A feladat {hours} óra összesített üzemidő után válik esedékessé; a számláló minden elvégzés után újraindul.",
|
||||
"trigger_hint_state_change": "A feladat {count} állapotváltozás után válik esedékessé.",
|
||||
"trigger_hint_state_change_to": "A feladat {count} alkalommal „{state}” állapotra váltás után válik esedékessé.",
|
||||
"trigger_hint_state_now": "Jelenlegi állapot: {value}.",
|
||||
"adopt_problem_part": "Alkatrészt használ: {name}",
|
||||
"label_filter": "Címke",
|
||||
"all_labels": "Minden címke",
|
||||
"settings_notify_scope": "Értesítés csak erre a nézetre",
|
||||
"settings_notify_scope_all": "Minden feladat",
|
||||
"settings_notify_scope_hint": "Csak a kiválasztott mentett nézet címke-/felhasználószűrőinek megfelelő feladatok küldenek emlékeztetőt. A nézet állapot-, rendezési és csoportosítási beállításait itt figyelmen kívül hagyjuk.",
|
||||
"card_saved_view": "Mentett nézet",
|
||||
"card_saved_view_none": "Nincs",
|
||||
"card_saved_view_help": "A nézet állapot-, felhasználó- és címkeszűrőit a fenti szűrőkön felül alkalmazza. A nézet rendezése és csoportosítása a panel megjelenítési beállítása, a kártyán nem érvényesül.",
|
||||
"doc_part_none": "Ehhez az alkatrészhez nincs dokumentum csatolva.",
|
||||
"settings_templates_toggle_group": "A csoport összes sablonjának be- vagy kikapcsolása",
|
||||
"setups_button": "Javasolt beállítások",
|
||||
"setups_title": "Javasolt beállítások (béta)",
|
||||
"setups_hint": "Támogatott integrációk eszközei, amelyek fogyóeszköz-érzékelői karbantartási feladatokat vezérelhetnek. Az átvétel létrehozza az objektumot, és minden feladatot az érzékelőjéhez köt — a feladat akkor aktiválódik, amikor a fogyóeszköz fogytán van, és a csere után magától lezáródik.",
|
||||
"setups_none": "Nem található támogatott eszköz bekötetlen fogyóeszköz-érzékelővel.",
|
||||
"setups_adopt": "Kijelöltek beállítása",
|
||||
"setups_done": "{tasks} érzékelőhöz kötött feladat létrehozva.",
|
||||
"complete_parts_used": "Most felhasznált alkatrészek",
|
||||
"part_delete_confirm": "Törli a(z) „{name}” alkatrészt? A készletkövetése, a feladatkapcsolatai és minden nyitott vásárlási emlékeztetője is törlődik.",
|
||||
"baseline_start_value": "Kezdő leolvasás (opcionális)",
|
||||
"baseline_start_help": "A számlálás ettől az értéktől indul. Hagyja üresen, ha a jelenlegi értéktől számolna; adja meg az utolsó szerviz értékét, hogy az azóta felhalmozott használat is beleszámítson.",
|
||||
"setups_baseline_hint": "érték az utolsó szerviznél (opcionális)",
|
||||
"baseline_start_help_edit": "Üresen hagyva a meglévő számlálás marad. Érték megadása újrahorgonyozza a számlálást (pl. az utolsó szerviz leolvasott értéke).",
|
||||
"baseline_current_effective": "Jelenleg érvényes kezdőérték: {value}",
|
||||
"runtime_on_states": "Aktív állapotok (vesszővel elválasztva)",
|
||||
"runtime_on_states_help": "Működésként számító állapotok — alapértelmezés: on. Pl. mowing, cleaning, printing. Attribútum kiválasztásakor annak értékei számítanak.",
|
||||
"setups_target_new": "Új létrehozása: {name}",
|
||||
"schedule_preview_title": "Következő dátumok",
|
||||
"schedule_preview_ontime": "Időben történő elvégzést feltételezve.",
|
||||
"schedule_preview_ends": "(a sorozat véget ér)",
|
||||
"adopt_problem_responsible": "Felelős felhasználó az összes átvett feladathoz (opcionális)",
|
||||
"adopt_problem_configure": "Beállítás",
|
||||
"history_auto": "Automatikus",
|
||||
"battery_fleet_title": "Elemflotta",
|
||||
"battery_fleet_none_low": "Minden elem rendben — nincs mit cserélni.",
|
||||
"battery_fleet_buy_now": "Vásárlás most",
|
||||
"battery_fleet_soon": "Hamarosan szükséges",
|
||||
"battery_fleet_soon_hint": "Az utolsó cseredátumból előrejelezve — rendeljen előre.",
|
||||
"battery_fleet_mark_all": "Mind cseréltként jelölése",
|
||||
"battery_fleet_mark_one": "Elem cseréltként jelölése",
|
||||
"battery_fleet_offline": "offline",
|
||||
"battery_fleet_trigger_lost": "A feladat érzékelős kiváltója elveszett — nem fog aktiválódni és automatikusan lezáródni sem.",
|
||||
"battery_fleet_repair": "Javítás",
|
||||
"battery_fleet_exclude": "Kizárás a flottából",
|
||||
"battery_fleet_excluded": "Kizárva",
|
||||
"battery_fleet_include": "Követés újra",
|
||||
"battery_fleet_total": "{n} elem követve",
|
||||
"battery_fleet_setup_button": "Elemflotta",
|
||||
"battery_fleet_setup_done": "Elemflotta beállítva — egyetlen feladat követi az összes elemet.",
|
||||
"update_banner": "A Maintenance Supporter újabb verziója érhető el a szerveren — töltse újra az oldalt a panel frissítéséhez.",
|
||||
"update_reload": "Újratöltés"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "유지보수",
|
||||
"objects": "객체",
|
||||
"tasks": "작업",
|
||||
"overdue": "기한 초과",
|
||||
"due_soon": "기한 임박",
|
||||
"triggered": "트리거됨",
|
||||
"trigger_replaced": "트리거 교체됨",
|
||||
"ok": "정상",
|
||||
"all": "전체",
|
||||
"new_object": "+ 새 객체",
|
||||
"templates_from": "템플릿에서",
|
||||
"templates_title": "템플릿으로 시작하기",
|
||||
"templates_task_count": "작업 {n}개",
|
||||
"template_created": "템플릿에서 생성됨",
|
||||
"onboard_hint": "첫 객체를 추가하여 유지보수 추적을 시작하세요.",
|
||||
"edit": "편집",
|
||||
"duplicate": "복제",
|
||||
"task_duplicated": "작업이 복제되었습니다",
|
||||
"object_duplicated": "객체가 복제되었습니다",
|
||||
"delete": "삭제",
|
||||
"add_task": "+ 작업 추가",
|
||||
"complete": "완료",
|
||||
"completed": "완료됨",
|
||||
"skip": "건너뛰기",
|
||||
"skipped": "건너뜀",
|
||||
"missed": "놓침",
|
||||
"reset": "초기화",
|
||||
"snooze": "다시 알림",
|
||||
"snoozed": "다시 알림 설정됨",
|
||||
"cancel": "취소",
|
||||
"bulk_select": "선택",
|
||||
"bulk_select_all": "모두 선택",
|
||||
"bulk_n_selected": "{n}개 선택됨",
|
||||
"bulk_completed": "작업 {n}개 완료됨",
|
||||
"bulk_archived": "작업 {n}개 보관됨",
|
||||
"completing": "완료 처리 중…",
|
||||
"interval": "주기",
|
||||
"warning": "경고",
|
||||
"last_performed": "마지막 수행일",
|
||||
"next_due": "다음 예정일",
|
||||
"days_until_due": "남은 일수",
|
||||
"avg_duration": "평균 소요 시간",
|
||||
"trigger": "트리거",
|
||||
"trigger_type": "트리거 유형",
|
||||
"threshold_above": "상한",
|
||||
"threshold_below": "하한",
|
||||
"threshold": "임계값",
|
||||
"counter": "카운터",
|
||||
"state_change": "상태 변경",
|
||||
"runtime": "가동 시간",
|
||||
"runtime_hours": "목표 가동 시간 (시간)",
|
||||
"target_value": "목표값",
|
||||
"baseline": "기준값",
|
||||
"target_changes": "목표 변경 횟수",
|
||||
"for_minutes": "지속 시간 (분)",
|
||||
"time_based": "시간 기반",
|
||||
"sensor_based": "센서 기반",
|
||||
"manual": "수동",
|
||||
"one_time": "일회성",
|
||||
"weekdays": "요일",
|
||||
"nth_weekday": "매월 N번째 요일",
|
||||
"day_of_month": "매월 특정 일",
|
||||
"recurrence_on_days": "반복 요일",
|
||||
"recurrence_occurrence": "회차",
|
||||
"recurrence_weekday": "요일",
|
||||
"recurrence_day": "일 (1–31)",
|
||||
"recurrence_last_day": "매월 마지막 날",
|
||||
"recurrence_business_day": "평일만 (주말이면 앞당김)",
|
||||
"recurrence_offset": "오프셋 (일, ±)",
|
||||
"recurrence_offset_help": "날짜를 ±N일 이동합니다. 예: -2 = 이틀 전.",
|
||||
"last_day_month": "매월 마지막 날",
|
||||
"last_business_day_month": "마지막 평일",
|
||||
"ord_1": "첫째",
|
||||
"ord_2": "둘째",
|
||||
"ord_3": "셋째",
|
||||
"ord_4": "넷째",
|
||||
"ord_5": "다섯째",
|
||||
"ord_last": "마지막",
|
||||
"day_word": "일",
|
||||
"interval_value": "주기",
|
||||
"interval_unit": "단위",
|
||||
"unit_days": "일",
|
||||
"unit_weeks": "주",
|
||||
"unit_months": "개월",
|
||||
"unit_years": "년",
|
||||
"due_date": "예정일",
|
||||
"cleaning": "청소",
|
||||
"inspection": "점검",
|
||||
"replacement": "교체",
|
||||
"calibration": "보정",
|
||||
"service": "정비",
|
||||
"reading": "검침",
|
||||
"custom": "사용자 지정",
|
||||
"history": "기록",
|
||||
"cost": "비용",
|
||||
"report_button": "보고서",
|
||||
"report_title": "유지보수 보고서",
|
||||
"report_generated": "생성일",
|
||||
"report_times_done": "수행 횟수",
|
||||
"report_total_cost": "총 비용",
|
||||
"report_every": "{n} {unit}마다",
|
||||
"report_notes": "메모",
|
||||
"report_col_type": "유형",
|
||||
"report_col_status": "상태",
|
||||
"report_col_schedule": "일정",
|
||||
"duration": "소요 시간",
|
||||
"both": "둘 다",
|
||||
"trigger_val": "트리거 값",
|
||||
"complete_title": "완료: ",
|
||||
"checklist": "체크리스트",
|
||||
"checklist_steps_optional": "체크리스트 단계 (선택)",
|
||||
"checklist_placeholder": "필터 청소\n씰 교체\n압력 테스트",
|
||||
"checklist_help": "한 줄에 한 단계씩 입력하세요. 최대 100개.",
|
||||
"err_too_long": "{field}: 너무 깁니다 (최대 {n}자)",
|
||||
"err_too_short": "{field}: 너무 짧습니다 (최소 {n}자)",
|
||||
"err_value_too_high": "{field}: 너무 큽니다 (최대 {n})",
|
||||
"err_value_too_low": "{field}: 너무 작습니다 (최소 {n})",
|
||||
"err_required": "{field}: 필수 항목입니다",
|
||||
"err_wrong_type": "{field}: 잘못된 형식입니다 (예상: {type})",
|
||||
"err_invalid_choice": "{field}: 허용되지 않는 값입니다",
|
||||
"err_invalid_value": "{field}: 유효하지 않은 값입니다",
|
||||
"feat_schedule_time": "시각 지정 일정",
|
||||
"feat_schedule_time_desc": "작업이 자정이 아닌 지정한 시각에 기한 초과로 전환됩니다.",
|
||||
"schedule_time_optional": "기한 시각 (선택, HH:MM)",
|
||||
"schedule_time_help": "비워두면 자정(기본값)입니다. HA 시간대 기준.",
|
||||
"at_time": "시각",
|
||||
"notes_optional": "메모 (선택)",
|
||||
"cost_optional": "비용 (선택)",
|
||||
"duration_minutes": "소요 시간(분, 선택)",
|
||||
"days": "일",
|
||||
"day": "일",
|
||||
"today": "오늘",
|
||||
"d_overdue": "일 초과",
|
||||
"no_tasks": "아직 유지보수 작업이 없습니다. 객체를 만들어 시작하세요.",
|
||||
"no_tasks_short": "작업 없음",
|
||||
"no_history": "아직 기록이 없습니다.",
|
||||
"show_all": "모두 보기",
|
||||
"cost_duration_chart": "비용 및 소요 시간",
|
||||
"installed": "설치일",
|
||||
"confirm_delete_object": "이 객체와 모든 작업을 삭제할까요?",
|
||||
"confirm_delete_task": "이 작업을 삭제할까요?",
|
||||
"min": "최소",
|
||||
"max": "최대",
|
||||
"save": "저장",
|
||||
"saving": "저장 중…",
|
||||
"edit_task": "작업 편집",
|
||||
"new_task": "새 유지보수 작업",
|
||||
"task_name": "작업 이름",
|
||||
"maintenance_type": "유지보수 유형",
|
||||
"priority": "우선순위",
|
||||
"labels": "라벨",
|
||||
"labels_placeholder": "예: 안전, 계절, 세입자용",
|
||||
"labels_help": "필터링과 보고서에 쓰이는 쉼표로 구분된 태그입니다.",
|
||||
"priority_low": "낮음",
|
||||
"priority_normal": "보통",
|
||||
"priority_high": "높음",
|
||||
"schedule_type": "일정 유형",
|
||||
"interval_days": "주기 (일)",
|
||||
"warning_days": "경고 일수",
|
||||
"earliest_completion_days": "조기 완료 허용 (기한 전 일수)",
|
||||
"earliest_completion_days_help": "비워두면 언제든 완료할 수 있습니다. 0 = 기한 당일 이후에만.",
|
||||
"last_performed_optional": "마지막 수행일 (선택)",
|
||||
"interval_anchor": "주기 기준",
|
||||
"anchor_completion": "완료일 기준",
|
||||
"anchor_planned": "예정일 기준 (밀림 없음)",
|
||||
"edit_object": "객체 편집",
|
||||
"name": "이름",
|
||||
"manufacturer_optional": "제조사 (선택)",
|
||||
"model_optional": "모델 (선택)",
|
||||
"serial_number_optional": "일련번호 (선택)",
|
||||
"serial_number_label": "일련번호",
|
||||
"documentation_url_label": "설명서",
|
||||
"object_notes_label": "메모",
|
||||
"sort_due_date": "예정일",
|
||||
"sort_object": "객체 이름",
|
||||
"sort_type": "유형",
|
||||
"sort_task_name": "작업 이름",
|
||||
"all_objects": "모든 객체",
|
||||
"tasks_lower": "작업",
|
||||
"no_tasks_yet": "아직 작업 없음",
|
||||
"add_first_task": "첫 작업 추가",
|
||||
"trigger_configuration": "트리거 설정",
|
||||
"entity_id": "엔티티 ID",
|
||||
"comma_separated": "쉼표로 구분",
|
||||
"entity_logic": "엔티티 논리",
|
||||
"entity_logic_any": "하나라도 트리거되면",
|
||||
"entity_logic_all": "모든 엔티티가 트리거되어야 함",
|
||||
"entities": "엔티티",
|
||||
"attribute_optional": "속성 (선택, 비우면 상태 사용)",
|
||||
"use_entity_state": "엔티티 상태 사용 (속성 없음)",
|
||||
"trigger_above": "초과 시 트리거",
|
||||
"trigger_below": "미만 시 트리거",
|
||||
"for_at_least_minutes": "최소 지속 시간 (분)",
|
||||
"safety_interval_days": "안전 주기 (일, 선택)",
|
||||
"safety_interval": "안전 주기 (선택)",
|
||||
"delta_mode": "델타 모드",
|
||||
"from_state_optional": "변경 전 상태 (선택)",
|
||||
"to_state_optional": "변경 후 상태 (선택)",
|
||||
"documentation_url_optional": "설명서 URL (선택)",
|
||||
"object_notes_optional": "메모 (선택)",
|
||||
"nfc_tag_id_optional": "NFC 태그 ID (선택)",
|
||||
"nfc_tags_empty_help": "Home Assistant에 등록된 NFC 태그가 아직 없습니다.",
|
||||
"nfc_tags_open_settings": "태그 설정 열기",
|
||||
"nfc_tags_refresh": "새로 고침",
|
||||
"environmental_entity_optional": "환경 센서 (선택)",
|
||||
"environmental_entity_helper": "예: sensor.outdoor_temperature — 환경 조건에 따라 주기를 조정합니다",
|
||||
"environmental_attribute_optional": "환경 속성 (선택)",
|
||||
"nfc_tag_id": "NFC 태그 ID",
|
||||
"nfc_linked": "NFC 태그 연결됨",
|
||||
"nfc_link_hint": "클릭하여 NFC 태그 연결",
|
||||
"responsible_user": "담당자",
|
||||
"shared_with": "공유 대상 (순환 담당)",
|
||||
"shared_with_help": "여러 명을 선택해 작업을 공유하세요. 완료할 때마다 담당자가 교대됩니다.",
|
||||
"rotation_strategy": "교대 방식",
|
||||
"rotation_none": "교대 없음",
|
||||
"rotation_round_robin": "순서대로",
|
||||
"rotation_least_completed": "완료 횟수가 적은 사람",
|
||||
"rotation_random": "무작위",
|
||||
"no_user_assigned": "(담당자 없음)",
|
||||
"all_users": "모든 사용자",
|
||||
"my_tasks": "내 작업",
|
||||
"tab_calendar": "캘린더",
|
||||
"cal_no_events": "유지보수 없음",
|
||||
"cal_window_7": "7일",
|
||||
"cal_window_14": "14일",
|
||||
"cal_window_30": "30일",
|
||||
"cal_window_365": "1년",
|
||||
"cal_every_n_days": "{n}일마다",
|
||||
"cal_source_time": "시간 기반",
|
||||
"cal_source_time_adaptive": "시간 기반 (적응형)",
|
||||
"cal_source_sensor": "센서 기반",
|
||||
"cal_predicted": "예측됨",
|
||||
"cal_confidence_high": "높은 신뢰도",
|
||||
"cal_confidence_medium": "중간 신뢰도",
|
||||
"cal_confidence_low": "낮은 신뢰도",
|
||||
"budget_monthly": "월 예산",
|
||||
"budget_yearly": "연 예산",
|
||||
"groups": "그룹",
|
||||
"new_group": "새 그룹",
|
||||
"edit_group": "그룹 편집",
|
||||
"no_groups": "아직 그룹 없음",
|
||||
"delete_group": "그룹 삭제",
|
||||
"delete_group_confirm": "'{name}' 그룹을 삭제할까요?",
|
||||
"group_select_tasks": "작업 선택",
|
||||
"group_name_required": "이름은 필수입니다",
|
||||
"description_optional": "설명 (선택)",
|
||||
"selected": "선택됨",
|
||||
"loading_chart": "차트 데이터 불러오는 중...",
|
||||
"hide_outliers": "이상값 숨기기 (센서 오류)",
|
||||
"was_maintenance_needed": "이 유지보수가 필요했나요?",
|
||||
"feedback_needed": "필요했음",
|
||||
"feedback_not_needed": "불필요했음",
|
||||
"feedback_not_sure": "잘 모름",
|
||||
"suggested_interval": "제안 주기",
|
||||
"apply_suggestion": "적용",
|
||||
"reanalyze": "재분석",
|
||||
"reanalyze_result": "새 분석 결과",
|
||||
"reanalyze_insufficient_data": "권장값을 산출하기에 데이터가 부족합니다",
|
||||
"data_points": "데이터 포인트",
|
||||
"dismiss_suggestion": "무시",
|
||||
"confidence_low": "낮음",
|
||||
"confidence_medium": "중간",
|
||||
"confidence_high": "높음",
|
||||
"recommended": "권장",
|
||||
"seasonal_awareness": "계절 인식",
|
||||
"edit_seasonal_overrides": "계절 계수 편집",
|
||||
"seasonal_overrides_title": "계절 계수 (수동 설정)",
|
||||
"seasonal_overrides_hint": "월별 계수 (0.1–5.0). 비워두면 자동으로 학습됩니다.",
|
||||
"seasonal_override_invalid": "유효하지 않은 값",
|
||||
"seasonal_override_range": "계수는 0.1에서 5.0 사이여야 합니다",
|
||||
"clear_all": "모두 지우기",
|
||||
"seasonal_chart_title": "계절 계수",
|
||||
"seasonal_learned": "학습됨",
|
||||
"seasonal_manual": "수동",
|
||||
"month_jan": "1월",
|
||||
"month_feb": "2월",
|
||||
"month_mar": "3월",
|
||||
"month_apr": "4월",
|
||||
"month_may": "5월",
|
||||
"month_jun": "6월",
|
||||
"month_jul": "7월",
|
||||
"month_aug": "8월",
|
||||
"month_sep": "9월",
|
||||
"month_oct": "10월",
|
||||
"month_nov": "11월",
|
||||
"month_dec": "12월",
|
||||
"sensor_prediction": "센서 예측",
|
||||
"degradation_trend": "추세",
|
||||
"trend_rising": "상승",
|
||||
"trend_falling": "하강",
|
||||
"trend_stable": "안정",
|
||||
"trend_insufficient_data": "데이터 부족",
|
||||
"days_until_threshold": "임계값까지 남은 일수",
|
||||
"threshold_exceeded": "임계값 초과",
|
||||
"environmental_adjustment": "환경 계수",
|
||||
"sensor_prediction_urgency": "센서 예측: 약 {days}일 후 임계값 도달",
|
||||
"day_short": "일",
|
||||
"weibull_reliability_curve": "신뢰도 곡선",
|
||||
"weibull_failure_probability": "고장 확률",
|
||||
"weibull_r_squared": "적합도 R²",
|
||||
"beta_early_failures": "초기 고장",
|
||||
"beta_random_failures": "무작위 고장",
|
||||
"beta_wear_out": "마모 고장",
|
||||
"beta_highly_predictable": "매우 예측 가능",
|
||||
"confidence_interval": "신뢰 구간",
|
||||
"confidence_conservative": "보수적",
|
||||
"confidence_aggressive": "낙관적",
|
||||
"current_interval_marker": "현재 주기",
|
||||
"recommended_marker": "권장",
|
||||
"characteristic_life": "특성 수명",
|
||||
"chart_mini_sparkline": "추세 스파크라인",
|
||||
"chart_history": "비용 및 소요 시간 기록",
|
||||
"chart_seasonal": "계절 계수, 12개월",
|
||||
"chart_weibull": "Weibull 신뢰도 곡선",
|
||||
"chart_sparkline": "센서 트리거 값 차트",
|
||||
"days_progress": "일수 진행률",
|
||||
"qr_code": "QR 코드",
|
||||
"qr_generating": "QR 코드 생성 중…",
|
||||
"qr_error": "QR 코드 생성에 실패했습니다.",
|
||||
"qr_error_no_url": "설정된 HA URL이 없습니다. 설정 → 시스템 → 네트워크에서 외부 또는 내부 URL을 설정해 주세요.",
|
||||
"save_error": "저장에 실패했습니다. 다시 시도해 주세요.",
|
||||
"qr_print": "인쇄",
|
||||
"qr_download": "SVG 다운로드",
|
||||
"qr_action": "스캔 시 동작",
|
||||
"qr_action_view": "유지보수 정보 보기",
|
||||
"qr_action_complete": "유지보수 완료로 표시",
|
||||
"qr_url_mode": "링크 유형",
|
||||
"qr_mode_companion": "Companion 앱",
|
||||
"qr_mode_local": "로컬 (mDNS)",
|
||||
"qr_mode_server": "서버 URL",
|
||||
"overview": "개요",
|
||||
"analysis": "분석",
|
||||
"recent_activities": "최근 활동",
|
||||
"search_notes": "메모 검색",
|
||||
"avg_cost": "평균 비용",
|
||||
"no_advanced_features": "활성화된 고급 기능 없음",
|
||||
"no_advanced_features_hint": "통합구성요소 설정에서 “적응형 일정” 또는 “계절 패턴”을 활성화하면 여기에서 분석 데이터를 볼 수 있습니다.",
|
||||
"analysis_not_enough_data": "아직 분석할 데이터가 충분하지 않습니다.",
|
||||
"analysis_not_enough_data_hint": "Weibull 분석에는 최소 5회의 완료 기록이 필요하며, 계절 패턴은 월별 6개 이상의 데이터 포인트가 쌓이면 표시됩니다.",
|
||||
"analysis_manual_task_hint": "주기가 없는 수동 작업은 분석 데이터를 생성하지 않습니다.",
|
||||
"completions": "회 완료",
|
||||
"current": "현재",
|
||||
"shorter": "더 짧게",
|
||||
"longer": "더 길게",
|
||||
"normal": "보통",
|
||||
"disabled": "비활성화됨",
|
||||
"compound_logic": "복합 논리",
|
||||
"compound": "복합 (여러 조건)",
|
||||
"compound_logic_and": "AND — 모든 조건이 트리거되어야 함",
|
||||
"compound_logic_or": "OR — 하나의 조건만 트리거되면 됨",
|
||||
"compound_help": "여러 센서 조건을 하나의 트리거로 결합합니다.",
|
||||
"compound_no_conditions": "아직 조건이 없습니다 — 최소 하나를 추가하세요.",
|
||||
"compound_add_condition": "조건 추가",
|
||||
"compound_condition": "조건",
|
||||
"compound_remove_condition": "조건 제거",
|
||||
"card_title": "제목",
|
||||
"card_show_header": "통계 헤더 표시",
|
||||
"card_show_actions": "동작 버튼 표시",
|
||||
"card_compact": "컴팩트 모드",
|
||||
"card_max_items": "최대 항목 수 (0 = 전체)",
|
||||
"card_filter_status": "상태로 필터",
|
||||
"card_filter_status_help": "비워두면 모든 상태를 표시합니다.",
|
||||
"card_filter_objects": "객체로 필터",
|
||||
"card_filter_objects_help": "비워두면 모든 객체를 표시합니다.",
|
||||
"card_filter_entities": "엔티티로 필터 (entity_ids)",
|
||||
"card_filter_entities_help": "이 통합구성요소의 sensor / binary_sensor 엔티티를 선택하세요. 비워두면 전체.",
|
||||
"card_loading_objects": "객체 불러오는 중…",
|
||||
"card_load_error": "객체를 불러올 수 없습니다 — WebSocket 연결을 확인하세요.",
|
||||
"card_no_tasks_title": "아직 유지보수 작업이 없습니다",
|
||||
"card_no_tasks_cta": "→ 유지보수 패널에서 만들어 보세요",
|
||||
"no_objects": "아직 객체가 없습니다.",
|
||||
"action_error": "동작에 실패했습니다. 다시 시도해 주세요.",
|
||||
"area_id_optional": "구역 (선택)",
|
||||
"installation_date_optional": "설치일 (선택)",
|
||||
"warranty_expiry_optional": "보증 만료일 (선택)",
|
||||
"warranty": "보증",
|
||||
"warranty_valid_until": "{date}까지 유효",
|
||||
"warranty_expires_in": "{days}일 후 만료",
|
||||
"warranty_expired": "만료됨",
|
||||
"cal_past_windows": "이전 기간",
|
||||
"cal_forward_windows": "이후 기간",
|
||||
"history_edit_title": "기록 항목 편집",
|
||||
"history_edit_timestamp": "타임스탬프",
|
||||
"manufacturer": "제조사",
|
||||
"model": "모델",
|
||||
"area": "구역",
|
||||
"actions": "동작",
|
||||
"view_mode_label": "보기",
|
||||
"view_cards": "카드 보기",
|
||||
"view_table": "표 보기",
|
||||
"objects_table_columns_label": "객체 표 열",
|
||||
"objects_table_columns_hint": "객체 표 보기에 표시할 열을 선택하세요.",
|
||||
"custom_icon_optional": "아이콘 (선택, 예: mdi:wrench)",
|
||||
"task_enabled": "작업 활성화",
|
||||
"skip_reason_prompt": "이 작업을 건너뛸까요?",
|
||||
"reason_optional": "사유 (선택)",
|
||||
"reset_date_prompt": "작업을 수행한 것으로 표시할까요?",
|
||||
"reset_date_optional": "마지막 수행일 (선택, 기본값은 오늘)",
|
||||
"notes_label": "메모",
|
||||
"documentation_label": "문서",
|
||||
"no_nfc_tag": "— 태그 없음 —",
|
||||
"dashboard": "대시보드",
|
||||
"tab_today": "오늘",
|
||||
"palette_placeholder": "객체와 작업 검색…",
|
||||
"palette_no_results": "일치 항목 없음",
|
||||
"palette_hint": "↑↓ 이동 · Enter 열기 · Esc 닫기",
|
||||
"today_all_caught_up": "모두 처리했습니다! 이번 주에 예정된 작업이 없습니다.",
|
||||
"today_overdue": "기한 초과",
|
||||
"today_due_today": "오늘 예정",
|
||||
"today_this_week": "이번 주",
|
||||
"settings": "설정",
|
||||
"settings_features": "고급 기능",
|
||||
"settings_features_desc": "고급 기능을 켜거나 끕니다. 끄면 UI에서 숨겨질 뿐 데이터는 삭제되지 않습니다.",
|
||||
"feat_adaptive": "적응형 일정",
|
||||
"feat_adaptive_desc": "유지보수 기록에서 최적 주기를 학습합니다",
|
||||
"feat_predictions": "센서 예측",
|
||||
"feat_predictions_desc": "센서 열화로부터 트리거 시점을 예측합니다",
|
||||
"feat_seasonal": "계절 조정",
|
||||
"feat_seasonal_desc": "계절 패턴에 따라 주기를 조정합니다",
|
||||
"feat_environmental": "환경 상관관계",
|
||||
"feat_environmental_desc": "온도/습도와 주기의 상관관계를 분석합니다",
|
||||
"feat_budget": "예산 추적",
|
||||
"feat_budget_desc": "월별·연별 유지보수 지출을 추적합니다",
|
||||
"feat_groups": "작업 그룹",
|
||||
"feat_groups_desc": "작업을 논리적 그룹으로 정리합니다",
|
||||
"feat_checklists": "체크리스트",
|
||||
"feat_checklists_desc": "작업 완료를 위한 다단계 절차",
|
||||
"settings_general": "일반",
|
||||
"settings_default_warning": "기본 경고 일수",
|
||||
"settings_panel_enabled": "사이드바 패널",
|
||||
"settings_panel_title": "사이드바 패널 제목",
|
||||
"settings_notifications": "알림",
|
||||
"settings_notify_service": "알림 서비스",
|
||||
"test_notification": "테스트 알림",
|
||||
"send_test": "테스트 보내기",
|
||||
"testing": "보내는 중…",
|
||||
"test_notification_success": "테스트 알림을 보냈습니다",
|
||||
"test_notification_failed": "테스트 알림 전송 실패",
|
||||
"settings_notify_due_soon": "기한 임박 시 알림",
|
||||
"settings_notify_overdue": "기한 초과 시 알림",
|
||||
"settings_notify_triggered": "트리거 시 알림",
|
||||
"settings_interval_hours": "반복 주기 (시간, 0 = 한 번만)",
|
||||
"settings_quiet_hours": "방해 금지 시간",
|
||||
"settings_quiet_start": "시작",
|
||||
"settings_quiet_end": "종료",
|
||||
"settings_max_per_day": "하루 최대 알림 수 (0 = 무제한)",
|
||||
"settings_bundling": "알림 묶기",
|
||||
"settings_bundle_threshold": "묶음 기준 개수",
|
||||
"settings_reminder_leads": "추가 알림 (기한 전 일수)",
|
||||
"settings_reminder_leads_hint": "쉼표로 구분한 사전 알림 시점입니다. 예: 14, 3, 0 — 해당하는 날마다 추가 알림이 한 번 발송됩니다. 비워두면 꺼짐.",
|
||||
"settings_actions": "모바일 동작 버튼",
|
||||
"settings_action_complete": "'완료' 버튼 표시",
|
||||
"settings_action_skip": "'건너뛰기' 버튼 표시",
|
||||
"settings_action_snooze": "'다시 알림' 버튼 표시",
|
||||
"settings_weekly_digest": "주간 요약",
|
||||
"settings_weekly_digest_hint": "예정된 작업이 있으면 월요일 아침에 요약 알림을 한 번 보냅니다.",
|
||||
"settings_warranty_reminder": "보증 만료 알림",
|
||||
"settings_warranty_reminder_days": "만료 전 일수",
|
||||
"settings_warranty_reminder_hint": "객체의 보증 만료가 설정한 일수만큼 남았을 때 한 번 알립니다.",
|
||||
"settings_snooze_hours": "다시 알림 대기 시간 (시간)",
|
||||
"settings_budget": "예산",
|
||||
"settings_currency": "통화",
|
||||
"settings_budget_monthly": "월 예산",
|
||||
"settings_budget_yearly": "연 예산",
|
||||
"settings_budget_alerts": "예산 경고",
|
||||
"settings_budget_threshold": "경고 기준 (%)",
|
||||
"settings_import_export": "가져오기 / 내보내기",
|
||||
"settings_export_json": "JSON 내보내기",
|
||||
"settings_export_yaml": "YAML 내보내기",
|
||||
"settings_export_csv": "CSV 내보내기",
|
||||
"settings_import_csv": "CSV 가져오기",
|
||||
"settings_import_placeholder": "JSON 또는 CSV 내용을 여기에 붙여넣으세요…",
|
||||
"settings_import_btn": "가져오기",
|
||||
"settings_import_success": "객체 {count}개를 성공적으로 가져왔습니다.",
|
||||
"settings_export_success": "내보내기 파일이 다운로드되었습니다.",
|
||||
"settings_saved": "설정이 저장되었습니다.",
|
||||
"settings_include_history": "기록 포함",
|
||||
"settings_export_selection": "선택한 객체로 제한 (선택)",
|
||||
"settings_docs_archive": "문서 아카이브 (파일 포함)",
|
||||
"settings_docs_archive_hint": "JSON/YAML/CSV 내보내기에는 설정만 포함됩니다. 이 ZIP에는 업로드한 파일 내용까지 포함되어 완전한 복원이 가능합니다.",
|
||||
"settings_docs_export_btn": "문서 ZIP 다운로드",
|
||||
"settings_docs_import_btn": "문서 ZIP 복원",
|
||||
"settings_docs_import_success": "복원됨: 파일 {blobs}개, 문서 {docs}개",
|
||||
"sort_alphabetical": "가나다순",
|
||||
"sort_due_soonest": "예정일 빠른 순",
|
||||
"sort_task_count": "작업 수",
|
||||
"sort_area": "구역",
|
||||
"sort_assigned_user": "담당자",
|
||||
"sort_group": "그룹",
|
||||
"groupby_none": "그룹화 없음",
|
||||
"groupby_area": "구역별",
|
||||
"groupby_group": "그룹별",
|
||||
"groupby_user": "사용자별",
|
||||
"filter_label": "필터",
|
||||
"user_label": "사용자",
|
||||
"sort_label": "정렬",
|
||||
"group_by_label": "그룹화",
|
||||
"state_value_help": "HA 상태 값을 사용하세요(보통 소문자, 예: \"on\"/\"off\"). 대소문자는 저장 시 정규화됩니다.",
|
||||
"target_changes_help": "트리거가 발동하기까지 필요한 일치 전환 횟수입니다 (기본값: 1).",
|
||||
"qr_print_title": "QR 코드 인쇄",
|
||||
"qr_print_desc": "잘라서 장비에 붙일 수 있는 QR 코드 인쇄 페이지를 생성합니다.",
|
||||
"qr_print_load": "객체 불러오기",
|
||||
"qr_print_filter": "필터",
|
||||
"qr_print_objects": "객체",
|
||||
"qr_print_actions": "동작",
|
||||
"qr_print_url_mode": "링크 유형",
|
||||
"qr_print_estimate": "예상 QR 코드 수",
|
||||
"qr_print_over_limit": "최대 200개입니다. 필터를 좁혀 주세요",
|
||||
"qr_print_generate": "QR 코드 생성",
|
||||
"qr_print_generating": "생성 중…",
|
||||
"qr_print_ready": "QR 코드 준비 완료",
|
||||
"qr_print_print_button": "인쇄",
|
||||
"qr_print_empty": "생성할 항목 없음",
|
||||
"qr_action_skip": "건너뛰기",
|
||||
"vacation_title": "휴가 모드",
|
||||
"vacation_active": "활성",
|
||||
"vacation_ended": "종료됨",
|
||||
"vacation_desc": "휴가를 계획하세요. 휴가 기간과 버퍼 일수 동안 알림이 일시 중지됩니다. 특정 작업은 예외로 되돌릴 수 있습니다.",
|
||||
"vacation_enable": "휴가 모드 활성화",
|
||||
"vacation_start": "시작",
|
||||
"vacation_end": "종료",
|
||||
"vacation_buffer": "버퍼 (일)",
|
||||
"vacation_exempt_title": "휴가 중에도 알림 받기",
|
||||
"vacation_exempt_desc": "휴가 중에도 알림을 받을 작업을 선택하세요 (예: 중요한 수영장 수질 관리).",
|
||||
"vacation_load_tasks": "작업 불러오기",
|
||||
"vacation_preview_btn": "미리보기 표시",
|
||||
"vacation_preview_affected": "개 작업 영향받음",
|
||||
"vacation_event_due_soon": "기한 임박 예정",
|
||||
"vacation_event_overdue": "기한 초과 예정",
|
||||
"vacation_event_triggered_est": "센서 트리거 가능",
|
||||
"vacation_sensor_based": "(센서 기반)",
|
||||
"vacation_action_notify": "그래도 알림",
|
||||
"vacation_action_unsilence": "다시 음소거",
|
||||
"vacation_marked_complete": "완료로 표시됨",
|
||||
"vacation_marked_skip": "건너뜀",
|
||||
"vacation_end_now": "지금 휴가 종료",
|
||||
"add": "추가",
|
||||
"show_stats": "통계 + 그래프 보기",
|
||||
"hide_stats": "통계 숨기기",
|
||||
"adaptive_no_data": "적응형 분석에 필요한 완료 기록이 아직 부족합니다. 이 작업을 몇 번 더 완료하면 주기 추천과 신뢰도 차트가 열립니다.",
|
||||
"suggestion_applied": "제안 주기가 적용되었습니다",
|
||||
"vacation_mode": "휴가 모드",
|
||||
"vacation_status_active": "현재 활성",
|
||||
"vacation_status_scheduled": "예약됨",
|
||||
"vacation_status_inactive": "비활성",
|
||||
"vacation_end_now_confirm": "휴가를 지금 바로 종료할까요?",
|
||||
"vacation_exempt_count": "예외",
|
||||
"vacation_advanced": "고급…",
|
||||
"vacation_open_panel": "패널에서 열기",
|
||||
"enable": "활성화",
|
||||
"saved": "저장됨",
|
||||
"budget_monthly_set": "월 예산 설정",
|
||||
"budget_yearly_set": "연 예산 설정",
|
||||
"budget_advanced": "통화, 경고…",
|
||||
"budget_open_panel": "패널에서 열기",
|
||||
"groups_empty": "아직 그룹이 없습니다.",
|
||||
"group_new_placeholder": "그룹 추가…",
|
||||
"group_delete_confirm": "\"{name}\" 그룹을 삭제할까요?",
|
||||
"groups_manage_tasks": "작업 배정 관리…",
|
||||
"groups_open_panel": "패널에서 열기",
|
||||
"unassigned": "미배정",
|
||||
"no_area": "구역 없음",
|
||||
"has_overdue": "기한 초과 작업 있음",
|
||||
"object": "객체",
|
||||
"settings_panel_access": "패널 접근 권한",
|
||||
"settings_panel_access_desc": "관리자는 항상 전체 권한을 가집니다. 특정 비관리자에게 생성·편집·삭제를 위임하려면 이 옵션을 켜고 아래에서 선택하세요. 나머지 사용자에게는 완료와 건너뛰기만 표시됩니다.",
|
||||
"settings_operator_write": "선택한 사용자에게 생성·편집·삭제 허용",
|
||||
"settings_operator_write_desc": "끔: 관리자만 내용을 변경할 수 있습니다. 켬: 아래에서 선택한 사용자도 전체 권한을 갖습니다.",
|
||||
"no_non_admin_users": "비관리자 사용자가 없습니다. 설정 → 사람에서 추가하세요.",
|
||||
"owner_label": "소유자",
|
||||
"feat_completion_actions": "완료 동작",
|
||||
"feat_completion_actions_desc": "완료 시 작업별 HA 동작 실행 + 사전 설정값이 있는 빠른 완료 QR.",
|
||||
"on_complete_action_title": "완료 시: HA 동작 실행 (선택)",
|
||||
"on_complete_action_desc": "작업이 완료되면 HA 서비스를 호출합니다 — 예: 기기의 카운터 초기화.",
|
||||
"on_complete_action_service": "서비스",
|
||||
"on_complete_action_target": "대상 엔티티",
|
||||
"on_complete_action_target_hint": "참고: 엔티티 도메인이 서비스와 일치해야 합니다 — 예: 'button.press'는 button.*에서만, 'counter.increment'는 counter.*에서만, 'input_button.press'는 input_button.*에서만 동작합니다. 불일치 시 동작이 조용히 실패합니다 (HA 로그에 'Referenced entities ... missing or not currently available' 기록).",
|
||||
"on_complete_action_data": "데이터 (JSON, 선택)",
|
||||
"on_complete_action_test": "설정 검증",
|
||||
"on_complete_action_test_success": "✓ 설정이 유효합니다 (동작은 작업 완료 시에만 실행됩니다)",
|
||||
"on_complete_action_test_failed": "실패",
|
||||
"quick_complete_defaults_title": "빠른 완료 기본값 (QR 스캔용, 선택)",
|
||||
"quick_complete_defaults_desc": "빠른 완료 QR 스캔에 쓰이는 사전 설정값입니다. 없으면 QR이 완료 대화상자를 엽니다.",
|
||||
"quick_complete_defaults_notes": "메모",
|
||||
"quick_complete_defaults_cost": "비용",
|
||||
"quick_complete_defaults_duration": "소요 시간 (분)",
|
||||
"quick_complete_defaults_feedback_none": "피드백 없음",
|
||||
"quick_complete_defaults_feedback_needed": "필요했음",
|
||||
"quick_complete_defaults_feedback_not_needed": "불필요했음",
|
||||
"quick_complete_success": "빠르게 완료로 표시됨",
|
||||
"show_all_objects": "모든 객체 보기",
|
||||
"show_all_tasks": "필터 해제 — 모든 작업 보기",
|
||||
"filter_to_overdue": "기한 초과 작업만 보기",
|
||||
"filter_to_due_soon": "기한 임박 작업만 보기",
|
||||
"filter_to_triggered": "트리거된 작업만 보기",
|
||||
"open_task": "작업 열기",
|
||||
"show_details": "기록 + 통계 보기",
|
||||
"hide_details": "상세 숨기기",
|
||||
"history_empty": "아직 기록이 없습니다.",
|
||||
"history_edit_button": "항목 편집",
|
||||
"total_cost": "총 비용",
|
||||
"times_performed": "수행 횟수",
|
||||
"older_entries": "이전 항목",
|
||||
"open_in_panel": "유지보수 패널에서 열기",
|
||||
"skip_reason": "건너뛰기 사유 (선택)",
|
||||
"reset_to_date": "마지막 수행일 재설정",
|
||||
"delete_task_confirm": "이 작업과 기록을 삭제할까요?",
|
||||
"delete_object_confirm": "이 객체와 모든 작업을 삭제할까요?",
|
||||
"loading": "불러오는 중…",
|
||||
"archive": "보관",
|
||||
"undo": "실행 취소",
|
||||
"task_archived": "작업이 보관되었습니다",
|
||||
"object_archived": "객체가 보관되었습니다",
|
||||
"unarchive": "보관 해제",
|
||||
"archived": "보관됨",
|
||||
"show_archived": "보관된 항목 보기",
|
||||
"hide_archived": "보관된 항목 숨기기",
|
||||
"confirm_archive_object": "이 객체와 작업을 보관할까요? 기록은 유지되며 나중에 보관 해제할 수 있습니다.",
|
||||
"settings_archive": "보관 및 보존",
|
||||
"settings_archive_desc": "완료된 일회성 작업을 삭제하지 않고 정리합니다. 보관된 항목은 숨겨지고 동작하지 않지만 기록과 비용은 유지됩니다.",
|
||||
"settings_archive_oneoff_days": "완료된 일회성 작업 자동 보관 (일, 0 = 끔)",
|
||||
"settings_delete_archived_oneoff_days": "보관된 일회성 작업 자동 삭제 (일, 0 = 안 함)",
|
||||
"archive_object": "객체 보관",
|
||||
"unarchive_object": "객체 보관 해제",
|
||||
"documents": "문서",
|
||||
"documents_empty": "아직 문서가 없습니다.",
|
||||
"doc_upload": "파일 업로드",
|
||||
"doc_uploading": "업로드 중…",
|
||||
"doc_add_link": "링크 추가",
|
||||
"doc_link_url": "링크 URL (https://…)",
|
||||
"doc_link_title": "제목 (선택)",
|
||||
"doc_open": "열기",
|
||||
"doc_delete_confirm": "\"{name}\"을(를) 삭제할까요?",
|
||||
"doc_too_large": "파일이 너무 큽니다 (최대 25 MB).",
|
||||
"doc_upload_failed": "업로드에 실패했습니다.",
|
||||
"completion_photo_optional": "완료 사진 (선택)",
|
||||
"add_photo": "사진 추가",
|
||||
"uploading": "업로드 중…",
|
||||
"remove": "제거",
|
||||
"doc_deduped": "이미 다른 곳에 저장됨 — 공유되어 추가 공간을 쓰지 않습니다.",
|
||||
"doc_dup_in_object": "이 파일은 이미 이 객체에 첨부되어 있습니다.",
|
||||
"doc_link_invalid": "http/https 링크만 허용됩니다.",
|
||||
"doc_cat_manual": "설명서",
|
||||
"doc_cat_warranty": "보증서",
|
||||
"doc_cat_invoice": "영수증",
|
||||
"doc_cat_spare_parts": "예비 부품",
|
||||
"doc_cat_photo": "사진",
|
||||
"doc_cat_other": "기타",
|
||||
"doc_link_badge": "링크",
|
||||
"doc_storage_title": "문서 저장소",
|
||||
"doc_storage_saved": "중복 제거로 절약됨",
|
||||
"doc_storage_refresh": "새로 고침",
|
||||
"doc_download": "다운로드",
|
||||
"doc_close": "닫기",
|
||||
"doc_camera": "사진 촬영",
|
||||
"doc_drop_hint": "파일을 여기에 놓으세요",
|
||||
"doc_task_none": "이 작업에 연결된 문서가 없습니다.",
|
||||
"doc_link_existing": "문서 연결…",
|
||||
"doc_attach": "연결",
|
||||
"doc_unlink": "연결 해제",
|
||||
"doc_page": "페이지",
|
||||
"chart_range_7d": "7일",
|
||||
"chart_range_30d": "30일",
|
||||
"chart_range_90d": "90일",
|
||||
"chart_range_1y": "1년",
|
||||
"chart_since_service": "마지막 정비 이후",
|
||||
"chart_no_stats": "이 엔티티의 장기 통계가 없습니다 — 유지보수 이벤트 값만 표시합니다",
|
||||
"auto_complete_on_recovery": "센서가 정상으로 돌아오면 자동 완료",
|
||||
"auto_complete_on_recovery_help": "트리거가 스스로 해제되면 완료를 기록합니다 (마지막 수행일 갱신) — 예: 소금 보충, 필터 교체.",
|
||||
"doc_search": "문서 검색…",
|
||||
"doc_search_none": "일치하는 문서 없음",
|
||||
"link_device_optional": "기존 기기와 연결 (선택)",
|
||||
"parent_object_optional": "상위 객체 (선택)",
|
||||
"parent_none": "(상위 없음)",
|
||||
"paused": "일시 중지됨",
|
||||
"pause_object": "일시 중지",
|
||||
"resume_object": "재개",
|
||||
"pause_until_prompt": "이 객체의 일정을 동결합니다 — 재개할 때까지 어떤 작업도 기한이 되지 않고 알림도 오지 않습니다. 자동 재개 날짜를 선택적으로 설정할 수 있습니다.",
|
||||
"pause_until_label": "재개일 (선택)",
|
||||
"object_paused": "객체가 일시 중지되었습니다",
|
||||
"object_resumed": "객체가 재개되었습니다 — 일정이 다시 시작됩니다",
|
||||
"object_paused_badge": "일시 중지됨",
|
||||
"paused_until_label": "재개일",
|
||||
"replace_object": "교체…",
|
||||
"replace_object_prompt": "이 객체를 퇴역시키고 후속 객체를 만듭니다. 기록과 비용은 기존 객체에 보관된 채 남고, 작업과 문서는 새 객체로 이어지며 카운터는 새로 시작됩니다.",
|
||||
"replace_name_label": "후속 객체 이름",
|
||||
"object_replaced": "객체가 교체되었습니다 — 후속 객체 생성됨",
|
||||
"reading_unit_label": "검침 단위 (예: kWh, m³)",
|
||||
"reading_unit_help": "이 작업을 완료할 때 기록 값 옆에 표시됩니다.",
|
||||
"reading_value_label": "검침 값",
|
||||
"reading_label": "검침",
|
||||
"settings_templates_label": "템플릿 갤러리",
|
||||
"settings_templates_hint": "필요 없는 템플릿의 체크를 해제하세요 — \"템플릿에서\" 선택 목록(패널 및 설정 흐름)에서 사라집니다. 다른 변화는 없으며 언제든 다시 활성화할 수 있습니다.",
|
||||
"worksheet": "작업 시트",
|
||||
"worksheet_scan_view": "스캔하여 작업 열기",
|
||||
"worksheet_scan_complete": "스캔하여 완료",
|
||||
"worksheet_manual_excerpt": "설명서 발췌",
|
||||
"worksheet_pages": "페이지",
|
||||
"worksheet_printed": "인쇄됨",
|
||||
"worksheet_never": "없음",
|
||||
"card_all_caught_up": "모두 처리했습니다 — 주의가 필요한 항목이 없습니다",
|
||||
"postpone": "연기",
|
||||
"postpone_date_prompt": "이번 회차를 언제로 연기할까요?",
|
||||
"postpone_date_label": "새 예정일",
|
||||
"postponed": "연기됨",
|
||||
"postponed_to": "연기됨:",
|
||||
"season_window_label": "계절 기간 (월)",
|
||||
"season_window_hint": "선택한 달에만 기한이 됩니다. 비수기 날짜는 다음 활성 달로 넘어갑니다. 선택 없음 = 연중.",
|
||||
"series_end_label": "종료",
|
||||
"series_end_never": "없음 (무기한 반복)",
|
||||
"series_end_after_count": "지정 횟수 후",
|
||||
"series_end_until": "특정 날짜에",
|
||||
"series_end_count_label": "횟수",
|
||||
"series_end_until_label": "종료일",
|
||||
"parts_section": "부품 및 소모품",
|
||||
"part_add": "부품 추가",
|
||||
"part_name": "이름",
|
||||
"part_vendor": "제조사",
|
||||
"part_storage_location": "보관 위치",
|
||||
"part_product_url": "제품 URL",
|
||||
"part_unit": "단위",
|
||||
"part_cost": "단가",
|
||||
"part_stock": "재고",
|
||||
"part_reorder_threshold": "재주문 기준",
|
||||
"part_restock_quantity": "보충 수량",
|
||||
"part_auto_buy": "재고 부족 시 구매 작업 자동 생성",
|
||||
"part_restock": "재고 조정",
|
||||
"restock_quantity_label": "구매 수량",
|
||||
"consumes_parts_label": "사용하는 부품",
|
||||
"parts_load_failed": "이 객체의 부품을 불러올 수 없습니다 — 부품 사용 옵션을 지금은 쓸 수 없습니다.",
|
||||
"adopt_problem_button": "문제 센서 가져오기",
|
||||
"adopt_problem_title": "문제 센서 가져오기",
|
||||
"adopt_problem_hint": "HA 문제 센서(프린터 오류, 필터 경고, 배터리 부족)를 유지보수 작업으로 전환합니다. 문제가 활성인 동안 트리거되고 해결되면 자동으로 해제됩니다.",
|
||||
"adopt_problem_none": "아직 추적되지 않은 문제 센서를 찾지 못했습니다.",
|
||||
"adopt_problem_active": "활성",
|
||||
"adopt_problem_ok": "정상",
|
||||
"adopt_problem_new_object": "(신규)",
|
||||
"adopt_problem_adopt": "선택 항목 가져오기",
|
||||
"adopt_problem_done": "문제 센서 {tasks}개를 가져왔습니다",
|
||||
"views_label": "보기",
|
||||
"views_none": "— 보기 없음 —",
|
||||
"views_manage": "보기 저장 / 관리",
|
||||
"views_dialog_title": "저장된 보기",
|
||||
"views_dialog_hint": "현재 필터를 이름 있는 보기로 저장하면 모두가 다시 사용할 수 있습니다.",
|
||||
"views_name_placeholder": "보기 이름",
|
||||
"views_save_current": "현재 필터 저장",
|
||||
"views_none_yet": "저장된 보기가 아직 없습니다.",
|
||||
"close": "닫기",
|
||||
"trigger_hint_now": "센서의 현재 값은 {value}입니다.",
|
||||
"trigger_hint_above": "{target}을(를) 초과하면 작업이 트리거됩니다.",
|
||||
"trigger_hint_below": "{target} 미만으로 떨어지면 트리거됩니다.",
|
||||
"trigger_hint_counter_delta": "현재 값({value})부터 계수합니다: {due} 도달 시 기한 (+{target}), 완료할 때마다 계수가 다시 시작됩니다.",
|
||||
"trigger_hint_counter_delta_edit": "마지막 완료 이후 사용량을 계수합니다: +{target} 후 기한이 되며, 완료할 때마다 계수가 다시 시작됩니다.",
|
||||
"trigger_hint_counter_abs": "센서가 {target}에 도달하면 작업 기한이 됩니다.",
|
||||
"trigger_hint_runtime": "누적 가동 {hours}시간 후 작업 기한이 됩니다. 카운터는 완료할 때마다 다시 시작됩니다.",
|
||||
"trigger_hint_state_change": "상태가 {count}회 변경되면 작업 기한이 됩니다.",
|
||||
"trigger_hint_state_change_to": "“{state}”(으)로 {count}회 변경되면 작업 기한이 됩니다.",
|
||||
"trigger_hint_state_now": "현재 상태: {value}.",
|
||||
"adopt_problem_part": "사용 부품: {name}",
|
||||
"label_filter": "라벨",
|
||||
"all_labels": "모든 라벨",
|
||||
"settings_notify_scope": "특정 보기만 알림",
|
||||
"settings_notify_scope_all": "모든 작업",
|
||||
"settings_notify_scope_hint": "선택한 저장된 보기의 라벨/사용자 필터와 일치하는 작업만 알림을 보냅니다. 보기의 상태·정렬·그룹화는 여기서 무시됩니다.",
|
||||
"card_saved_view": "저장된 보기",
|
||||
"card_saved_view_none": "없음",
|
||||
"card_saved_view_help": "위 필터에 더해 보기의 상태·사용자·라벨 필터를 적용합니다. 보기의 정렬과 그룹화는 패널 표시 설정이며 카드에는 적용되지 않습니다.",
|
||||
"doc_part_none": "이 부품에 연결된 문서가 없습니다.",
|
||||
"settings_templates_toggle_group": "이 그룹의 모든 템플릿을 켜거나 끄기",
|
||||
"setups_button": "추천 설정",
|
||||
"setups_title": "추천 설정 (베타)",
|
||||
"setups_hint": "소모품 센서로 유지보수 작업을 구동할 수 있는 지원 통합구성요소의 기기입니다. 가져오면 객체가 생성되고 각 작업이 센서에 연결됩니다 — 소모품이 부족해지면 트리거되고 교체 후 자동으로 해제됩니다.",
|
||||
"setups_none": "연결되지 않은 소모품 센서를 가진 지원 기기를 찾지 못했습니다.",
|
||||
"setups_adopt": "선택 항목 설정",
|
||||
"setups_done": "센서 연결 작업 {tasks}개가 생성되었습니다.",
|
||||
"complete_parts_used": "이번에 사용한 부품",
|
||||
"part_delete_confirm": "'{name}' 부품을 삭제할까요? 재고 추적, 작업 연결, 진행 중인 구매 알림이 모두 제거됩니다.",
|
||||
"baseline_start_value": "시작 값 (선택)",
|
||||
"baseline_start_help": "이 값부터 계수를 시작합니다. 비워두면 현재 값부터 계수합니다. 마지막 정비 시점의 값을 입력하면 그 이후의 사용량이 바로 반영됩니다.",
|
||||
"setups_baseline_hint": "마지막 정비 시점의 값 (선택)",
|
||||
"baseline_start_help_edit": "비워두면 기존 계수를 유지합니다. 값을 입력하면 계수 기준이 다시 설정됩니다 (예: 마지막 정비 시점의 값).",
|
||||
"baseline_current_effective": "현재 적용 중인 시작 값: {value}",
|
||||
"runtime_on_states": "활성 상태 (쉼표로 구분)",
|
||||
"runtime_on_states_help": "가동 중으로 계산할 상태입니다 — 기본값: on. 예: mowing, cleaning, printing. 속성을 선택한 경우 해당 속성 값과 비교합니다.",
|
||||
"setups_target_new": "새로 만들기: {name}",
|
||||
"schedule_preview_title": "다음 예정일",
|
||||
"schedule_preview_ontime": "제때 완료한다고 가정한 일정입니다.",
|
||||
"schedule_preview_ends": "(시리즈 종료)",
|
||||
"adopt_problem_responsible": "가져온 모든 작업의 담당자 (선택)",
|
||||
"adopt_problem_configure": "구성",
|
||||
"history_auto": "자동",
|
||||
"battery_fleet_title": "배터리 플릿",
|
||||
"battery_fleet_none_low": "모든 배터리 정상 — 교체할 것이 없습니다.",
|
||||
"battery_fleet_buy_now": "지금 구매",
|
||||
"battery_fleet_soon": "곧 필요",
|
||||
"battery_fleet_soon_hint": "마지막 교체일로부터 예측한 값입니다 — 미리 주문해 두세요.",
|
||||
"battery_fleet_mark_all": "모두 교체됨으로 표시",
|
||||
"battery_fleet_mark_one": "이 배터리를 교체됨으로 표시",
|
||||
"battery_fleet_offline": "오프라인",
|
||||
"battery_fleet_trigger_lost": "이 작업의 센서 트리거가 사라졌습니다 — 트리거도 자동 완료도 되지 않습니다.",
|
||||
"battery_fleet_repair": "복구",
|
||||
"battery_fleet_exclude": "플릿에서 제외",
|
||||
"battery_fleet_excluded": "제외됨",
|
||||
"battery_fleet_include": "다시 추적",
|
||||
"battery_fleet_total": "배터리 {n}개 추적 중",
|
||||
"battery_fleet_setup_button": "배터리 플릿",
|
||||
"battery_fleet_setup_done": "배터리 플릿이 설정되었습니다 — 하나의 작업이 모든 배터리를 추적합니다.",
|
||||
"update_banner": "서버에 Maintenance Supporter의 새 버전이 있습니다 — 패널을 업데이트하려면 새로 고침하세요.",
|
||||
"update_reload": "새로 고침"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Manutenção",
|
||||
"objects": "Objetos",
|
||||
"tasks": "Tarefas",
|
||||
"overdue": "Atrasada",
|
||||
"due_soon": "Vence em breve",
|
||||
"triggered": "Acionada",
|
||||
"trigger_replaced": "Gatilho substituído",
|
||||
"ok": "OK",
|
||||
"all": "Todas",
|
||||
"new_object": "+ Novo objeto",
|
||||
"templates_from": "A partir de modelo",
|
||||
"templates_title": "Comece com um modelo",
|
||||
"templates_task_count": "{n} tarefas",
|
||||
"template_created": "Criado a partir do modelo",
|
||||
"onboard_hint": "Adicione seu primeiro objeto para começar a acompanhar a manutenção.",
|
||||
"edit": "Editar",
|
||||
"duplicate": "Duplicar",
|
||||
"task_duplicated": "Tarefa duplicada",
|
||||
"object_duplicated": "Objeto duplicado",
|
||||
"delete": "Excluir",
|
||||
"add_task": "+ Adicionar tarefa",
|
||||
"complete": "Concluir",
|
||||
"completed": "Concluída",
|
||||
"skip": "Pular",
|
||||
"skipped": "Pulada",
|
||||
"missed": "Perdida",
|
||||
"reset": "Redefinir",
|
||||
"snooze": "Soneca",
|
||||
"snoozed": "Em soneca",
|
||||
"cancel": "Cancelar",
|
||||
"bulk_select": "Selecionar",
|
||||
"bulk_select_all": "Selecionar tudo",
|
||||
"bulk_n_selected": "{n} selecionadas",
|
||||
"bulk_completed": "{n} tarefas concluídas",
|
||||
"bulk_archived": "{n} tarefas arquivadas",
|
||||
"completing": "Concluindo…",
|
||||
"interval": "Intervalo",
|
||||
"warning": "Aviso",
|
||||
"last_performed": "Última execução",
|
||||
"next_due": "Próximo vencimento",
|
||||
"days_until_due": "Dias até o vencimento",
|
||||
"avg_duration": "Duração média",
|
||||
"trigger": "Gatilho",
|
||||
"trigger_type": "Tipo de gatilho",
|
||||
"threshold_above": "Limite superior",
|
||||
"threshold_below": "Limite inferior",
|
||||
"threshold": "Limite",
|
||||
"counter": "Contador",
|
||||
"state_change": "Mudança de estado",
|
||||
"runtime": "Tempo de operação",
|
||||
"runtime_hours": "Tempo de operação alvo (horas)",
|
||||
"target_value": "Valor alvo",
|
||||
"baseline": "Linha de base",
|
||||
"target_changes": "Mudanças alvo",
|
||||
"for_minutes": "Durante (minutos)",
|
||||
"time_based": "Baseado em tempo",
|
||||
"sensor_based": "Baseado em sensor",
|
||||
"manual": "Manual",
|
||||
"one_time": "Única vez",
|
||||
"weekdays": "Dias da semana",
|
||||
"nth_weekday": "Enésimo dia da semana do mês",
|
||||
"day_of_month": "Dia do mês",
|
||||
"recurrence_on_days": "Repetir em",
|
||||
"recurrence_occurrence": "Ocorrência",
|
||||
"recurrence_weekday": "Dia da semana",
|
||||
"recurrence_day": "Dia do mês (1–31)",
|
||||
"recurrence_last_day": "Último dia do mês",
|
||||
"recurrence_business_day": "Somente dias úteis (antecipar do fim de semana)",
|
||||
"recurrence_offset": "Deslocamento (dias, ±)",
|
||||
"recurrence_offset_help": "Desloque a data em ±N dias, ex.: -2 = dois dias antes.",
|
||||
"last_day_month": "Último dia do mês",
|
||||
"last_business_day_month": "Último dia útil",
|
||||
"ord_1": "1º",
|
||||
"ord_2": "2º",
|
||||
"ord_3": "3º",
|
||||
"ord_4": "4º",
|
||||
"ord_5": "5º",
|
||||
"ord_last": "Último",
|
||||
"day_word": "Dia",
|
||||
"interval_value": "Intervalo",
|
||||
"interval_unit": "Unidade",
|
||||
"unit_days": "Dias",
|
||||
"unit_weeks": "Semanas",
|
||||
"unit_months": "Meses",
|
||||
"unit_years": "Anos",
|
||||
"due_date": "Data de vencimento",
|
||||
"cleaning": "Limpeza",
|
||||
"inspection": "Inspeção",
|
||||
"replacement": "Substituição",
|
||||
"calibration": "Calibração",
|
||||
"service": "Revisão",
|
||||
"reading": "Leitura",
|
||||
"custom": "Personalizado",
|
||||
"history": "Histórico",
|
||||
"cost": "Custo",
|
||||
"report_button": "Relatório",
|
||||
"report_title": "Relatório de manutenção",
|
||||
"report_generated": "Gerado em",
|
||||
"report_times_done": "Concluídas",
|
||||
"report_total_cost": "Custo total",
|
||||
"report_every": "a cada {n} {unit}",
|
||||
"report_notes": "Observações",
|
||||
"report_col_type": "Tipo",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Agendamento",
|
||||
"duration": "Duração",
|
||||
"both": "Ambos",
|
||||
"trigger_val": "Valor do gatilho",
|
||||
"complete_title": "Concluir: ",
|
||||
"checklist": "Checklist",
|
||||
"checklist_steps_optional": "Etapas do checklist (opcional)",
|
||||
"checklist_placeholder": "Limpar o filtro\nTrocar a vedação\nTestar a pressão",
|
||||
"checklist_help": "Uma etapa por linha. Máx. 100 itens.",
|
||||
"err_too_long": "{field}: muito longo (máx. {n} caracteres)",
|
||||
"err_too_short": "{field}: muito curto (mín. {n} caracteres)",
|
||||
"err_value_too_high": "{field}: muito grande (máx. {n})",
|
||||
"err_value_too_low": "{field}: muito pequeno (mín. {n})",
|
||||
"err_required": "{field}: obrigatório",
|
||||
"err_wrong_type": "{field}: tipo incorreto (esperado: {type})",
|
||||
"err_invalid_choice": "{field}: valor não permitido",
|
||||
"err_invalid_value": "{field}: valor inválido",
|
||||
"feat_schedule_time": "Agendamento por horário",
|
||||
"feat_schedule_time_desc": "As tarefas ficam atrasadas em um horário específico do dia, em vez de à meia-noite.",
|
||||
"schedule_time_optional": "Vence às (opcional, HH:MM)",
|
||||
"schedule_time_help": "Vazio = meia-noite (padrão). Fuso horário do HA.",
|
||||
"at_time": "às",
|
||||
"notes_optional": "Observações (opcional)",
|
||||
"cost_optional": "Custo (opcional)",
|
||||
"duration_minutes": "Duração em minutos (opcional)",
|
||||
"days": "dias",
|
||||
"day": "dia",
|
||||
"today": "Hoje",
|
||||
"d_overdue": "d de atraso",
|
||||
"no_tasks": "Ainda não há tarefas de manutenção. Crie um objeto para começar.",
|
||||
"no_tasks_short": "Sem tarefas",
|
||||
"no_history": "Ainda não há entradas no histórico.",
|
||||
"show_all": "Mostrar tudo",
|
||||
"cost_duration_chart": "Custo e duração",
|
||||
"installed": "Instalado",
|
||||
"confirm_delete_object": "Excluir este objeto e todas as suas tarefas?",
|
||||
"confirm_delete_task": "Excluir esta tarefa?",
|
||||
"min": "Mín",
|
||||
"max": "Máx",
|
||||
"save": "Salvar",
|
||||
"saving": "Salvando…",
|
||||
"edit_task": "Editar tarefa",
|
||||
"new_task": "Nova tarefa de manutenção",
|
||||
"task_name": "Nome da tarefa",
|
||||
"maintenance_type": "Tipo de manutenção",
|
||||
"priority": "Prioridade",
|
||||
"labels": "Etiquetas",
|
||||
"labels_placeholder": "ex.: segurança, sazonal, visível ao inquilino",
|
||||
"labels_help": "Tags separadas por vírgula para filtragem e relatórios.",
|
||||
"priority_low": "Baixa",
|
||||
"priority_normal": "Normal",
|
||||
"priority_high": "Alta",
|
||||
"schedule_type": "Tipo de agendamento",
|
||||
"interval_days": "Intervalo (dias)",
|
||||
"warning_days": "Dias de aviso",
|
||||
"earliest_completion_days": "Conclusão antecipada (dias antes do vencimento)",
|
||||
"earliest_completion_days_help": "Deixe vazio para permitir concluir a qualquer momento. 0 = somente no dia do vencimento ou depois.",
|
||||
"last_performed_optional": "Última execução (opcional)",
|
||||
"interval_anchor": "Âncora do intervalo",
|
||||
"anchor_completion": "A partir da data de conclusão",
|
||||
"anchor_planned": "A partir da data planejada (sem deriva)",
|
||||
"edit_object": "Editar objeto",
|
||||
"name": "Nome",
|
||||
"manufacturer_optional": "Fabricante (opcional)",
|
||||
"model_optional": "Modelo (opcional)",
|
||||
"serial_number_optional": "Número de série (opcional)",
|
||||
"serial_number_label": "N/S",
|
||||
"documentation_url_label": "Manual",
|
||||
"object_notes_label": "Observações",
|
||||
"sort_due_date": "Data de vencimento",
|
||||
"sort_object": "Nome do objeto",
|
||||
"sort_type": "Tipo",
|
||||
"sort_task_name": "Nome da tarefa",
|
||||
"all_objects": "Todos os objetos",
|
||||
"tasks_lower": "tarefas",
|
||||
"no_tasks_yet": "Ainda sem tarefas",
|
||||
"add_first_task": "Adicionar a primeira tarefa",
|
||||
"trigger_configuration": "Configuração do gatilho",
|
||||
"entity_id": "ID da entidade",
|
||||
"comma_separated": "separado por vírgulas",
|
||||
"entity_logic": "Lógica das entidades",
|
||||
"entity_logic_any": "Qualquer entidade aciona",
|
||||
"entity_logic_all": "Todas as entidades devem acionar",
|
||||
"entities": "entidades",
|
||||
"attribute_optional": "Atributo (opcional, vazio = estado)",
|
||||
"use_entity_state": "Usar o estado da entidade (sem atributo)",
|
||||
"trigger_above": "Acionar acima de",
|
||||
"trigger_below": "Acionar abaixo de",
|
||||
"for_at_least_minutes": "Por pelo menos (minutos)",
|
||||
"safety_interval_days": "Intervalo de segurança (dias, opcional)",
|
||||
"safety_interval": "Intervalo de segurança (opcional)",
|
||||
"delta_mode": "Modo delta",
|
||||
"from_state_optional": "Do estado (opcional)",
|
||||
"to_state_optional": "Para o estado (opcional)",
|
||||
"documentation_url_optional": "URL da documentação (opcional)",
|
||||
"object_notes_optional": "Observações (opcional)",
|
||||
"nfc_tag_id_optional": "ID da tag NFC (opcional)",
|
||||
"nfc_tags_empty_help": "Ainda não há tags NFC registradas no Home Assistant.",
|
||||
"nfc_tags_open_settings": "Abrir configurações de tags",
|
||||
"nfc_tags_refresh": "Atualizar",
|
||||
"environmental_entity_optional": "Sensor ambiental (opcional)",
|
||||
"environmental_entity_helper": "ex.: sensor.outdoor_temperature — ajusta o intervalo com base nas condições ambientais",
|
||||
"environmental_attribute_optional": "Atributo ambiental (opcional)",
|
||||
"nfc_tag_id": "ID da tag NFC",
|
||||
"nfc_linked": "Tag NFC vinculada",
|
||||
"nfc_link_hint": "Clique para vincular uma tag NFC",
|
||||
"responsible_user": "Usuário responsável",
|
||||
"shared_with": "Compartilhada com (rodízio)",
|
||||
"shared_with_help": "Escolha várias pessoas para compartilhar esta tarefa; o responsável muda em rodízio a cada conclusão.",
|
||||
"rotation_strategy": "Rodízio",
|
||||
"rotation_none": "Sem rodízio",
|
||||
"rotation_round_robin": "Revezamento",
|
||||
"rotation_least_completed": "Quem concluiu menos",
|
||||
"rotation_random": "Aleatório",
|
||||
"no_user_assigned": "(Nenhum usuário atribuído)",
|
||||
"all_users": "Todos os usuários",
|
||||
"my_tasks": "Minhas tarefas",
|
||||
"tab_calendar": "Calendário",
|
||||
"cal_no_events": "Sem manutenção",
|
||||
"cal_window_7": "7 dias",
|
||||
"cal_window_14": "14 dias",
|
||||
"cal_window_30": "30 dias",
|
||||
"cal_window_365": "1 ano",
|
||||
"cal_every_n_days": "a cada {n} dias",
|
||||
"cal_source_time": "Baseado em tempo",
|
||||
"cal_source_time_adaptive": "Baseado em tempo (adaptativo)",
|
||||
"cal_source_sensor": "Baseado em sensor",
|
||||
"cal_predicted": "previsto",
|
||||
"cal_confidence_high": "confiança alta",
|
||||
"cal_confidence_medium": "confiança média",
|
||||
"cal_confidence_low": "confiança baixa",
|
||||
"budget_monthly": "Orçamento mensal",
|
||||
"budget_yearly": "Orçamento anual",
|
||||
"groups": "Grupos",
|
||||
"new_group": "Novo grupo",
|
||||
"edit_group": "Editar grupo",
|
||||
"no_groups": "Ainda sem grupos",
|
||||
"delete_group": "Excluir grupo",
|
||||
"delete_group_confirm": "Excluir o grupo '{name}'?",
|
||||
"group_select_tasks": "Selecionar tarefas",
|
||||
"group_name_required": "O nome é obrigatório",
|
||||
"description_optional": "Descrição (opcional)",
|
||||
"selected": "Selecionadas",
|
||||
"loading_chart": "Carregando dados do gráfico...",
|
||||
"hide_outliers": "Ocultar valores atípicos (falhas do sensor)",
|
||||
"was_maintenance_needed": "Esta manutenção era necessária?",
|
||||
"feedback_needed": "Necessária",
|
||||
"feedback_not_needed": "Desnecessária",
|
||||
"feedback_not_sure": "Não sei",
|
||||
"suggested_interval": "Intervalo sugerido",
|
||||
"apply_suggestion": "Aplicar",
|
||||
"reanalyze": "Reanalisar",
|
||||
"reanalyze_result": "Nova análise",
|
||||
"reanalyze_insufficient_data": "Dados insuficientes para gerar uma recomendação",
|
||||
"data_points": "pontos de dados",
|
||||
"dismiss_suggestion": "Dispensar",
|
||||
"confidence_low": "Baixa",
|
||||
"confidence_medium": "Média",
|
||||
"confidence_high": "Alta",
|
||||
"recommended": "recomendado",
|
||||
"seasonal_awareness": "Sazonalidade",
|
||||
"edit_seasonal_overrides": "Editar fatores sazonais",
|
||||
"seasonal_overrides_title": "Fatores sazonais (manual)",
|
||||
"seasonal_overrides_hint": "Fator por mês (0,1–5,0). Vazio = aprendido automaticamente.",
|
||||
"seasonal_override_invalid": "Valor inválido",
|
||||
"seasonal_override_range": "O fator deve estar entre 0,1 e 5,0",
|
||||
"clear_all": "Limpar tudo",
|
||||
"seasonal_chart_title": "Fatores sazonais",
|
||||
"seasonal_learned": "Aprendido",
|
||||
"seasonal_manual": "Manual",
|
||||
"month_jan": "Jan",
|
||||
"month_feb": "Fev",
|
||||
"month_mar": "Mar",
|
||||
"month_apr": "Abr",
|
||||
"month_may": "Mai",
|
||||
"month_jun": "Jun",
|
||||
"month_jul": "Jul",
|
||||
"month_aug": "Ago",
|
||||
"month_sep": "Set",
|
||||
"month_oct": "Out",
|
||||
"month_nov": "Nov",
|
||||
"month_dec": "Dez",
|
||||
"sensor_prediction": "Previsão do sensor",
|
||||
"degradation_trend": "Tendência",
|
||||
"trend_rising": "Subindo",
|
||||
"trend_falling": "Caindo",
|
||||
"trend_stable": "Estável",
|
||||
"trend_insufficient_data": "Dados insuficientes",
|
||||
"days_until_threshold": "Dias até o limite",
|
||||
"threshold_exceeded": "Limite excedido",
|
||||
"environmental_adjustment": "Fator ambiental",
|
||||
"sensor_prediction_urgency": "O sensor prevê atingir o limite em ~{days} dias",
|
||||
"day_short": "dia",
|
||||
"weibull_reliability_curve": "Curva de confiabilidade",
|
||||
"weibull_failure_probability": "Probabilidade de falha",
|
||||
"weibull_r_squared": "R² do ajuste",
|
||||
"beta_early_failures": "Falhas precoces",
|
||||
"beta_random_failures": "Falhas aleatórias",
|
||||
"beta_wear_out": "Desgaste",
|
||||
"beta_highly_predictable": "Altamente previsível",
|
||||
"confidence_interval": "Intervalo de confiança",
|
||||
"confidence_conservative": "Conservador",
|
||||
"confidence_aggressive": "Otimista",
|
||||
"current_interval_marker": "Intervalo atual",
|
||||
"recommended_marker": "Recomendado",
|
||||
"characteristic_life": "Vida característica",
|
||||
"chart_mini_sparkline": "Minigráfico de tendência",
|
||||
"chart_history": "Histórico de custo e duração",
|
||||
"chart_seasonal": "Fatores sazonais, 12 meses",
|
||||
"chart_weibull": "Curva de confiabilidade Weibull",
|
||||
"chart_sparkline": "Gráfico do valor do gatilho do sensor",
|
||||
"days_progress": "Progresso em dias",
|
||||
"qr_code": "Código QR",
|
||||
"qr_generating": "Gerando código QR…",
|
||||
"qr_error": "Falha ao gerar o código QR.",
|
||||
"qr_error_no_url": "Nenhuma URL do HA configurada. Defina uma URL externa ou interna em Configurações → Sistema → Rede.",
|
||||
"save_error": "Falha ao salvar. Tente novamente.",
|
||||
"qr_print": "Imprimir",
|
||||
"qr_download": "Baixar SVG",
|
||||
"qr_action": "Ação ao escanear",
|
||||
"qr_action_view": "Ver informações de manutenção",
|
||||
"qr_action_complete": "Marcar a manutenção como concluída",
|
||||
"qr_url_mode": "Tipo de link",
|
||||
"qr_mode_companion": "Companion App",
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "URL do servidor",
|
||||
"overview": "Visão geral",
|
||||
"analysis": "Análise",
|
||||
"recent_activities": "Atividades recentes",
|
||||
"search_notes": "Pesquisar observações",
|
||||
"avg_cost": "Custo médio",
|
||||
"no_advanced_features": "Nenhum recurso avançado ativado",
|
||||
"no_advanced_features_hint": "Ative “Intervalos adaptativos” ou “Padrões sazonais” nas configurações da integração para ver dados de análise aqui.",
|
||||
"analysis_not_enough_data": "Ainda não há dados suficientes para análise.",
|
||||
"analysis_not_enough_data_hint": "A análise de Weibull exige pelo menos 5 manutenções concluídas; padrões sazonais aparecem após 6+ pontos de dados por mês.",
|
||||
"analysis_manual_task_hint": "Tarefas manuais sem intervalo não geram dados de análise.",
|
||||
"completions": "conclusões",
|
||||
"current": "Atual",
|
||||
"shorter": "Mais curto",
|
||||
"longer": "Mais longo",
|
||||
"normal": "Normal",
|
||||
"disabled": "Desativado",
|
||||
"compound_logic": "Lógica composta",
|
||||
"compound": "Composto (várias condições)",
|
||||
"compound_logic_and": "E — todas as condições devem acionar",
|
||||
"compound_logic_or": "OU — qualquer condição aciona",
|
||||
"compound_help": "Combine várias condições de sensor em um único gatilho.",
|
||||
"compound_no_conditions": "Ainda sem condições — adicione pelo menos uma.",
|
||||
"compound_add_condition": "Adicionar condição",
|
||||
"compound_condition": "Condição",
|
||||
"compound_remove_condition": "Remover condição",
|
||||
"card_title": "Título",
|
||||
"card_show_header": "Mostrar cabeçalho com estatísticas",
|
||||
"card_show_actions": "Mostrar botões de ação",
|
||||
"card_compact": "Modo compacto",
|
||||
"card_max_items": "Máx. de itens (0 = todos)",
|
||||
"card_filter_status": "Filtrar por status",
|
||||
"card_filter_status_help": "Vazio = mostrar todos os status.",
|
||||
"card_filter_objects": "Filtrar por objetos",
|
||||
"card_filter_objects_help": "Vazio = mostrar todos os objetos.",
|
||||
"card_filter_entities": "Filtrar por entidades (entity_ids)",
|
||||
"card_filter_entities_help": "Escolha entidades sensor / binary_sensor desta integração. Vazio = todas.",
|
||||
"card_loading_objects": "Carregando objetos…",
|
||||
"card_load_error": "Não foi possível carregar os objetos — verifique a conexão WebSocket.",
|
||||
"card_no_tasks_title": "Ainda não há tarefas de manutenção",
|
||||
"card_no_tasks_cta": "→ Crie uma no painel de Manutenção",
|
||||
"no_objects": "Ainda não há objetos.",
|
||||
"action_error": "A ação falhou. Tente novamente.",
|
||||
"area_id_optional": "Área (opcional)",
|
||||
"installation_date_optional": "Data de instalação (opcional)",
|
||||
"warranty_expiry_optional": "Fim da garantia (opcional)",
|
||||
"warranty": "Garantia",
|
||||
"warranty_valid_until": "válida até {date}",
|
||||
"warranty_expires_in": "expira em {days} dias",
|
||||
"warranty_expired": "expirada",
|
||||
"cal_past_windows": "Janelas passadas",
|
||||
"cal_forward_windows": "Janelas futuras",
|
||||
"history_edit_title": "Editar entrada do histórico",
|
||||
"history_edit_timestamp": "Data e hora",
|
||||
"manufacturer": "Fabricante",
|
||||
"model": "Modelo",
|
||||
"area": "Área",
|
||||
"actions": "Ações",
|
||||
"view_mode_label": "Visualização",
|
||||
"view_cards": "Cartões",
|
||||
"view_table": "Tabela",
|
||||
"objects_table_columns_label": "Colunas da tabela de objetos",
|
||||
"objects_table_columns_hint": "Escolha quais colunas aparecem na visualização em tabela dos objetos.",
|
||||
"custom_icon_optional": "Ícone (opcional, ex.: mdi:wrench)",
|
||||
"task_enabled": "Tarefa ativada",
|
||||
"skip_reason_prompt": "Pular esta tarefa?",
|
||||
"reason_optional": "Motivo (opcional)",
|
||||
"reset_date_prompt": "Marcar a tarefa como realizada?",
|
||||
"reset_date_optional": "Data da última execução (opcional, padrão: hoje)",
|
||||
"notes_label": "Observações",
|
||||
"documentation_label": "Documentação",
|
||||
"no_nfc_tag": "— Sem tag —",
|
||||
"dashboard": "Painel",
|
||||
"tab_today": "Hoje",
|
||||
"palette_placeholder": "Pesquisar objetos e tarefas…",
|
||||
"palette_no_results": "Nenhum resultado",
|
||||
"palette_hint": "↑↓ para navegar · Enter para abrir · Esc para fechar",
|
||||
"today_all_caught_up": "Tudo em dia! Nada vence esta semana.",
|
||||
"today_overdue": "Atrasadas",
|
||||
"today_due_today": "Vencem hoje",
|
||||
"today_this_week": "Esta semana",
|
||||
"settings": "Configurações",
|
||||
"settings_features": "Recursos avançados",
|
||||
"settings_features_desc": "Ative ou desative recursos avançados. Desativar apenas os oculta da interface, sem excluir dados.",
|
||||
"feat_adaptive": "Agendamento adaptativo",
|
||||
"feat_adaptive_desc": "Aprende intervalos ideais a partir do histórico de manutenção",
|
||||
"feat_predictions": "Previsões de sensor",
|
||||
"feat_predictions_desc": "Prevê datas de acionamento a partir da degradação do sensor",
|
||||
"feat_seasonal": "Ajustes sazonais",
|
||||
"feat_seasonal_desc": "Ajusta intervalos com base em padrões sazonais",
|
||||
"feat_environmental": "Correlação ambiental",
|
||||
"feat_environmental_desc": "Correlaciona intervalos com temperatura/umidade",
|
||||
"feat_budget": "Controle de orçamento",
|
||||
"feat_budget_desc": "Acompanha gastos mensais e anuais de manutenção",
|
||||
"feat_groups": "Grupos de tarefas",
|
||||
"feat_groups_desc": "Organiza tarefas em grupos lógicos",
|
||||
"feat_checklists": "Checklists",
|
||||
"feat_checklists_desc": "Procedimentos em várias etapas para concluir tarefas",
|
||||
"settings_general": "Geral",
|
||||
"settings_default_warning": "Dias de aviso padrão",
|
||||
"settings_panel_enabled": "Painel na barra lateral",
|
||||
"settings_panel_title": "Título do painel na barra lateral",
|
||||
"settings_notifications": "Notificações",
|
||||
"settings_notify_service": "Serviço de notificação",
|
||||
"test_notification": "Notificação de teste",
|
||||
"send_test": "Enviar teste",
|
||||
"testing": "Enviando…",
|
||||
"test_notification_success": "Notificação de teste enviada",
|
||||
"test_notification_failed": "Falha na notificação de teste",
|
||||
"settings_notify_due_soon": "Notificar quando vencer em breve",
|
||||
"settings_notify_overdue": "Notificar quando atrasada",
|
||||
"settings_notify_triggered": "Notificar quando acionada",
|
||||
"settings_interval_hours": "Intervalo de repetição (horas, 0 = uma vez)",
|
||||
"settings_quiet_hours": "Horário de silêncio",
|
||||
"settings_quiet_start": "Início",
|
||||
"settings_quiet_end": "Fim",
|
||||
"settings_max_per_day": "Máx. de notificações por dia (0 = ilimitado)",
|
||||
"settings_bundling": "Agrupar notificações",
|
||||
"settings_bundle_threshold": "Limite para agrupar",
|
||||
"settings_reminder_leads": "Lembretes extras (dias antes do vencimento)",
|
||||
"settings_reminder_leads_hint": "Antecedências separadas por vírgula, ex.: 14, 3, 0 — um lembrete extra é enviado em cada dia correspondente. Vazio = desativado.",
|
||||
"settings_actions": "Botões de ação no celular",
|
||||
"settings_action_complete": "Mostrar botão 'Concluir'",
|
||||
"settings_action_skip": "Mostrar botão 'Pular'",
|
||||
"settings_action_snooze": "Mostrar botão 'Soneca'",
|
||||
"settings_weekly_digest": "Resumo semanal",
|
||||
"settings_weekly_digest_hint": "Uma única notificação de resumo na segunda-feira de manhã quando houver tarefas vencendo.",
|
||||
"settings_warranty_reminder": "Lembrete de fim de garantia",
|
||||
"settings_warranty_reminder_days": "Dias antes do vencimento",
|
||||
"settings_warranty_reminder_hint": "Notifica uma vez quando faltar este número de dias para a garantia de um objeto expirar.",
|
||||
"settings_snooze_hours": "Duração da soneca (horas)",
|
||||
"settings_budget": "Orçamento",
|
||||
"settings_currency": "Moeda",
|
||||
"settings_budget_monthly": "Orçamento mensal",
|
||||
"settings_budget_yearly": "Orçamento anual",
|
||||
"settings_budget_alerts": "Alertas de orçamento",
|
||||
"settings_budget_threshold": "Limite de alerta (%)",
|
||||
"settings_import_export": "Importar / Exportar",
|
||||
"settings_export_json": "Exportar JSON",
|
||||
"settings_export_yaml": "Exportar YAML",
|
||||
"settings_export_csv": "Exportar CSV",
|
||||
"settings_import_csv": "Importar CSV",
|
||||
"settings_import_placeholder": "Cole o conteúdo JSON ou CSV aqui…",
|
||||
"settings_import_btn": "Importar",
|
||||
"settings_import_success": "{count} objetos importados com sucesso.",
|
||||
"settings_export_success": "Exportação baixada.",
|
||||
"settings_saved": "Configuração salva.",
|
||||
"settings_include_history": "Incluir histórico",
|
||||
"settings_export_selection": "Limitar aos objetos selecionados (opcional)",
|
||||
"settings_docs_archive": "Arquivo de documentos (com arquivos)",
|
||||
"settings_docs_archive_hint": "As exportações JSON/YAML/CSV levam apenas as configurações. Este ZIP inclui o conteúdo dos arquivos enviados para que a restauração seja completa.",
|
||||
"settings_docs_export_btn": "Baixar ZIP de documentos",
|
||||
"settings_docs_import_btn": "Restaurar ZIP de documentos",
|
||||
"settings_docs_import_success": "Restaurados: {blobs} arquivos, {docs} documentos",
|
||||
"sort_alphabetical": "Alfabética",
|
||||
"sort_due_soonest": "Vencimento mais próximo",
|
||||
"sort_task_count": "Número de tarefas",
|
||||
"sort_area": "Área",
|
||||
"sort_assigned_user": "Usuário atribuído",
|
||||
"sort_group": "Grupo",
|
||||
"groupby_none": "Sem agrupamento",
|
||||
"groupby_area": "Por área",
|
||||
"groupby_group": "Por grupo",
|
||||
"groupby_user": "Por usuário",
|
||||
"filter_label": "Filtro",
|
||||
"user_label": "Usuário",
|
||||
"sort_label": "Ordenar",
|
||||
"group_by_label": "Agrupar por",
|
||||
"state_value_help": "Use o valor de estado do HA (geralmente minúsculo, ex.: \"on\"/\"off\"). Maiúsculas e minúsculas são normalizadas ao salvar.",
|
||||
"target_changes_help": "Número de transições correspondentes antes de o gatilho disparar (padrão: 1).",
|
||||
"qr_print_title": "Imprimir códigos QR",
|
||||
"qr_print_desc": "Gere uma página imprimível de códigos QR para recortar e colar nos seus equipamentos.",
|
||||
"qr_print_load": "Carregar objetos",
|
||||
"qr_print_filter": "Filtro",
|
||||
"qr_print_objects": "Objetos",
|
||||
"qr_print_actions": "Ações",
|
||||
"qr_print_url_mode": "Tipo de link",
|
||||
"qr_print_estimate": "Códigos QR estimados",
|
||||
"qr_print_over_limit": "o limite é 200, restrinja o filtro",
|
||||
"qr_print_generate": "Gerar códigos QR",
|
||||
"qr_print_generating": "Gerando…",
|
||||
"qr_print_ready": "Códigos QR prontos",
|
||||
"qr_print_print_button": "Imprimir",
|
||||
"qr_print_empty": "Nada para gerar",
|
||||
"qr_action_skip": "Pular",
|
||||
"vacation_title": "Modo férias",
|
||||
"vacation_active": "ativo",
|
||||
"vacation_ended": "encerrado",
|
||||
"vacation_desc": "Planeje as férias: as notificações ficam pausadas durante o período mais uma margem de dias. Você pode reativar tarefas específicas.",
|
||||
"vacation_enable": "Ativar modo férias",
|
||||
"vacation_start": "Início",
|
||||
"vacation_end": "Fim",
|
||||
"vacation_buffer": "Margem (dias)",
|
||||
"vacation_exempt_title": "Notificar mesmo assim durante as férias",
|
||||
"vacation_exempt_desc": "Escolha tarefas que ainda devem notificar durante as férias (ex.: química crítica da piscina).",
|
||||
"vacation_load_tasks": "Carregar tarefas",
|
||||
"vacation_preview_btn": "Mostrar prévia",
|
||||
"vacation_preview_affected": "tarefas afetadas",
|
||||
"vacation_event_due_soon": "passa a vencer em breve",
|
||||
"vacation_event_overdue": "fica atrasada",
|
||||
"vacation_event_triggered_est": "possível acionamento por sensor",
|
||||
"vacation_sensor_based": "(baseado em sensor)",
|
||||
"vacation_action_notify": "Notificar mesmo assim",
|
||||
"vacation_action_unsilence": "Silenciar novamente",
|
||||
"vacation_marked_complete": "Marcada como concluída",
|
||||
"vacation_marked_skip": "Pulada",
|
||||
"vacation_end_now": "Encerrar as férias agora",
|
||||
"add": "Adicionar",
|
||||
"show_stats": "Mostrar estatísticas + gráficos",
|
||||
"hide_stats": "Ocultar estatísticas",
|
||||
"adaptive_no_data": "Ainda não há histórico de conclusões suficiente para a análise adaptativa. Conclua esta tarefa mais algumas vezes para desbloquear recomendações de intervalo e gráficos de confiabilidade.",
|
||||
"suggestion_applied": "Intervalo sugerido aplicado",
|
||||
"vacation_mode": "Modo férias",
|
||||
"vacation_status_active": "Ativo agora",
|
||||
"vacation_status_scheduled": "Agendado",
|
||||
"vacation_status_inactive": "Inativo",
|
||||
"vacation_end_now_confirm": "Encerrar as férias imediatamente?",
|
||||
"vacation_exempt_count": "isentas",
|
||||
"vacation_advanced": "Avançado…",
|
||||
"vacation_open_panel": "Abrir no painel",
|
||||
"enable": "Ativar",
|
||||
"saved": "Salvo",
|
||||
"budget_monthly_set": "Definir mensal",
|
||||
"budget_yearly_set": "Definir anual",
|
||||
"budget_advanced": "Moeda, alertas…",
|
||||
"budget_open_panel": "Abrir no painel",
|
||||
"groups_empty": "Ainda sem grupos.",
|
||||
"group_new_placeholder": "Adicionar grupo…",
|
||||
"group_delete_confirm": "Excluir o grupo \"{name}\"?",
|
||||
"groups_manage_tasks": "Gerenciar atribuições de tarefas…",
|
||||
"groups_open_panel": "Abrir no painel",
|
||||
"unassigned": "Sem atribuição",
|
||||
"no_area": "Sem área",
|
||||
"has_overdue": "Tem tarefas atrasadas",
|
||||
"object": "Objeto",
|
||||
"settings_panel_access": "Acesso ao painel",
|
||||
"settings_panel_access_desc": "Administradores sempre têm acesso total. Para delegar criação, edição e exclusão a não administradores específicos, ative esta opção e selecione-os abaixo — os demais veem apenas Concluir e Pular.",
|
||||
"settings_operator_write": "Permitir que os usuários selecionados criem, editem e excluam",
|
||||
"settings_operator_write_desc": "Desligado: apenas administradores podem alterar o conteúdo. Ligado: os usuários selecionados abaixo também recebem acesso total.",
|
||||
"no_non_admin_users": "Nenhum usuário não administrador encontrado. Adicione em Configurações → Pessoas.",
|
||||
"owner_label": "Proprietário",
|
||||
"feat_completion_actions": "Ações de conclusão",
|
||||
"feat_completion_actions_desc": "Ação do HA por tarefa ao concluir + QR de conclusão rápida com valores predefinidos.",
|
||||
"on_complete_action_title": "Ao concluir: acionar ação do HA (opcional)",
|
||||
"on_complete_action_desc": "Chama um serviço do HA quando a tarefa é concluída — ex.: zerar um contador no dispositivo.",
|
||||
"on_complete_action_service": "Serviço",
|
||||
"on_complete_action_target": "Entidade alvo",
|
||||
"on_complete_action_target_hint": "Atenção: o domínio da entidade deve corresponder ao serviço — ex.: 'button.press' só funciona em button.*, 'counter.increment' só em counter.*, 'input_button.press' só em input_button.* etc. Em caso de divergência, a ação falhará silenciosamente (o HA registra 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Dados (JSON, opcional)",
|
||||
"on_complete_action_test": "Validar configuração",
|
||||
"on_complete_action_test_success": "✓ Configuração válida (a ação só disparará na conclusão da tarefa)",
|
||||
"on_complete_action_test_failed": "Falhou",
|
||||
"quick_complete_defaults_title": "Padrões de conclusão rápida (para leituras de QR, opcional)",
|
||||
"quick_complete_defaults_desc": "Valores predefinidos para conclusões rápidas via QR. Sem eles, o QR abre o diálogo de conclusão.",
|
||||
"quick_complete_defaults_notes": "Observações",
|
||||
"quick_complete_defaults_cost": "Custo",
|
||||
"quick_complete_defaults_duration": "Duração (minutos)",
|
||||
"quick_complete_defaults_feedback_none": "Sem feedback",
|
||||
"quick_complete_defaults_feedback_needed": "Era necessária",
|
||||
"quick_complete_defaults_feedback_not_needed": "Não era necessária",
|
||||
"quick_complete_success": "Concluída rapidamente",
|
||||
"show_all_objects": "Mostrar todos os objetos",
|
||||
"show_all_tasks": "Limpar filtro — mostrar todas as tarefas",
|
||||
"filter_to_overdue": "Filtrar a lista de tarefas para apenas atrasadas",
|
||||
"filter_to_due_soon": "Filtrar a lista de tarefas para apenas vencendo em breve",
|
||||
"filter_to_triggered": "Filtrar a lista de tarefas para apenas acionadas",
|
||||
"open_task": "Abrir tarefa",
|
||||
"show_details": "Mostrar histórico + estatísticas",
|
||||
"hide_details": "Ocultar detalhes",
|
||||
"history_empty": "Ainda sem histórico.",
|
||||
"history_edit_button": "Editar entrada",
|
||||
"total_cost": "Custo total",
|
||||
"times_performed": "Realizada",
|
||||
"older_entries": "mais antigas",
|
||||
"open_in_panel": "Abrir no painel de Manutenção",
|
||||
"skip_reason": "Motivo para pular (opcional)",
|
||||
"reset_to_date": "Redefinir última execução para",
|
||||
"delete_task_confirm": "Excluir esta tarefa e seu histórico?",
|
||||
"delete_object_confirm": "Excluir este objeto e todas as suas tarefas?",
|
||||
"loading": "Carregando…",
|
||||
"archive": "Arquivar",
|
||||
"undo": "Desfazer",
|
||||
"task_archived": "Tarefa arquivada",
|
||||
"object_archived": "Objeto arquivado",
|
||||
"unarchive": "Desarquivar",
|
||||
"archived": "Arquivada",
|
||||
"show_archived": "Mostrar arquivados",
|
||||
"hide_archived": "Ocultar arquivados",
|
||||
"confirm_archive_object": "Arquivar este objeto e suas tarefas? Eles mantêm o histórico e podem ser desarquivados depois.",
|
||||
"settings_archive": "Arquivamento e retenção",
|
||||
"settings_archive_desc": "Aposente tarefas únicas concluídas sem excluí-las. Itens arquivados ficam ocultos e inativos, mas mantêm o histórico e o custo.",
|
||||
"settings_archive_oneoff_days": "Arquivar automaticamente tarefas únicas concluídas após (dias, 0 = desativado)",
|
||||
"settings_delete_archived_oneoff_days": "Excluir automaticamente tarefas únicas arquivadas após (dias, 0 = nunca)",
|
||||
"archive_object": "Arquivar objeto",
|
||||
"unarchive_object": "Desarquivar objeto",
|
||||
"documents": "Documentos",
|
||||
"documents_empty": "Ainda não há documentos.",
|
||||
"doc_upload": "Enviar arquivo",
|
||||
"doc_uploading": "Enviando…",
|
||||
"doc_add_link": "Adicionar link",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Título (opcional)",
|
||||
"doc_open": "Abrir",
|
||||
"doc_delete_confirm": "Excluir \"{name}\"?",
|
||||
"doc_too_large": "O arquivo é muito grande (máx. 25 MB).",
|
||||
"doc_upload_failed": "Falha no envio.",
|
||||
"completion_photo_optional": "Foto da conclusão (opcional)",
|
||||
"add_photo": "Adicionar foto",
|
||||
"uploading": "Enviando…",
|
||||
"remove": "Remover",
|
||||
"doc_deduped": "Já armazenado em outro lugar — compartilhado, sem uso de espaço extra.",
|
||||
"doc_dup_in_object": "Este arquivo já está anexado a este objeto.",
|
||||
"doc_link_invalid": "Apenas links http/https são permitidos.",
|
||||
"doc_cat_manual": "Manual",
|
||||
"doc_cat_warranty": "Garantia",
|
||||
"doc_cat_invoice": "Nota fiscal",
|
||||
"doc_cat_spare_parts": "Peças de reposição",
|
||||
"doc_cat_photo": "Foto",
|
||||
"doc_cat_other": "Outros",
|
||||
"doc_link_badge": "Link",
|
||||
"doc_storage_title": "Armazenamento de documentos",
|
||||
"doc_storage_saved": "Economizado por deduplicação",
|
||||
"doc_storage_refresh": "Atualizar",
|
||||
"doc_download": "Baixar",
|
||||
"doc_close": "Fechar",
|
||||
"doc_camera": "Tirar foto",
|
||||
"doc_drop_hint": "Solte os arquivos aqui",
|
||||
"doc_task_none": "Nenhum documento vinculado a esta tarefa.",
|
||||
"doc_link_existing": "Vincular um documento…",
|
||||
"doc_attach": "Vincular",
|
||||
"doc_unlink": "Desvincular",
|
||||
"doc_page": "Página",
|
||||
"chart_range_7d": "7d",
|
||||
"chart_range_30d": "30d",
|
||||
"chart_range_90d": "90d",
|
||||
"chart_range_1y": "1a",
|
||||
"chart_since_service": "desde a última manutenção",
|
||||
"chart_no_stats": "Sem estatísticas de longo prazo para esta entidade — mostrando apenas valores de eventos de manutenção",
|
||||
"auto_complete_on_recovery": "Concluir automaticamente quando o sensor se recuperar",
|
||||
"auto_complete_on_recovery_help": "Registra uma conclusão (define a última execução) quando o gatilho se resolve sozinho — ex.: sal reposto, filtro trocado.",
|
||||
"doc_search": "Pesquisar documentos…",
|
||||
"doc_search_none": "Nenhum documento correspondente",
|
||||
"link_device_optional": "Vincular a um dispositivo existente (opcional)",
|
||||
"parent_object_optional": "Objeto pai (opcional)",
|
||||
"parent_none": "(Sem pai)",
|
||||
"paused": "Pausado",
|
||||
"pause_object": "Pausar",
|
||||
"resume_object": "Retomar",
|
||||
"pause_until_prompt": "Congele os agendamentos deste objeto — nada vence e nada notifica até que ele seja retomado. Opcionalmente, defina uma data de retomada automática.",
|
||||
"pause_until_label": "Retomar em (opcional)",
|
||||
"object_paused": "Objeto pausado",
|
||||
"object_resumed": "Objeto retomado — agendamentos reiniciados",
|
||||
"object_paused_badge": "Pausado",
|
||||
"paused_until_label": "até",
|
||||
"replace_object": "Substituir…",
|
||||
"replace_object_prompt": "Aposente este objeto e crie um sucessor. O histórico e os custos ficam arquivados no antigo; as tarefas e os documentos passam para o novo, e os contadores recomeçam do zero.",
|
||||
"replace_name_label": "Nome do sucessor",
|
||||
"object_replaced": "Objeto substituído — sucessor criado",
|
||||
"reading_unit_label": "Unidade da leitura (ex.: kWh, m³)",
|
||||
"reading_unit_help": "Exibida ao lado do valor registrado ao concluir esta tarefa.",
|
||||
"reading_value_label": "Valor da leitura",
|
||||
"reading_label": "Leitura",
|
||||
"settings_templates_label": "Galeria de modelos",
|
||||
"settings_templates_hint": "Desmarque os modelos de que você nunca precisará — eles somem dos seletores \"A partir de modelo\" (painel e fluxo de configuração). Nada mais muda; você pode reativá-los a qualquer momento.",
|
||||
"worksheet": "Folha de trabalho",
|
||||
"worksheet_scan_view": "Escaneie para abrir a tarefa",
|
||||
"worksheet_scan_complete": "Escaneie para concluir",
|
||||
"worksheet_manual_excerpt": "Trecho do manual",
|
||||
"worksheet_pages": "páginas",
|
||||
"worksheet_printed": "Impressa em",
|
||||
"worksheet_never": "Nunca",
|
||||
"card_all_caught_up": "Tudo em dia — nada precisa de atenção",
|
||||
"postpone": "Adiar",
|
||||
"postpone_date_prompt": "Adiar esta ocorrência para qual data?",
|
||||
"postpone_date_label": "Nova data de vencimento",
|
||||
"postponed": "Adiada",
|
||||
"postponed_to": "Adiada para",
|
||||
"season_window_label": "Janela sazonal (meses)",
|
||||
"season_window_hint": "Vence apenas nos meses selecionados; datas fora de temporada passam para o próximo mês ativo. Nenhum = o ano todo.",
|
||||
"series_end_label": "Termina",
|
||||
"series_end_never": "Nunca (repete indefinidamente)",
|
||||
"series_end_after_count": "Após um número de vezes",
|
||||
"series_end_until": "Em uma data",
|
||||
"series_end_count_label": "Número de vezes",
|
||||
"series_end_until_label": "Data final",
|
||||
"parts_section": "Peças e consumíveis",
|
||||
"part_add": "Adicionar peça",
|
||||
"part_name": "Nome",
|
||||
"part_vendor": "Fabricante",
|
||||
"part_storage_location": "Local de armazenamento",
|
||||
"part_product_url": "URL do produto",
|
||||
"part_unit": "Unidade",
|
||||
"part_cost": "Preço unitário",
|
||||
"part_stock": "Estoque",
|
||||
"part_reorder_threshold": "Repor em",
|
||||
"part_restock_quantity": "Quantidade de reposição",
|
||||
"part_auto_buy": "Criar tarefa de compra automaticamente quando estiver baixo",
|
||||
"part_restock": "Ajustar estoque",
|
||||
"restock_quantity_label": "Quantidade comprada",
|
||||
"consumes_parts_label": "Consome peças",
|
||||
"parts_load_failed": "Não foi possível carregar as peças deste objeto — as opções de consumo de peças estão indisponíveis no momento.",
|
||||
"adopt_problem_button": "Adotar sensores de problema",
|
||||
"adopt_problem_title": "Adotar sensores de problema",
|
||||
"adopt_problem_hint": "Transforme sensores de problema do HA (erros de impressora, avisos de filtro, bateria fraca) em tarefas de manutenção que são acionadas enquanto o problema está ativo e se resolvem sozinhas quando ele desaparece.",
|
||||
"adopt_problem_none": "Nenhum sensor de problema encontrado que ainda não seja acompanhado.",
|
||||
"adopt_problem_active": "ativo",
|
||||
"adopt_problem_ok": "ok",
|
||||
"adopt_problem_new_object": "(novo)",
|
||||
"adopt_problem_adopt": "Adotar selecionados",
|
||||
"adopt_problem_done": "{tasks} sensor(es) de problema adotado(s)",
|
||||
"views_label": "Visualizações",
|
||||
"views_none": "— Nenhuma visualização —",
|
||||
"views_manage": "Salvar / gerenciar visualizações",
|
||||
"views_dialog_title": "Visualizações salvas",
|
||||
"views_dialog_hint": "Salve os filtros atuais como uma visualização nomeada que todos podem reutilizar.",
|
||||
"views_name_placeholder": "Nome da visualização",
|
||||
"views_save_current": "Salvar filtros atuais",
|
||||
"views_none_yet": "Ainda não há visualizações salvas.",
|
||||
"close": "Fechar",
|
||||
"trigger_hint_now": "O sensor lê {value} neste momento.",
|
||||
"trigger_hint_above": "A tarefa é acionada quando o valor sobe acima de {target}.",
|
||||
"trigger_hint_below": "É acionada quando o valor cai abaixo de {target}.",
|
||||
"trigger_hint_counter_delta": "Conta a partir da leitura atual ({value}): vence em {due} (+{target}), e a contagem recomeça após cada conclusão.",
|
||||
"trigger_hint_counter_delta_edit": "Conta o uso desde a última conclusão: vence após +{target}; a contagem recomeça após cada conclusão.",
|
||||
"trigger_hint_counter_abs": "A tarefa vence quando o sensor atinge {target}.",
|
||||
"trigger_hint_runtime": "A tarefa vence após {hours} h de funcionamento acumulado; o contador recomeça após cada conclusão.",
|
||||
"trigger_hint_state_change": "A tarefa vence após {count} mudança(s) de estado.",
|
||||
"trigger_hint_state_change_to": "A tarefa vence após {count} mudança(s) para “{state}”.",
|
||||
"trigger_hint_state_now": "Estado atual: {value}.",
|
||||
"adopt_problem_part": "Usa a peça: {name}",
|
||||
"label_filter": "Etiqueta",
|
||||
"all_labels": "Todas as etiquetas",
|
||||
"settings_notify_scope": "Notificar apenas para a visualização",
|
||||
"settings_notify_scope_all": "Todas as tarefas",
|
||||
"settings_notify_scope_hint": "Apenas tarefas que correspondem aos filtros de etiqueta/usuário da visualização salva selecionada enviam lembretes. Status, ordenação e agrupamento da visualização são ignorados aqui.",
|
||||
"card_saved_view": "Visualização salva",
|
||||
"card_saved_view_none": "Nenhuma",
|
||||
"card_saved_view_help": "Aplica os filtros de status, usuário e etiqueta da visualização por cima dos filtros acima. A ordenação e o agrupamento da visualização são configurações de exibição do painel e não se aplicam ao cartão.",
|
||||
"doc_part_none": "Nenhum documento vinculado a esta peça.",
|
||||
"settings_templates_toggle_group": "Ativar ou desativar todos os modelos deste grupo",
|
||||
"setups_button": "Configurações sugeridas",
|
||||
"setups_title": "Configurações sugeridas (Beta)",
|
||||
"setups_hint": "Dispositivos de integrações compatíveis cujos sensores de consumíveis podem alimentar tarefas de manutenção. Adotar cria o objeto e conecta cada tarefa ao seu sensor — ela é acionada quando o consumível fica baixo e se resolve sozinha após a troca.",
|
||||
"setups_none": "Nenhum dispositivo compatível com sensores de consumíveis ainda não conectados foi encontrado.",
|
||||
"setups_adopt": "Configurar selecionados",
|
||||
"setups_done": "{tasks} tarefas conectadas a sensores foram criadas.",
|
||||
"complete_parts_used": "Peças usadas desta vez",
|
||||
"part_delete_confirm": "Excluir a peça '{name}'? O controle de estoque, os vínculos com tarefas e qualquer lembrete de compra aberto serão removidos.",
|
||||
"baseline_start_value": "Leitura inicial (opcional)",
|
||||
"baseline_start_help": "A contagem começa a partir desta leitura. Deixe vazio para contar a partir do valor atual; informe a leitura da última manutenção para que o uso desde então já seja contado.",
|
||||
"setups_baseline_hint": "leitura na última manutenção (opcional)",
|
||||
"baseline_start_help_edit": "Deixe vazio para manter a contagem existente. Informar um valor reancora a contagem (ex.: a leitura da última manutenção).",
|
||||
"baseline_current_effective": "Valor inicial efetivo atual: {value}",
|
||||
"runtime_on_states": "Estados ativos (separados por vírgula)",
|
||||
"runtime_on_states_help": "Estados que contam como em funcionamento — padrão: on. Ex.: mowing, cleaning, printing. Com um atributo selecionado, os valores dele são comparados.",
|
||||
"setups_target_new": "Criar novo: {name}",
|
||||
"schedule_preview_title": "Próximas datas",
|
||||
"schedule_preview_ontime": "Supondo conclusão em dia.",
|
||||
"schedule_preview_ends": "(a série termina)",
|
||||
"adopt_problem_responsible": "Usuário responsável por todas as tarefas adotadas (opcional)",
|
||||
"adopt_problem_configure": "Configurar",
|
||||
"history_auto": "Automática",
|
||||
"battery_fleet_title": "Frota de baterias",
|
||||
"battery_fleet_none_low": "Todas as baterias OK — nada a substituir.",
|
||||
"battery_fleet_buy_now": "Comprar agora",
|
||||
"battery_fleet_soon": "Necessárias em breve",
|
||||
"battery_fleet_soon_hint": "Previsto a partir da data da última troca — compre com antecedência.",
|
||||
"battery_fleet_mark_all": "Marcar todas como trocadas",
|
||||
"battery_fleet_mark_one": "Marcar esta bateria como trocada",
|
||||
"battery_fleet_offline": "offline",
|
||||
"battery_fleet_trigger_lost": "O gatilho do sensor desta tarefa foi perdido — ela não será acionada nem concluída automaticamente.",
|
||||
"battery_fleet_repair": "Reparar",
|
||||
"battery_fleet_exclude": "Remover da frota",
|
||||
"battery_fleet_excluded": "Removida",
|
||||
"battery_fleet_include": "Acompanhar novamente",
|
||||
"battery_fleet_total": "{n} baterias acompanhadas",
|
||||
"battery_fleet_setup_button": "Frota de baterias",
|
||||
"battery_fleet_setup_done": "Frota de baterias configurada — uma única tarefa acompanha todas as suas baterias.",
|
||||
"update_banner": "Há uma versão mais nova do Maintenance Supporter no servidor — recarregue para atualizar o painel.",
|
||||
"update_reload": "Recarregar"
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"maintenance": "Bakım",
|
||||
"objects": "Nesneler",
|
||||
"tasks": "Görevler",
|
||||
"overdue": "Gecikmiş",
|
||||
"due_soon": "Yaklaşan",
|
||||
"triggered": "Tetiklendi",
|
||||
"trigger_replaced": "Tetikleyici değiştirildi",
|
||||
"ok": "Tamam",
|
||||
"all": "Tümü",
|
||||
"new_object": "+ Yeni Nesne",
|
||||
"templates_from": "Şablondan",
|
||||
"templates_title": "Bir şablonla başlayın",
|
||||
"templates_task_count": "{n} görev",
|
||||
"template_created": "Şablondan oluşturuldu",
|
||||
"onboard_hint": "Bakım takibine başlamak için ilk nesnenizi ekleyin.",
|
||||
"edit": "Düzenle",
|
||||
"duplicate": "Çoğalt",
|
||||
"task_duplicated": "Görev çoğaltıldı",
|
||||
"object_duplicated": "Nesne çoğaltıldı",
|
||||
"delete": "Sil",
|
||||
"add_task": "+ Görev Ekle",
|
||||
"complete": "Tamamla",
|
||||
"completed": "Tamamlandı",
|
||||
"skip": "Atla",
|
||||
"skipped": "Atlandı",
|
||||
"missed": "Kaçırıldı",
|
||||
"reset": "Sıfırla",
|
||||
"snooze": "Ertele",
|
||||
"snoozed": "Ertelendi",
|
||||
"cancel": "İptal",
|
||||
"bulk_select": "Seç",
|
||||
"bulk_select_all": "Tümünü seç",
|
||||
"bulk_n_selected": "{n} seçildi",
|
||||
"bulk_completed": "{n} görev tamamlandı",
|
||||
"bulk_archived": "{n} görev arşivlendi",
|
||||
"completing": "Tamamlanıyor…",
|
||||
"interval": "Aralık",
|
||||
"warning": "Uyarı",
|
||||
"last_performed": "Son yapılma",
|
||||
"next_due": "Sonraki vade",
|
||||
"days_until_due": "Vadeye kalan gün",
|
||||
"avg_duration": "Ort. süre",
|
||||
"trigger": "Tetikleyici",
|
||||
"trigger_type": "Tetikleyici türü",
|
||||
"threshold_above": "Üst sınır",
|
||||
"threshold_below": "Alt sınır",
|
||||
"threshold": "Eşik",
|
||||
"counter": "Sayaç",
|
||||
"state_change": "Durum değişikliği",
|
||||
"runtime": "Çalışma süresi",
|
||||
"runtime_hours": "Hedef çalışma süresi (saat)",
|
||||
"target_value": "Hedef değer",
|
||||
"baseline": "Başlangıç değeri",
|
||||
"target_changes": "Hedef değişiklik sayısı",
|
||||
"for_minutes": "Süre (dakika)",
|
||||
"time_based": "Zamana dayalı",
|
||||
"sensor_based": "Sensöre dayalı",
|
||||
"manual": "Manuel",
|
||||
"one_time": "Tek seferlik",
|
||||
"weekdays": "Haftanın günleri",
|
||||
"nth_weekday": "Ayın n. hafta günü",
|
||||
"day_of_month": "Ayın günü",
|
||||
"recurrence_on_days": "Tekrar günleri",
|
||||
"recurrence_occurrence": "Kaçıncı",
|
||||
"recurrence_weekday": "Haftanın günü",
|
||||
"recurrence_day": "Ayın günü (1–31)",
|
||||
"recurrence_last_day": "Ayın son günü",
|
||||
"recurrence_business_day": "Yalnızca iş günleri (hafta sonundan geriye kaydır)",
|
||||
"recurrence_offset": "Kaydırma (gün, ±)",
|
||||
"recurrence_offset_help": "Tarihi ±N gün kaydırır, örn. -2 = iki gün önce.",
|
||||
"last_day_month": "Ayın son günü",
|
||||
"last_business_day_month": "Son iş günü",
|
||||
"ord_1": "1.",
|
||||
"ord_2": "2.",
|
||||
"ord_3": "3.",
|
||||
"ord_4": "4.",
|
||||
"ord_5": "5.",
|
||||
"ord_last": "Son",
|
||||
"day_word": "Gün",
|
||||
"interval_value": "Aralık",
|
||||
"interval_unit": "Birim",
|
||||
"unit_days": "Gün",
|
||||
"unit_weeks": "Hafta",
|
||||
"unit_months": "Ay",
|
||||
"unit_years": "Yıl",
|
||||
"due_date": "Vade tarihi",
|
||||
"cleaning": "Temizlik",
|
||||
"inspection": "Kontrol",
|
||||
"replacement": "Değişim",
|
||||
"calibration": "Kalibrasyon",
|
||||
"service": "Servis",
|
||||
"reading": "Okuma",
|
||||
"custom": "Özel",
|
||||
"history": "Geçmiş",
|
||||
"cost": "Maliyet",
|
||||
"report_button": "Rapor",
|
||||
"report_title": "Bakım raporu",
|
||||
"report_generated": "Oluşturulma",
|
||||
"report_times_done": "Yapıldı",
|
||||
"report_total_cost": "Toplam maliyet",
|
||||
"report_every": "her {n} {unit}",
|
||||
"report_notes": "Notlar",
|
||||
"report_col_type": "Tür",
|
||||
"report_col_status": "Durum",
|
||||
"report_col_schedule": "Zamanlama",
|
||||
"duration": "Süre",
|
||||
"both": "Her ikisi",
|
||||
"trigger_val": "Tetikleme değeri",
|
||||
"complete_title": "Tamamla: ",
|
||||
"checklist": "Kontrol listesi",
|
||||
"checklist_steps_optional": "Kontrol listesi adımları (isteğe bağlı)",
|
||||
"checklist_placeholder": "Filtreyi temizle\nContayı değiştir\nBasıncı test et",
|
||||
"checklist_help": "Her satıra bir adım. En fazla 100 madde.",
|
||||
"err_too_long": "{field}: çok uzun (en fazla {n} karakter)",
|
||||
"err_too_short": "{field}: çok kısa (en az {n} karakter)",
|
||||
"err_value_too_high": "{field}: çok büyük (en fazla {n})",
|
||||
"err_value_too_low": "{field}: çok küçük (en az {n})",
|
||||
"err_required": "{field}: zorunlu",
|
||||
"err_wrong_type": "{field}: yanlış tür (beklenen: {type})",
|
||||
"err_invalid_choice": "{field}: izin verilen bir değer değil",
|
||||
"err_invalid_value": "{field}: geçersiz değer",
|
||||
"feat_schedule_time": "Gün içi saat zamanlaması",
|
||||
"feat_schedule_time_desc": "Görevler gece yarısı yerine günün belirli bir saatinde gecikmiş olur.",
|
||||
"schedule_time_optional": "Vade saati (isteğe bağlı, SS:DD)",
|
||||
"schedule_time_help": "Boş = gece yarısı (varsayılan). HA saat dilimi.",
|
||||
"at_time": "saat",
|
||||
"notes_optional": "Notlar (isteğe bağlı)",
|
||||
"cost_optional": "Maliyet (isteğe bağlı)",
|
||||
"duration_minutes": "Dakika cinsinden süre (isteğe bağlı)",
|
||||
"days": "gün",
|
||||
"day": "gün",
|
||||
"today": "Bugün",
|
||||
"d_overdue": "g gecikmiş",
|
||||
"no_tasks": "Henüz bakım görevi yok. Başlamak için bir nesne oluşturun.",
|
||||
"no_tasks_short": "Görev yok",
|
||||
"no_history": "Henüz geçmiş kaydı yok.",
|
||||
"show_all": "Tümünü göster",
|
||||
"cost_duration_chart": "Maliyet ve Süre",
|
||||
"installed": "Kurulum",
|
||||
"confirm_delete_object": "Bu nesne ve tüm görevleri silinsin mi?",
|
||||
"confirm_delete_task": "Bu görev silinsin mi?",
|
||||
"min": "Min",
|
||||
"max": "Maks",
|
||||
"save": "Kaydet",
|
||||
"saving": "Kaydediliyor…",
|
||||
"edit_task": "Görevi Düzenle",
|
||||
"new_task": "Yeni Bakım Görevi",
|
||||
"task_name": "Görev adı",
|
||||
"maintenance_type": "Bakım türü",
|
||||
"priority": "Öncelik",
|
||||
"labels": "Etiketler",
|
||||
"labels_placeholder": "örn. güvenlik, mevsimlik, kiracıya görünür",
|
||||
"labels_help": "Filtreleme ve raporlama için virgülle ayrılmış etiketler.",
|
||||
"priority_low": "Düşük",
|
||||
"priority_normal": "Normal",
|
||||
"priority_high": "Yüksek",
|
||||
"schedule_type": "Zamanlama türü",
|
||||
"interval_days": "Aralık (gün)",
|
||||
"warning_days": "Uyarı günleri",
|
||||
"earliest_completion_days": "En erken tamamlama (vadeden gün önce)",
|
||||
"earliest_completion_days_help": "Her zaman tamamlanabilmesi için boş bırakın. 0 = yalnızca vade gününde veya sonrasında.",
|
||||
"last_performed_optional": "Son yapılma (isteğe bağlı)",
|
||||
"interval_anchor": "Aralık referansı",
|
||||
"anchor_completion": "Tamamlama tarihinden",
|
||||
"anchor_planned": "Planlanan tarihten (kayma olmaz)",
|
||||
"edit_object": "Nesneyi Düzenle",
|
||||
"name": "Ad",
|
||||
"manufacturer_optional": "Üretici (isteğe bağlı)",
|
||||
"model_optional": "Model (isteğe bağlı)",
|
||||
"serial_number_optional": "Seri numarası (isteğe bağlı)",
|
||||
"serial_number_label": "S/N",
|
||||
"documentation_url_label": "Kılavuz",
|
||||
"object_notes_label": "Notlar",
|
||||
"sort_due_date": "Vade tarihi",
|
||||
"sort_object": "Nesne adı",
|
||||
"sort_type": "Tür",
|
||||
"sort_task_name": "Görev adı",
|
||||
"all_objects": "Tüm nesneler",
|
||||
"tasks_lower": "görev",
|
||||
"no_tasks_yet": "Henüz görev yok",
|
||||
"add_first_task": "İlk görevi ekle",
|
||||
"trigger_configuration": "Tetikleyici Yapılandırması",
|
||||
"entity_id": "Varlık kimliği",
|
||||
"comma_separated": "virgülle ayrılmış",
|
||||
"entity_logic": "Varlık mantığı",
|
||||
"entity_logic_any": "Herhangi bir varlık tetikler",
|
||||
"entity_logic_all": "Tüm varlıklar tetiklemeli",
|
||||
"entities": "varlık",
|
||||
"attribute_optional": "Öznitelik (isteğe bağlı, boş = durum)",
|
||||
"use_entity_state": "Varlık durumunu kullan (öznitelik yok)",
|
||||
"trigger_above": "Üstünde tetikle",
|
||||
"trigger_below": "Altında tetikle",
|
||||
"for_at_least_minutes": "En az (dakika)",
|
||||
"safety_interval_days": "Güvenlik aralığı (gün, isteğe bağlı)",
|
||||
"safety_interval": "Güvenlik aralığı (isteğe bağlı)",
|
||||
"delta_mode": "Fark modu",
|
||||
"from_state_optional": "Başlangıç durumu (isteğe bağlı)",
|
||||
"to_state_optional": "Hedef durum (isteğe bağlı)",
|
||||
"documentation_url_optional": "Dokümantasyon URL'si (isteğe bağlı)",
|
||||
"object_notes_optional": "Notlar (isteğe bağlı)",
|
||||
"nfc_tag_id_optional": "NFC Etiket Kimliği (isteğe bağlı)",
|
||||
"nfc_tags_empty_help": "Home Assistant'ta henüz kayıtlı NFC etiketi yok.",
|
||||
"nfc_tags_open_settings": "Etiket ayarlarını aç",
|
||||
"nfc_tags_refresh": "Yenile",
|
||||
"environmental_entity_optional": "Çevresel sensör (isteğe bağlı)",
|
||||
"environmental_entity_helper": "örn. sensor.outdoor_temperature — aralığı çevresel koşullara göre ayarlar",
|
||||
"environmental_attribute_optional": "Çevresel öznitelik (isteğe bağlı)",
|
||||
"nfc_tag_id": "NFC Etiket Kimliği",
|
||||
"nfc_linked": "NFC etiketi bağlandı",
|
||||
"nfc_link_hint": "NFC etiketi bağlamak için tıklayın",
|
||||
"responsible_user": "Sorumlu Kullanıcı",
|
||||
"shared_with": "Paylaşılanlar (rotasyon)",
|
||||
"shared_with_help": "Bu görevi paylaşmak için birden fazla kişi seçin; sorumlu kişi her tamamlamada sırayla değişir.",
|
||||
"rotation_strategy": "Rotasyon",
|
||||
"rotation_none": "Rotasyon yok",
|
||||
"rotation_round_robin": "Sırayla",
|
||||
"rotation_least_completed": "En az tamamlayan",
|
||||
"rotation_random": "Rastgele",
|
||||
"no_user_assigned": "(Kullanıcı atanmadı)",
|
||||
"all_users": "Tüm Kullanıcılar",
|
||||
"my_tasks": "Görevlerim",
|
||||
"tab_calendar": "Takvim",
|
||||
"cal_no_events": "Bakım yok",
|
||||
"cal_window_7": "7 gün",
|
||||
"cal_window_14": "14 gün",
|
||||
"cal_window_30": "30 gün",
|
||||
"cal_window_365": "1 yıl",
|
||||
"cal_every_n_days": "her {n} günde bir",
|
||||
"cal_source_time": "Zamana dayalı",
|
||||
"cal_source_time_adaptive": "Zamana dayalı (uyarlanabilir)",
|
||||
"cal_source_sensor": "Sensöre dayalı",
|
||||
"cal_predicted": "tahmini",
|
||||
"cal_confidence_high": "yüksek güven",
|
||||
"cal_confidence_medium": "orta güven",
|
||||
"cal_confidence_low": "düşük güven",
|
||||
"budget_monthly": "Aylık bütçe",
|
||||
"budget_yearly": "Yıllık bütçe",
|
||||
"groups": "Gruplar",
|
||||
"new_group": "Yeni grup",
|
||||
"edit_group": "Grubu düzenle",
|
||||
"no_groups": "Henüz grup yok",
|
||||
"delete_group": "Grubu sil",
|
||||
"delete_group_confirm": "'{name}' grubu silinsin mi?",
|
||||
"group_select_tasks": "Görevleri seç",
|
||||
"group_name_required": "Ad zorunludur",
|
||||
"description_optional": "Açıklama (isteğe bağlı)",
|
||||
"selected": "Seçili",
|
||||
"loading_chart": "Grafik verileri yükleniyor...",
|
||||
"hide_outliers": "Aykırı değerleri gizle (sensör hataları)",
|
||||
"was_maintenance_needed": "Bu bakım gerekli miydi?",
|
||||
"feedback_needed": "Gerekliydi",
|
||||
"feedback_not_needed": "Gerekli değildi",
|
||||
"feedback_not_sure": "Emin değilim",
|
||||
"suggested_interval": "Önerilen aralık",
|
||||
"apply_suggestion": "Uygula",
|
||||
"reanalyze": "Yeniden analiz et",
|
||||
"reanalyze_result": "Yeni analiz",
|
||||
"reanalyze_insufficient_data": "Öneri üretmek için yeterli veri yok",
|
||||
"data_points": "veri noktası",
|
||||
"dismiss_suggestion": "Yoksay",
|
||||
"confidence_low": "Düşük",
|
||||
"confidence_medium": "Orta",
|
||||
"confidence_high": "Yüksek",
|
||||
"recommended": "önerilen",
|
||||
"seasonal_awareness": "Mevsimsel Farkındalık",
|
||||
"edit_seasonal_overrides": "Mevsimsel faktörleri düzenle",
|
||||
"seasonal_overrides_title": "Mevsimsel faktörler (elle ayar)",
|
||||
"seasonal_overrides_hint": "Ay başına faktör (0.1–5.0). Boş = otomatik öğrenilir.",
|
||||
"seasonal_override_invalid": "Geçersiz değer",
|
||||
"seasonal_override_range": "Faktör 0.1 ile 5.0 arasında olmalıdır",
|
||||
"clear_all": "Tümünü temizle",
|
||||
"seasonal_chart_title": "Mevsimsel Faktörler",
|
||||
"seasonal_learned": "Öğrenilmiş",
|
||||
"seasonal_manual": "Manuel",
|
||||
"month_jan": "Oca",
|
||||
"month_feb": "Şub",
|
||||
"month_mar": "Mar",
|
||||
"month_apr": "Nis",
|
||||
"month_may": "May",
|
||||
"month_jun": "Haz",
|
||||
"month_jul": "Tem",
|
||||
"month_aug": "Ağu",
|
||||
"month_sep": "Eyl",
|
||||
"month_oct": "Eki",
|
||||
"month_nov": "Kas",
|
||||
"month_dec": "Ara",
|
||||
"sensor_prediction": "Sensör Tahmini",
|
||||
"degradation_trend": "Eğilim",
|
||||
"trend_rising": "Yükseliyor",
|
||||
"trend_falling": "Düşüyor",
|
||||
"trend_stable": "Sabit",
|
||||
"trend_insufficient_data": "Yetersiz veri",
|
||||
"days_until_threshold": "Eşiğe kalan gün",
|
||||
"threshold_exceeded": "Eşik aşıldı",
|
||||
"environmental_adjustment": "Çevresel faktör",
|
||||
"sensor_prediction_urgency": "Sensör, eşiğe ~{days} gün kaldığını öngörüyor",
|
||||
"day_short": "gün",
|
||||
"weibull_reliability_curve": "Güvenilirlik Eğrisi",
|
||||
"weibull_failure_probability": "Arıza Olasılığı",
|
||||
"weibull_r_squared": "Uyum R²",
|
||||
"beta_early_failures": "Erken Arızalar",
|
||||
"beta_random_failures": "Rastgele Arızalar",
|
||||
"beta_wear_out": "Aşınma",
|
||||
"beta_highly_predictable": "Yüksek Öngörülebilirlik",
|
||||
"confidence_interval": "Güven Aralığı",
|
||||
"confidence_conservative": "Temkinli",
|
||||
"confidence_aggressive": "İyimser",
|
||||
"current_interval_marker": "Mevcut aralık",
|
||||
"recommended_marker": "Önerilen",
|
||||
"characteristic_life": "Karakteristik ömür",
|
||||
"chart_mini_sparkline": "Eğilim mini grafiği",
|
||||
"chart_history": "Maliyet ve süre geçmişi",
|
||||
"chart_seasonal": "Mevsimsel faktörler, 12 ay",
|
||||
"chart_weibull": "Weibull güvenilirlik eğrisi",
|
||||
"chart_sparkline": "Sensör tetikleme değeri grafiği",
|
||||
"days_progress": "Gün ilerlemesi",
|
||||
"qr_code": "QR Kodu",
|
||||
"qr_generating": "QR kodu oluşturuluyor…",
|
||||
"qr_error": "QR kodu oluşturulamadı.",
|
||||
"qr_error_no_url": "Yapılandırılmış bir HA URL'si yok. Lütfen Ayarlar → Sistem → Ağ bölümünden bir dış veya iç URL ayarlayın.",
|
||||
"save_error": "Kaydedilemedi. Lütfen tekrar deneyin.",
|
||||
"qr_print": "Yazdır",
|
||||
"qr_download": "SVG indir",
|
||||
"qr_action": "Tarama eylemi",
|
||||
"qr_action_view": "Bakım bilgisini görüntüle",
|
||||
"qr_action_complete": "Bakımı tamamlandı olarak işaretle",
|
||||
"qr_url_mode": "Bağlantı türü",
|
||||
"qr_mode_companion": "Companion uygulaması",
|
||||
"qr_mode_local": "Yerel (mDNS)",
|
||||
"qr_mode_server": "Sunucu URL'si",
|
||||
"overview": "Genel Bakış",
|
||||
"analysis": "Analiz",
|
||||
"recent_activities": "Son Etkinlikler",
|
||||
"search_notes": "Notlarda ara",
|
||||
"avg_cost": "Ort. Maliyet",
|
||||
"no_advanced_features": "Etkin gelişmiş özellik yok",
|
||||
"no_advanced_features_hint": "Burada analiz verilerini görmek için entegrasyon ayarlarından “Uyarlanabilir Aralıklar” veya “Mevsimsel Desenler” özelliğini etkinleştirin.",
|
||||
"analysis_not_enough_data": "Analiz için henüz yeterli veri yok.",
|
||||
"analysis_not_enough_data_hint": "Weibull analizi en az 5 tamamlanmış bakım gerektirir; mevsimsel desenler ay başına 6+ veri noktasından sonra görünür olur.",
|
||||
"analysis_manual_task_hint": "Aralığı olmayan manuel görevler analiz verisi üretmez.",
|
||||
"completions": "tamamlama",
|
||||
"current": "Mevcut",
|
||||
"shorter": "Daha kısa",
|
||||
"longer": "Daha uzun",
|
||||
"normal": "Normal",
|
||||
"disabled": "Devre dışı",
|
||||
"compound_logic": "Bileşik mantık",
|
||||
"compound": "Bileşik (birden fazla koşul)",
|
||||
"compound_logic_and": "VE — tüm koşullar tetiklenmeli",
|
||||
"compound_logic_or": "VEYA — herhangi bir koşul tetikler",
|
||||
"compound_help": "Birden fazla sensör koşulunu tek bir tetikleyicide birleştirin.",
|
||||
"compound_no_conditions": "Henüz koşul yok — en az bir tane ekleyin.",
|
||||
"compound_add_condition": "Koşul ekle",
|
||||
"compound_condition": "Koşul",
|
||||
"compound_remove_condition": "Koşulu kaldır",
|
||||
"card_title": "Başlık",
|
||||
"card_show_header": "İstatistikli başlığı göster",
|
||||
"card_show_actions": "Eylem düğmelerini göster",
|
||||
"card_compact": "Kompakt mod",
|
||||
"card_max_items": "En fazla öğe (0 = tümü)",
|
||||
"card_filter_status": "Duruma göre filtrele",
|
||||
"card_filter_status_help": "Boş = tüm durumları göster.",
|
||||
"card_filter_objects": "Nesnelere göre filtrele",
|
||||
"card_filter_objects_help": "Boş = tüm nesneleri göster.",
|
||||
"card_filter_entities": "Varlıklara göre filtrele (entity_id)",
|
||||
"card_filter_entities_help": "Bu entegrasyonun sensor / binary_sensor varlıklarını seçin. Boş = tümü.",
|
||||
"card_loading_objects": "Nesneler yükleniyor…",
|
||||
"card_load_error": "Nesneler yüklenemedi — WebSocket bağlantısını kontrol edin.",
|
||||
"card_no_tasks_title": "Henüz bakım görevi yok",
|
||||
"card_no_tasks_cta": "→ Bakım panelinde bir tane oluşturun",
|
||||
"no_objects": "Henüz nesne yok.",
|
||||
"action_error": "Eylem başarısız oldu. Lütfen tekrar deneyin.",
|
||||
"area_id_optional": "Alan (isteğe bağlı)",
|
||||
"installation_date_optional": "Kurulum tarihi (isteğe bağlı)",
|
||||
"warranty_expiry_optional": "Garanti bitişi (isteğe bağlı)",
|
||||
"warranty": "Garanti",
|
||||
"warranty_valid_until": "{date} tarihine kadar geçerli",
|
||||
"warranty_expires_in": "{days} gün içinde sona eriyor",
|
||||
"warranty_expired": "süresi doldu",
|
||||
"cal_past_windows": "Geçmiş dönemler",
|
||||
"cal_forward_windows": "Gelecek dönemler",
|
||||
"history_edit_title": "Geçmiş kaydını düzenle",
|
||||
"history_edit_timestamp": "Zaman damgası",
|
||||
"manufacturer": "Üretici",
|
||||
"model": "Model",
|
||||
"area": "Alan",
|
||||
"actions": "Eylemler",
|
||||
"view_mode_label": "Görünüm",
|
||||
"view_cards": "Kart görünümü",
|
||||
"view_table": "Tablo görünümü",
|
||||
"objects_table_columns_label": "Nesne tablosu sütunları",
|
||||
"objects_table_columns_hint": "Nesne tablosu görünümünde hangi sütunların görüneceğini seçin.",
|
||||
"custom_icon_optional": "Simge (isteğe bağlı, örn. mdi:wrench)",
|
||||
"task_enabled": "Görev etkin",
|
||||
"skip_reason_prompt": "Bu görev atlansın mı?",
|
||||
"reason_optional": "Neden (isteğe bağlı)",
|
||||
"reset_date_prompt": "Görev yapıldı olarak işaretlensin mi?",
|
||||
"reset_date_optional": "Son yapılma tarihi (isteğe bağlı, varsayılan bugün)",
|
||||
"notes_label": "Notlar",
|
||||
"documentation_label": "Dokümantasyon",
|
||||
"no_nfc_tag": "— Etiket yok —",
|
||||
"dashboard": "Gösterge Paneli",
|
||||
"tab_today": "Bugün",
|
||||
"palette_placeholder": "Nesne ve görevlerde ara…",
|
||||
"palette_no_results": "Eşleşme yok",
|
||||
"palette_hint": "↑↓ gezinme · Enter açma · Esc kapatma",
|
||||
"today_all_caught_up": "Her şey tamam! Bu hafta vadesi gelen yok.",
|
||||
"today_overdue": "Gecikmiş",
|
||||
"today_due_today": "Bugün vadeli",
|
||||
"today_this_week": "Bu hafta",
|
||||
"settings": "Ayarlar",
|
||||
"settings_features": "Gelişmiş Özellikler",
|
||||
"settings_features_desc": "Gelişmiş özellikleri etkinleştirin veya devre dışı bırakın. Devre dışı bırakmak onları arayüzden gizler ancak verileri silmez.",
|
||||
"feat_adaptive": "Uyarlanabilir Zamanlama",
|
||||
"feat_adaptive_desc": "Bakım geçmişinden en uygun aralıkları öğren",
|
||||
"feat_predictions": "Sensör Tahminleri",
|
||||
"feat_predictions_desc": "Sensör bozulmasından tetiklenme tarihlerini öngör",
|
||||
"feat_seasonal": "Mevsimsel Ayarlamalar",
|
||||
"feat_seasonal_desc": "Aralıkları mevsimsel desenlere göre ayarla",
|
||||
"feat_environmental": "Çevresel Korelasyon",
|
||||
"feat_environmental_desc": "Aralıkları sıcaklık/nemle ilişkilendir",
|
||||
"feat_budget": "Bütçe Takibi",
|
||||
"feat_budget_desc": "Aylık ve yıllık bakım harcamalarını takip et",
|
||||
"feat_groups": "Görev Grupları",
|
||||
"feat_groups_desc": "Görevleri mantıksal gruplar halinde düzenle",
|
||||
"feat_checklists": "Kontrol Listeleri",
|
||||
"feat_checklists_desc": "Görev tamamlama için çok adımlı prosedürler",
|
||||
"settings_general": "Genel",
|
||||
"settings_default_warning": "Varsayılan uyarı günleri",
|
||||
"settings_panel_enabled": "Kenar çubuğu paneli",
|
||||
"settings_panel_title": "Kenar çubuğu paneli başlığı",
|
||||
"settings_notifications": "Bildirimler",
|
||||
"settings_notify_service": "Bildirim servisi",
|
||||
"test_notification": "Test bildirimi",
|
||||
"send_test": "Test gönder",
|
||||
"testing": "Gönderiliyor…",
|
||||
"test_notification_success": "Test bildirimi gönderildi",
|
||||
"test_notification_failed": "Test bildirimi başarısız oldu",
|
||||
"settings_notify_due_soon": "Vade yaklaştığında bildir",
|
||||
"settings_notify_overdue": "Geciktiğinde bildir",
|
||||
"settings_notify_triggered": "Tetiklendiğinde bildir",
|
||||
"settings_interval_hours": "Tekrar aralığı (saat, 0 = bir kez)",
|
||||
"settings_quiet_hours": "Sessiz saatler",
|
||||
"settings_quiet_start": "Başlangıç",
|
||||
"settings_quiet_end": "Bitiş",
|
||||
"settings_max_per_day": "Günlük en fazla bildirim (0 = sınırsız)",
|
||||
"settings_bundling": "Bildirimleri grupla",
|
||||
"settings_bundle_threshold": "Gruplama eşiği",
|
||||
"settings_reminder_leads": "Ek hatırlatmalar (vadeden gün önce)",
|
||||
"settings_reminder_leads_hint": "Virgülle ayrılmış süreler, örn. 14, 3, 0 — eşleşen her günde bir ek hatırlatma gönderilir. Boş = kapalı.",
|
||||
"settings_actions": "Mobil Eylem Düğmeleri",
|
||||
"settings_action_complete": "'Tamamla' düğmesini göster",
|
||||
"settings_action_skip": "'Atla' düğmesini göster",
|
||||
"settings_action_snooze": "'Ertele' düğmesini göster",
|
||||
"settings_weekly_digest": "Haftalık özet",
|
||||
"settings_weekly_digest_hint": "Vadesi gelen görevler olduğunda pazartesi sabahı tek bir özet bildirimi.",
|
||||
"settings_warranty_reminder": "Garanti bitiş hatırlatması",
|
||||
"settings_warranty_reminder_days": "Bitişten gün önce",
|
||||
"settings_warranty_reminder_hint": "Bir nesnenin garantisinin bitmesine bu kadar gün kaldığında bir kez bildir.",
|
||||
"settings_snooze_hours": "Erteleme süresi (saat)",
|
||||
"settings_budget": "Bütçe",
|
||||
"settings_currency": "Para birimi",
|
||||
"settings_budget_monthly": "Aylık bütçe",
|
||||
"settings_budget_yearly": "Yıllık bütçe",
|
||||
"settings_budget_alerts": "Bütçe uyarıları",
|
||||
"settings_budget_threshold": "Uyarı eşiği (%)",
|
||||
"settings_import_export": "İçe / Dışa Aktarma",
|
||||
"settings_export_json": "JSON dışa aktar",
|
||||
"settings_export_yaml": "YAML dışa aktar",
|
||||
"settings_export_csv": "CSV dışa aktar",
|
||||
"settings_import_csv": "CSV içe aktar",
|
||||
"settings_import_placeholder": "JSON veya CSV içeriğini buraya yapıştırın…",
|
||||
"settings_import_btn": "İçe aktar",
|
||||
"settings_import_success": "{count} nesne başarıyla içe aktarıldı.",
|
||||
"settings_export_success": "Dışa aktarma indirildi.",
|
||||
"settings_saved": "Ayar kaydedildi.",
|
||||
"settings_include_history": "Geçmişi dahil et",
|
||||
"settings_export_selection": "Seçili nesnelerle sınırla (isteğe bağlı)",
|
||||
"settings_docs_archive": "Belge arşivi (dosyalarla birlikte)",
|
||||
"settings_docs_archive_hint": "JSON/YAML/CSV dışa aktarmaları yalnızca ayarları içerir. Bu ZIP, geri yüklemenin eksiksiz olması için yüklenen dosya içeriklerini de kapsar.",
|
||||
"settings_docs_export_btn": "Belge ZIP'ini indir",
|
||||
"settings_docs_import_btn": "Belge ZIP'ini geri yükle",
|
||||
"settings_docs_import_success": "Geri yüklendi: {blobs} dosya, {docs} belge",
|
||||
"sort_alphabetical": "Alfabetik",
|
||||
"sort_due_soonest": "En yakın vade",
|
||||
"sort_task_count": "Görev sayısı",
|
||||
"sort_area": "Alan",
|
||||
"sort_assigned_user": "Atanan kullanıcı",
|
||||
"sort_group": "Grup",
|
||||
"groupby_none": "Gruplama yok",
|
||||
"groupby_area": "Alana göre",
|
||||
"groupby_group": "Gruba göre",
|
||||
"groupby_user": "Kullanıcıya göre",
|
||||
"filter_label": "Filtre",
|
||||
"user_label": "Kullanıcı",
|
||||
"sort_label": "Sırala",
|
||||
"group_by_label": "Grupla",
|
||||
"state_value_help": "HA durum değerini kullanın (genellikle küçük harf, örn. \"on\"/\"off\"). Büyük/küçük harf kaydederken normalleştirilir.",
|
||||
"target_changes_help": "Tetikleyici çalışmadan önceki eşleşen geçiş sayısı (varsayılan: 1).",
|
||||
"qr_print_title": "QR kodlarını yazdır",
|
||||
"qr_print_desc": "Kesip ekipmanınıza yapıştırmak için yazdırılabilir bir QR kodu sayfası oluşturun.",
|
||||
"qr_print_load": "Nesneleri yükle",
|
||||
"qr_print_filter": "Filtre",
|
||||
"qr_print_objects": "Nesneler",
|
||||
"qr_print_actions": "Eylemler",
|
||||
"qr_print_url_mode": "Bağlantı türü",
|
||||
"qr_print_estimate": "Tahmini QR kodu sayısı",
|
||||
"qr_print_over_limit": "üst sınır 200, filtreyi daraltın",
|
||||
"qr_print_generate": "QR kodları oluştur",
|
||||
"qr_print_generating": "Oluşturuluyor…",
|
||||
"qr_print_ready": "QR kodları hazır",
|
||||
"qr_print_print_button": "Yazdır",
|
||||
"qr_print_empty": "Oluşturulacak bir şey yok",
|
||||
"qr_action_skip": "Atla",
|
||||
"vacation_title": "Tatil modu",
|
||||
"vacation_active": "etkin",
|
||||
"vacation_ended": "sona erdi",
|
||||
"vacation_desc": "Bir tatil planlayın: bildirimler bu dönem artı tampon günler boyunca duraklatılır. Belirli görevleri yine de bildirime dahil edebilirsiniz.",
|
||||
"vacation_enable": "Tatil modunu etkinleştir",
|
||||
"vacation_start": "Başlangıç",
|
||||
"vacation_end": "Bitiş",
|
||||
"vacation_buffer": "Tampon (gün)",
|
||||
"vacation_exempt_title": "Tatilde yine de bildir",
|
||||
"vacation_exempt_desc": "Tatil sırasında yine de bildirim göndermesi gereken görevleri seçin (örn. kritik havuz kimyası).",
|
||||
"vacation_load_tasks": "Görevleri yükle",
|
||||
"vacation_preview_btn": "Önizlemeyi göster",
|
||||
"vacation_preview_affected": "görev etkileniyor",
|
||||
"vacation_event_due_soon": "vadesi yaklaşacak",
|
||||
"vacation_event_overdue": "gecikecek",
|
||||
"vacation_event_triggered_est": "sensör tetiklemesi olası",
|
||||
"vacation_sensor_based": "(sensöre dayalı)",
|
||||
"vacation_action_notify": "Yine de bildir",
|
||||
"vacation_action_unsilence": "Yeniden sustur",
|
||||
"vacation_marked_complete": "Tamamlandı olarak işaretlendi",
|
||||
"vacation_marked_skip": "Atlandı",
|
||||
"vacation_end_now": "Tatili şimdi bitir",
|
||||
"add": "Ekle",
|
||||
"show_stats": "İstatistik + grafikleri göster",
|
||||
"hide_stats": "İstatistikleri gizle",
|
||||
"adaptive_no_data": "Uyarlanabilir analiz için henüz yeterli tamamlama geçmişi yok. Aralık önerilerini ve güvenilirlik grafiklerini açmak için bu görevi birkaç kez daha tamamlayın.",
|
||||
"suggestion_applied": "Önerilen aralık uygulandı",
|
||||
"vacation_mode": "Tatil modu",
|
||||
"vacation_status_active": "Şu an etkin",
|
||||
"vacation_status_scheduled": "Planlandı",
|
||||
"vacation_status_inactive": "Devre dışı",
|
||||
"vacation_end_now_confirm": "Tatil hemen bitirilsin mi?",
|
||||
"vacation_exempt_count": "muaf",
|
||||
"vacation_advanced": "Gelişmiş…",
|
||||
"vacation_open_panel": "Panelde aç",
|
||||
"enable": "Etkinleştir",
|
||||
"saved": "Kaydedildi",
|
||||
"budget_monthly_set": "Aylık ayarla",
|
||||
"budget_yearly_set": "Yıllık ayarla",
|
||||
"budget_advanced": "Para birimi, uyarılar…",
|
||||
"budget_open_panel": "Panelde aç",
|
||||
"groups_empty": "Henüz grup yok.",
|
||||
"group_new_placeholder": "Grup ekle…",
|
||||
"group_delete_confirm": "\"{name}\" grubu silinsin mi?",
|
||||
"groups_manage_tasks": "Görev atamalarını yönet…",
|
||||
"groups_open_panel": "Panelde aç",
|
||||
"unassigned": "Atanmamış",
|
||||
"no_area": "Alan yok",
|
||||
"has_overdue": "Gecikmiş görevi var",
|
||||
"object": "Nesne",
|
||||
"settings_panel_access": "Panel erişimi",
|
||||
"settings_panel_access_desc": "Yöneticiler her zaman tam erişime sahiptir. Oluşturma, düzenleme ve silmeyi belirli yönetici olmayan kullanıcılara devretmek için bunu açın ve onları aşağıdan seçin — diğer herkes yalnızca Tamamla ve Atla görür.",
|
||||
"settings_operator_write": "Seçili kullanıcılara oluşturma, düzenleme ve silme izni ver",
|
||||
"settings_operator_write_desc": "Kapalı: içeriği yalnızca yöneticiler değiştirebilir. Açık: aşağıda seçilen kullanıcılar da tam erişim alır.",
|
||||
"no_non_admin_users": "Yönetici olmayan kullanıcı bulunamadı. Ayarlar → Kişiler bölümünden ekleyin.",
|
||||
"owner_label": "Sahip",
|
||||
"feat_completion_actions": "Tamamlama eylemleri",
|
||||
"feat_completion_actions_desc": "Görev başına tamamlamada HA eylemi + önceden ayarlı değerlerle hızlı tamamlama QR'ı.",
|
||||
"on_complete_action_title": "Tamamlandığında: HA eylemi tetikle (isteğe bağlı)",
|
||||
"on_complete_action_desc": "Görev tamamlandığında bir HA servisi çağırır — örn. cihazdaki bir sayacı sıfırlar.",
|
||||
"on_complete_action_service": "Servis",
|
||||
"on_complete_action_target": "Hedef varlık",
|
||||
"on_complete_action_target_hint": "Not: varlık alan adı servisle eşleşmelidir — örn. 'button.press' yalnızca button.* üzerinde, 'counter.increment' yalnızca counter.* üzerinde, 'input_button.press' yalnızca input_button.* üzerinde çalışır. Eşleşmezse eylem sessizce başarısız olur (HA günlüğü: 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Veri (JSON, isteğe bağlı)",
|
||||
"on_complete_action_test": "Yapılandırmayı doğrula",
|
||||
"on_complete_action_test_success": "✓ Yapılandırma geçerli (eylem yalnızca görev tamamlandığında çalışır)",
|
||||
"on_complete_action_test_failed": "Başarısız",
|
||||
"quick_complete_defaults_title": "Hızlı tamamlama varsayılanları (QR taramaları için, isteğe bağlı)",
|
||||
"quick_complete_defaults_desc": "Hızlı tamamlama QR taramaları için önceden ayarlı değerler. Bunlar olmadan QR, tamamlama penceresini açar.",
|
||||
"quick_complete_defaults_notes": "Notlar",
|
||||
"quick_complete_defaults_cost": "Maliyet",
|
||||
"quick_complete_defaults_duration": "Süre (dakika)",
|
||||
"quick_complete_defaults_feedback_none": "Geri bildirim yok",
|
||||
"quick_complete_defaults_feedback_needed": "Gerekliydi",
|
||||
"quick_complete_defaults_feedback_not_needed": "Gerekli değildi",
|
||||
"quick_complete_success": "Hızlıca tamamlandı olarak işaretlendi",
|
||||
"show_all_objects": "Tüm nesneleri göster",
|
||||
"show_all_tasks": "Filtreyi temizle — tüm görevleri göster",
|
||||
"filter_to_overdue": "Görev listesini yalnızca gecikmişlere filtrele",
|
||||
"filter_to_due_soon": "Görev listesini yalnızca vadesi yaklaşanlara filtrele",
|
||||
"filter_to_triggered": "Görev listesini yalnızca tetiklenenlere filtrele",
|
||||
"open_task": "Görevi aç",
|
||||
"show_details": "Geçmiş + istatistikleri göster",
|
||||
"hide_details": "Ayrıntıları gizle",
|
||||
"history_empty": "Henüz geçmiş yok.",
|
||||
"history_edit_button": "Kaydı düzenle",
|
||||
"total_cost": "Toplam maliyet",
|
||||
"times_performed": "Yapılma sayısı",
|
||||
"older_entries": "daha eski",
|
||||
"open_in_panel": "Bakım panelinde aç",
|
||||
"skip_reason": "Atlama nedeni (isteğe bağlı)",
|
||||
"reset_to_date": "Son yapılmayı şu tarihe sıfırla",
|
||||
"delete_task_confirm": "Bu görev ve geçmişi silinsin mi?",
|
||||
"delete_object_confirm": "Bu nesne ve tüm görevleri silinsin mi?",
|
||||
"loading": "Yükleniyor…",
|
||||
"archive": "Arşivle",
|
||||
"undo": "Geri al",
|
||||
"task_archived": "Görev arşivlendi",
|
||||
"object_archived": "Nesne arşivlendi",
|
||||
"unarchive": "Arşivden çıkar",
|
||||
"archived": "Arşivlendi",
|
||||
"show_archived": "Arşivlenenleri göster",
|
||||
"hide_archived": "Arşivlenenleri gizle",
|
||||
"confirm_archive_object": "Bu nesne ve görevleri arşivlensin mi? Geçmişleri korunur ve daha sonra arşivden çıkarılabilirler.",
|
||||
"settings_archive": "Arşiv ve Saklama",
|
||||
"settings_archive_desc": "Tamamlanmış tek seferlik görevleri silmeden emekliye ayırın. Arşivlenen öğeler gizlenir ve pasiftir ancak geçmişlerini ve maliyetlerini korurlar.",
|
||||
"settings_archive_oneoff_days": "Tamamlanan tek seferlik görevleri şu kadar gün sonra otomatik arşivle (0 = kapalı)",
|
||||
"settings_delete_archived_oneoff_days": "Arşivlenen tek seferlik görevleri şu kadar gün sonra otomatik sil (0 = asla)",
|
||||
"archive_object": "Nesneyi arşivle",
|
||||
"unarchive_object": "Nesneyi arşivden çıkar",
|
||||
"documents": "Belgeler",
|
||||
"documents_empty": "Henüz belge yok.",
|
||||
"doc_upload": "Dosya yükle",
|
||||
"doc_uploading": "Yükleniyor…",
|
||||
"doc_add_link": "Bağlantı ekle",
|
||||
"doc_link_url": "URL (https://…)",
|
||||
"doc_link_title": "Başlık (isteğe bağlı)",
|
||||
"doc_open": "Aç",
|
||||
"doc_delete_confirm": "\"{name}\" silinsin mi?",
|
||||
"doc_too_large": "Dosya çok büyük (en fazla 25 MB).",
|
||||
"doc_upload_failed": "Yükleme başarısız oldu.",
|
||||
"completion_photo_optional": "Tamamlama fotoğrafı (isteğe bağlı)",
|
||||
"add_photo": "Fotoğraf ekle",
|
||||
"uploading": "Yükleniyor…",
|
||||
"remove": "Kaldır",
|
||||
"doc_deduped": "Zaten başka bir yerde saklı — paylaşıldı, ek alan kullanılmadı.",
|
||||
"doc_dup_in_object": "Bu dosya zaten bu nesneye ekli.",
|
||||
"doc_link_invalid": "Yalnızca http/https bağlantılarına izin verilir.",
|
||||
"doc_cat_manual": "Kılavuz",
|
||||
"doc_cat_warranty": "Garanti",
|
||||
"doc_cat_invoice": "Fatura",
|
||||
"doc_cat_spare_parts": "Yedek parçalar",
|
||||
"doc_cat_photo": "Fotoğraf",
|
||||
"doc_cat_other": "Diğer",
|
||||
"doc_link_badge": "Bağlantı",
|
||||
"doc_storage_title": "Belge depolama",
|
||||
"doc_storage_saved": "Tekilleştirmeyle kazanıldı",
|
||||
"doc_storage_refresh": "Yenile",
|
||||
"doc_download": "İndir",
|
||||
"doc_close": "Kapat",
|
||||
"doc_camera": "Fotoğraf çek",
|
||||
"doc_drop_hint": "Dosyaları buraya bırakın",
|
||||
"doc_task_none": "Bu göreve bağlı belge yok.",
|
||||
"doc_link_existing": "Belge bağla…",
|
||||
"doc_attach": "Bağla",
|
||||
"doc_unlink": "Bağlantıyı kaldır",
|
||||
"doc_page": "Sayfa",
|
||||
"chart_range_7d": "7g",
|
||||
"chart_range_30d": "30g",
|
||||
"chart_range_90d": "90g",
|
||||
"chart_range_1y": "1y",
|
||||
"chart_since_service": "son servisten beri",
|
||||
"chart_no_stats": "Bu varlık için uzun dönem istatistiği yok — yalnızca bakım olayı değerleri gösteriliyor",
|
||||
"auto_complete_on_recovery": "Sensör düzelince otomatik tamamla",
|
||||
"auto_complete_on_recovery_help": "Tetikleyici kendiliğinden temizlendiğinde bir tamamlama kaydeder (son yapılmayı ayarlar) — örn. tuz dolduruldu, filtre değiştirildi.",
|
||||
"doc_search": "Belgelerde ara…",
|
||||
"doc_search_none": "Eşleşen belge yok",
|
||||
"link_device_optional": "Mevcut bir cihaza bağla (isteğe bağlı)",
|
||||
"parent_object_optional": "Üst nesne (isteğe bağlı)",
|
||||
"parent_none": "(Üst nesne yok)",
|
||||
"paused": "Duraklatıldı",
|
||||
"pause_object": "Duraklat",
|
||||
"resume_object": "Devam ettir",
|
||||
"pause_until_prompt": "Bu nesnenin zamanlamalarını dondurur — devam ettirilene kadar hiçbir şeyin vadesi gelmez ve bildirim gönderilmez. İsteğe bağlı olarak bir otomatik devam tarihi ayarlayın.",
|
||||
"pause_until_label": "Devam tarihi (isteğe bağlı)",
|
||||
"object_paused": "Nesne duraklatıldı",
|
||||
"object_resumed": "Nesne devam ettirildi — zamanlamalar yeniden başlatıldı",
|
||||
"object_paused_badge": "Duraklatıldı",
|
||||
"paused_until_label": "şu tarihe kadar",
|
||||
"replace_object": "Değiştir…",
|
||||
"replace_object_prompt": "Bu nesneyi emekliye ayırın ve bir halef oluşturun. Geçmiş ve maliyetler eski nesnede arşivli kalır; görevler ve belgeler yenisine taşınır, sayaçlar sıfırdan başlar.",
|
||||
"replace_name_label": "Yeni nesne adı",
|
||||
"object_replaced": "Nesne değiştirildi — halefi oluşturuldu",
|
||||
"reading_unit_label": "Okuma birimi (örn. kWh, m³)",
|
||||
"reading_unit_help": "Bu görevi tamamlarken kaydedilen değerin yanında gösterilir.",
|
||||
"reading_value_label": "Okuma değeri",
|
||||
"reading_label": "Okuma",
|
||||
"settings_templates_label": "Şablon galerisi",
|
||||
"settings_templates_hint": "Asla ihtiyaç duymayacağınız şablonların işaretini kaldırın — \"Şablondan\" seçicilerinden (panel ve yapılandırma akışı) kaybolurlar. Başka hiçbir şey değişmez; istediğiniz zaman yeniden etkinleştirebilirsiniz.",
|
||||
"worksheet": "Çalışma sayfası",
|
||||
"worksheet_scan_view": "Görevi açmak için tarayın",
|
||||
"worksheet_scan_complete": "Tamamlamak için tarayın",
|
||||
"worksheet_manual_excerpt": "Kılavuz alıntısı",
|
||||
"worksheet_pages": "sayfa",
|
||||
"worksheet_printed": "Yazdırıldı",
|
||||
"worksheet_never": "Hiç",
|
||||
"card_all_caught_up": "Her şey tamam — ilgilenilmesi gereken bir şey yok",
|
||||
"postpone": "Ötele",
|
||||
"postpone_date_prompt": "Bu tekrar hangi tarihe ötelensin?",
|
||||
"postpone_date_label": "Yeni vade tarihi",
|
||||
"postponed": "Ötelendi",
|
||||
"postponed_to": "Şu tarihe ötelendi",
|
||||
"season_window_label": "Mevsim penceresi (aylar)",
|
||||
"season_window_hint": "Yalnızca seçili aylarda vadesi gelir; sezon dışı tarihler bir sonraki etkin aya kayar. Hiçbiri = tüm yıl.",
|
||||
"series_end_label": "Bitiş",
|
||||
"series_end_never": "Asla (süresiz tekrar eder)",
|
||||
"series_end_after_count": "Belirli bir sayıdan sonra",
|
||||
"series_end_until": "Bir tarihte",
|
||||
"series_end_count_label": "Tekrar sayısı",
|
||||
"series_end_until_label": "Bitiş tarihi",
|
||||
"parts_section": "Parçalar ve sarf malzemeleri",
|
||||
"part_add": "Parça ekle",
|
||||
"part_name": "Ad",
|
||||
"part_vendor": "Üretici",
|
||||
"part_storage_location": "Saklama yeri",
|
||||
"part_product_url": "Ürün URL'si",
|
||||
"part_unit": "Birim",
|
||||
"part_cost": "Birim fiyat",
|
||||
"part_stock": "Stok",
|
||||
"part_reorder_threshold": "Sipariş eşiği",
|
||||
"part_restock_quantity": "Stok yenileme miktarı",
|
||||
"part_auto_buy": "Azaldığında otomatik satın alma görevi oluştur",
|
||||
"part_restock": "Stoku ayarla",
|
||||
"restock_quantity_label": "Satın alınan miktar",
|
||||
"consumes_parts_label": "Parça tüketir",
|
||||
"parts_load_failed": "Bu nesnenin parçaları yüklenemedi — parça tüketimi seçenekleri şu anda kullanılamıyor.",
|
||||
"adopt_problem_button": "Sorun sensörlerini devral",
|
||||
"adopt_problem_title": "Sorun sensörlerini devral",
|
||||
"adopt_problem_hint": "HA sorun sensörlerini (yazıcı hataları, filtre uyarıları, düşük pil) sorun etkinken tetiklenen ve sorun çözülünce kendini temizleyen bakım görevlerine dönüştürün.",
|
||||
"adopt_problem_none": "Halihazırda takip edilmeyen sorun sensörü bulunamadı.",
|
||||
"adopt_problem_active": "etkin",
|
||||
"adopt_problem_ok": "tamam",
|
||||
"adopt_problem_new_object": "(yeni)",
|
||||
"adopt_problem_adopt": "Seçilenleri devral",
|
||||
"adopt_problem_done": "{tasks} sorun sensörü devralındı",
|
||||
"views_label": "Görünümler",
|
||||
"views_none": "— Görünüm yok —",
|
||||
"views_manage": "Görünümleri kaydet / yönet",
|
||||
"views_dialog_title": "Kayıtlı görünümler",
|
||||
"views_dialog_hint": "Geçerli filtreleri herkesin yeniden kullanabileceği adlandırılmış bir görünüm olarak kaydedin.",
|
||||
"views_name_placeholder": "Görünüm adı",
|
||||
"views_save_current": "Geçerli filtreleri kaydet",
|
||||
"views_none_yet": "Henüz kayıtlı görünüm yok.",
|
||||
"close": "Kapat",
|
||||
"trigger_hint_now": "Sensör şu anda {value} değerini okuyor.",
|
||||
"trigger_hint_above": "Görev, değer {target} üzerine çıktığında tetiklenir.",
|
||||
"trigger_hint_below": "Değer {target} altına düştüğünde tetiklenir.",
|
||||
"trigger_hint_counter_delta": "Mevcut okumadan ({value}) itibaren sayar: {due} değerinde vadesi gelir (+{target}) ve sayım her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_counter_delta_edit": "Son tamamlamadan bu yana kullanımı sayar: +{target} sonrasında vadesi gelir; sayım her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_counter_abs": "Sensör {target} değerine ulaştığında görevin vadesi gelir.",
|
||||
"trigger_hint_runtime": "Görevin vadesi, toplam {hours} saatlik çalışma süresinden sonra gelir; sayaç her tamamlamadan sonra yeniden başlar.",
|
||||
"trigger_hint_state_change": "Görevin vadesi {count} durum değişikliğinden sonra gelir.",
|
||||
"trigger_hint_state_change_to": "Görevin vadesi, “{state}” durumuna {count} geçişten sonra gelir.",
|
||||
"trigger_hint_state_now": "Mevcut durum: {value}.",
|
||||
"adopt_problem_part": "Kullanılan parça: {name}",
|
||||
"label_filter": "Etiket",
|
||||
"all_labels": "Tüm etiketler",
|
||||
"settings_notify_scope": "Yalnızca şu görünüm için bildir",
|
||||
"settings_notify_scope_all": "Tüm görevler",
|
||||
"settings_notify_scope_hint": "Yalnızca seçili kayıtlı görünümün etiket/kullanıcı filtreleriyle eşleşen görevler hatırlatma gönderir. Görünümün durum, sıralama ve gruplaması burada dikkate alınmaz.",
|
||||
"card_saved_view": "Kayıtlı görünüm",
|
||||
"card_saved_view_none": "Yok",
|
||||
"card_saved_view_help": "Görünümün durum, kullanıcı ve etiket filtrelerini yukarıdaki filtrelerin üzerine uygular. Görünümün sıralaması ve gruplaması panel görüntüleme ayarlarıdır ve kartta uygulanmaz.",
|
||||
"doc_part_none": "Bu parçaya bağlı belge yok.",
|
||||
"settings_templates_toggle_group": "Bu gruptaki tüm şablonları etkinleştir veya devre dışı bırak",
|
||||
"setups_button": "Önerilen kurulumlar",
|
||||
"setups_title": "Önerilen kurulumlar (Beta)",
|
||||
"setups_hint": "Sarf malzemesi sensörleri bakım görevlerini yönetebilecek, desteklenen entegrasyonlara ait cihazlar. Devralma, nesneyi oluşturur ve her görevi sensörüne bağlar — sarf malzemesi azalınca tetiklenir ve değişimden sonra kendini çözer.",
|
||||
"setups_none": "Bağlanmamış sarf malzemesi sensörü olan desteklenen cihaz bulunamadı.",
|
||||
"setups_adopt": "Seçilenleri kur",
|
||||
"setups_done": "{tasks} sensöre bağlı görev oluşturuldu.",
|
||||
"complete_parts_used": "Bu sefer kullanılan parçalar",
|
||||
"part_delete_confirm": "'{name}' parçası silinsin mi? Stok takibi, görev bağlantıları ve açık satın alma hatırlatmaları kaldırılacak.",
|
||||
"baseline_start_value": "Başlangıç okuması (isteğe bağlı)",
|
||||
"baseline_start_help": "Sayım bu okumadan başlar. Mevcut değerden saymak için boş bırakın; son servisteki okumayı girerseniz o zamandan beri olan kullanım da sayılır.",
|
||||
"setups_baseline_hint": "son servisteki okuma (isteğe bağlı)",
|
||||
"baseline_start_help_edit": "Mevcut sayımı korumak için boş bırakın. Bir değer girmek sayımı yeniden sabitler (örn. son servisteki okuma).",
|
||||
"baseline_current_effective": "Şu anda geçerli başlangıç değeri: {value}",
|
||||
"runtime_on_states": "Etkin durumlar (virgülle ayrılmış)",
|
||||
"runtime_on_states_help": "Çalışıyor sayılan durumlar — varsayılan: on. Örn. mowing, cleaning, printing. Bir öznitelik seçiliyse onun değerleri eşleştirilir.",
|
||||
"setups_target_new": "Yeni oluştur: {name}",
|
||||
"schedule_preview_title": "Sonraki tarihler",
|
||||
"schedule_preview_ontime": "Zamanında tamamlama varsayılarak.",
|
||||
"schedule_preview_ends": "(seri sona erer)",
|
||||
"adopt_problem_responsible": "Devralınan tüm görevler için sorumlu kullanıcı (isteğe bağlı)",
|
||||
"adopt_problem_configure": "Yapılandır",
|
||||
"history_auto": "Otomatik",
|
||||
"battery_fleet_title": "Pil filosu",
|
||||
"battery_fleet_none_low": "Tüm piller iyi durumda — değiştirilecek bir şey yok.",
|
||||
"battery_fleet_buy_now": "Şimdi satın al",
|
||||
"battery_fleet_soon": "Yakında gerekli",
|
||||
"battery_fleet_soon_hint": "Son değişim tarihinden tahmin edildi — önceden sipariş verin.",
|
||||
"battery_fleet_mark_all": "Tümünü değiştirildi olarak işaretle",
|
||||
"battery_fleet_mark_one": "Bu pili değiştirildi olarak işaretle",
|
||||
"battery_fleet_offline": "çevrimdışı",
|
||||
"battery_fleet_trigger_lost": "Bu görevin sensör tetikleyicisi kayboldu — tetiklenmeyecek ve otomatik tamamlanmayacak.",
|
||||
"battery_fleet_repair": "Onar",
|
||||
"battery_fleet_exclude": "Filodan hariç tut",
|
||||
"battery_fleet_excluded": "Hariç tutuldu",
|
||||
"battery_fleet_include": "Yeniden takip et",
|
||||
"battery_fleet_total": "{n} pil takip ediliyor",
|
||||
"battery_fleet_setup_button": "Pil filosu",
|
||||
"battery_fleet_setup_done": "Pil filosu kuruldu — tek bir görev tüm pillerinizi takip ediyor.",
|
||||
"update_banner": "Sunucuda Maintenance Supporter'ın daha yeni bir sürümü var — paneli güncellemek için sayfayı yeniden yükleyin.",
|
||||
"update_reload": "Yeniden yükle"
|
||||
}
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
import{a as f}from"./chunk-Q7DQUCT7.js";import{a as h,b as o,d as b,e as m,f as g,g as n,h as _,i as a,k as v,s as p}from"./chunk-X7OW5OLQ.js";import{a as i}from"./chunk-PEGRBZWY.js";var s=class extends m{constructor(){super(...arguments);this._config={type:""};this._status=null;this._busy=!1;this._error="";this._localMonthly="";this._localYearly="";this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),v(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/budget_status"});this._status=t,this._localMonthly=t.monthly_budget?String(t.monthly_budget):"",this._localYearly=t.yearly_budget?String(t.yearly_budget):"",this._dirty=!1}catch(t){this._error=p(t,this._lang)}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=parseFloat(this._localMonthly),e=parseFloat(this._localYearly),r={};!isNaN(t)&&t>=0&&(r.budget_monthly=t),!isNaN(e)&&e>=0&&(r.budget_yearly=e),await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/global/update",settings:r}),await this._load()}catch(t){this._error=p(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_budget"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,e=this._status;if(!e)return o`<ha-card><div class="loading">${a("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=e.currency_symbol||_,l=e.monthly_budget?Math.min(100,(e.monthly_spent||0)/e.monthly_budget*100):0,d=e.yearly_budget?Math.min(100,(e.yearly_spent||0)/e.yearly_budget*100):0,u=l>=100?"danger":l>=80?"warning":"ok",y=d>=100?"danger":d>=80?"warning":"ok";return o`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">💰</span>
|
||||
<span>${this._config.title||a("settings_budget",t)||"Budget"}</span>
|
||||
</div>
|
||||
<span class="currency">${r}</span>
|
||||
</div>
|
||||
|
||||
${this._error?o`<div class="error">${this._error}</div>`:b}
|
||||
|
||||
<div class="track">
|
||||
<div class="track-label-row">
|
||||
<label>${a("budget_monthly",t)||"Monthly"}</label>
|
||||
<span class="track-numbers ${u}">
|
||||
${(e.monthly_spent||0).toFixed(0)} / ${(e.monthly_budget||0).toFixed(0)} ${r}
|
||||
</span>
|
||||
</div>
|
||||
<div class="bar"><div class="bar-fill ${u}" style="width:${l}%"></div></div>
|
||||
</div>
|
||||
|
||||
<div class="track">
|
||||
<div class="track-label-row">
|
||||
<label>${a("budget_yearly",t)||"Yearly"}</label>
|
||||
<span class="track-numbers ${y}">
|
||||
${(e.yearly_spent||0).toFixed(0)} / ${(e.yearly_budget||0).toFixed(0)} ${r}
|
||||
</span>
|
||||
</div>
|
||||
<div class="bar"><div class="bar-fill ${y}" style="width:${d}%"></div></div>
|
||||
</div>
|
||||
|
||||
${this._isAdmin?o`
|
||||
<div class="inputs-row">
|
||||
<div class="input-field">
|
||||
<label>${a("budget_monthly_set",t)||"Set monthly"}</label>
|
||||
<div class="input-wrap">
|
||||
<input type="number" min="0" step="1"
|
||||
.value=${this._localMonthly}
|
||||
?disabled=${this._busy}
|
||||
@input=${c=>{this._localMonthly=c.target.value,this._dirty=!0}} />
|
||||
<span class="input-suffix">${r}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<label>${a("budget_yearly_set",t)||"Set yearly"}</label>
|
||||
<div class="input-wrap">
|
||||
<input type="number" min="0" step="1"
|
||||
.value=${this._localYearly}
|
||||
?disabled=${this._busy}
|
||||
@input=${c=>{this._localYearly=c.target.value,this._dirty=!0}} />
|
||||
<span class="input-suffix">${r}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="actions">
|
||||
<button class="btn ${this._dirty?"primary":"muted"}"
|
||||
@click=${this._save}
|
||||
?disabled=${this._busy||!this._dirty}>
|
||||
<ha-icon icon="${this._dirty?"mdi:content-save":"mdi:check"}"></ha-icon>
|
||||
${this._dirty?a("save",t)||"Save":a("saved",t)||"Saved"}
|
||||
</button>
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${a("budget_advanced",t)||"Currency, alerts\u2026"}
|
||||
</button>
|
||||
</div>
|
||||
`:o`
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${a("budget_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};s.styles=[f,h`
|
||||
.currency {
|
||||
font-size: 14px; font-weight: 600;
|
||||
color: var(--secondary-text-color);
|
||||
background: var(--secondary-background-color);
|
||||
padding: 2px 10px; border-radius: 999px;
|
||||
}
|
||||
.track { display: flex; flex-direction: column; gap: 4px; }
|
||||
.track-label-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.track-label-row label {
|
||||
font-size: 12px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.5px;
|
||||
}
|
||||
.track-numbers { font-size: 13px; font-weight: 600; }
|
||||
.track-numbers.ok { color: var(--primary-text-color); }
|
||||
.track-numbers.warning { color: #ff9800; }
|
||||
.track-numbers.danger { color: var(--error-color, #f44336); }
|
||||
.bar {
|
||||
height: 6px; background: var(--secondary-background-color);
|
||||
border-radius: 3px; overflow: hidden;
|
||||
}
|
||||
.bar-fill { height: 100%; transition: width 0.3s; border-radius: 3px; }
|
||||
.bar-fill.ok { background: var(--primary-color); }
|
||||
.bar-fill.warning { background: #ff9800; }
|
||||
.bar-fill.danger { background: var(--error-color, #f44336); }
|
||||
.inputs-row {
|
||||
display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
|
||||
padding-top: 4px; border-top: 1px solid var(--divider-color);
|
||||
}
|
||||
.input-field { display: flex; flex-direction: column; gap: 4px; }
|
||||
.input-field label {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.3px;
|
||||
}
|
||||
.input-wrap { position: relative; display: flex; align-items: center; }
|
||||
.input-wrap input {
|
||||
flex: 1; padding: 6px 32px 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.input-suffix {
|
||||
position: absolute; right: 8px;
|
||||
color: var(--secondary-text-color); font-size: 13px;
|
||||
pointer-events: none;
|
||||
}
|
||||
.actions { display: flex; gap: 8px; align-items: center; }
|
||||
`],i([g({attribute:!1})],s.prototype,"hass",2),i([n()],s.prototype,"_config",2),i([n()],s.prototype,"_status",2),i([n()],s.prototype,"_busy",2),i([n()],s.prototype,"_error",2),i([n()],s.prototype,"_localMonthly",2),i([n()],s.prototype,"_localYearly",2),i([n()],s.prototype,"_dirty",2);customElements.get("maintenance-budget-section-card")||customElements.define("maintenance-budget-section-card",s);window.customCards=window.customCards||[];window.customCards.push({type:"maintenance-budget-section-card",name:"Maintenance Supporter \u2014 Budget",description:"Inline monthly + yearly budget editor",preview:!1});export{s as MaintenanceBudgetSectionCard};
|
||||
@@ -0,0 +1,59 @@
|
||||
import{a as r}from"./chunk-X7OW5OLQ.js";var a=r`
|
||||
ha-card { overflow: hidden; }
|
||||
.card-content {
|
||||
padding: 16px;
|
||||
display: flex; flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
.header {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
gap: 12px;
|
||||
}
|
||||
.title {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
font-size: 16px; font-weight: 500;
|
||||
}
|
||||
.emoji { font-size: 20px; }
|
||||
|
||||
/* Button family — primary action / muted-saved-state / link / icon-with-text */
|
||||
.btn {
|
||||
padding: 6px 12px; font-size: 13px;
|
||||
border-radius: 6px; cursor: pointer;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--secondary-background-color, transparent);
|
||||
color: var(--primary-text-color);
|
||||
font-weight: 500;
|
||||
display: inline-flex; align-items: center; gap: 4px;
|
||||
}
|
||||
.btn:hover { background: var(--state-icon-color, rgba(255,255,255,0.06)); }
|
||||
.btn[disabled] { opacity: 0.5; cursor: not-allowed; }
|
||||
.btn.primary {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, white);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.btn.primary[disabled] { opacity: 0.6; }
|
||||
.btn.muted {
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
border-style: dashed;
|
||||
}
|
||||
.btn.muted[disabled] { opacity: 1; cursor: default; }
|
||||
.btn.muted ha-icon, .btn.primary ha-icon { --mdc-icon-size: 14px; }
|
||||
.btn.link {
|
||||
background: transparent; border: none; padding: 6px 4px;
|
||||
color: var(--primary-color); margin-left: auto;
|
||||
}
|
||||
.btn.link:hover { background: transparent; text-decoration: underline; }
|
||||
|
||||
/* Error + loading states */
|
||||
.error {
|
||||
padding: 8px; border-radius: 6px;
|
||||
background: rgba(211, 47, 47, 0.1);
|
||||
color: var(--error-color, #d32f2f); font-size: 13px;
|
||||
}
|
||||
.loading {
|
||||
padding: 24px; text-align: center;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
`;export{a};
|
||||
File diff suppressed because it is too large.
Load diff
+2374
File diff suppressed because it is too large.
Load diff
+136
@@ -0,0 +1,136 @@
|
||||
import{a as m}from"./chunk-Q7DQUCT7.js";import{a as u,b as s,d as l,e as h,f as g,g as o,i,k as _,s as p}from"./chunk-X7OW5OLQ.js";import{a}from"./chunk-PEGRBZWY.js";var e=class extends h{constructor(){super(...arguments);this._config={type:""};this._groups={};this._loaded=!1;this._busy=!1;this._error="";this._newName="";this._editingId=null;this._editingName="";this._hasInitiallyLoaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._hasInitiallyLoaded&&(this._hasInitiallyLoaded=!0,this._load(),_(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/groups"});this._groups=t.groups||{},this._loaded=!0}catch(t){this._error=p(t,this._lang)}}async _addGroup(){if(!this._isAdmin)return;let t=this._newName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/create",name:t}),this._newName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}_startEdit(t){this._editingId=t,this._editingName=this._groups[t]?.name||""}async _saveEdit(){if(!this._isAdmin||!this._editingId)return;let t=this._editingName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/update",group_id:this._editingId,name:t}),this._editingId=null,this._editingName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}async _deleteGroup(t,r){if(!this._isAdmin)return;let n=(i("group_delete_confirm",this._lang)||'Delete group "{name}"?').replace("{name}",r);if(window.confirm(n)){this._busy=!0;try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/delete",group_id:t}),await this._load()}catch(d){this._error=p(d,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_groups"),window.dispatchEvent(new CustomEvent("location-changed"))}_onKeyDown(t,r){t.key==="Enter"?(t.preventDefault(),r()):t.key==="Escape"&&(t.preventDefault(),this._editingId=null,this._editingName="")}render(){let t=this._lang;if(!this._loaded)return s`<ha-card><div class="loading">${i("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=Object.keys(this._groups);return s`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">🏷️</span>
|
||||
<span>${this._config.title||i("groups",t)||"Groups"}</span>
|
||||
<span class="count">${r.length}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
${this._error?s`<div class="error">${this._error}</div>`:l}
|
||||
|
||||
${r.length===0?s`<div class="empty">${i("groups_empty",t)||"No groups yet."}</div>`:s`
|
||||
<div class="group-list">
|
||||
${r.map(n=>{let d=this._groups[n],v=d.task_refs?.length??0,b=this._editingId===n;return s`
|
||||
<div class="group-row">
|
||||
${b?s`
|
||||
<input class="edit-input" type="text"
|
||||
.value=${this._editingName}
|
||||
?disabled=${this._busy}
|
||||
@input=${c=>{this._editingName=c.target.value}}
|
||||
@keydown=${c=>this._onKeyDown(c,this._saveEdit.bind(this))} />
|
||||
<button class="btn small primary"
|
||||
@click=${this._saveEdit}
|
||||
?disabled=${this._busy||!this._editingName.trim()}>
|
||||
${i("save",t)||"Save"}
|
||||
</button>
|
||||
<button class="btn small"
|
||||
@click=${()=>{this._editingId=null}}>
|
||||
${i("cancel",t)||"Cancel"}
|
||||
</button>
|
||||
`:s`
|
||||
<span class="group-name">${d.name||"Unnamed"}</span>
|
||||
<span class="task-count">${v}</span>
|
||||
${this._isAdmin?s`
|
||||
<button class="icon-btn"
|
||||
title="${i("edit",t)||"Edit"}"
|
||||
@click=${()=>this._startEdit(n)}
|
||||
?disabled=${this._busy}>
|
||||
<ha-icon icon="mdi:pencil"></ha-icon>
|
||||
</button>
|
||||
<button class="icon-btn danger"
|
||||
title="${i("delete",t)||"Delete"}"
|
||||
@click=${()=>this._deleteGroup(n,d.name||"Unnamed")}
|
||||
?disabled=${this._busy}>
|
||||
<ha-icon icon="mdi:delete"></ha-icon>
|
||||
</button>
|
||||
`:l}
|
||||
`}
|
||||
</div>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${this._isAdmin?s`
|
||||
<div class="add-row">
|
||||
<input type="text"
|
||||
placeholder="${i("group_new_placeholder",t)||"Add group\u2026"}"
|
||||
.value=${this._newName}
|
||||
?disabled=${this._busy}
|
||||
@input=${n=>{this._newName=n.target.value}}
|
||||
@keydown=${n=>this._onKeyDown(n,this._addGroup.bind(this))} />
|
||||
<button class="btn primary"
|
||||
@click=${this._addGroup}
|
||||
?disabled=${this._busy||!this._newName.trim()}>
|
||||
<ha-icon icon="mdi:plus"></ha-icon>
|
||||
${i("add",t)||"Add"}
|
||||
</button>
|
||||
</div>
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${i("groups_manage_tasks",t)||"Manage task assignments\u2026"}
|
||||
</button>
|
||||
`:s`
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${i("groups_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};e.styles=[m,u`
|
||||
.count {
|
||||
font-size: 12px; color: var(--secondary-text-color);
|
||||
background: var(--secondary-background-color);
|
||||
padding: 2px 8px; border-radius: 999px;
|
||||
}
|
||||
.empty {
|
||||
padding: 16px; text-align: center;
|
||||
color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.group-list { display: flex; flex-direction: column; gap: 4px; }
|
||||
.group-row {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
padding: 6px 8px; border-radius: 6px;
|
||||
background: var(--secondary-background-color, rgba(255,255,255,0.03));
|
||||
}
|
||||
.group-name { flex: 1; font-size: 14px; }
|
||||
.task-count {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
background: var(--card-background-color, rgba(0,0,0,0.2));
|
||||
padding: 1px 8px; border-radius: 999px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.edit-input {
|
||||
flex: 1; padding: 4px 8px; font-size: 14px;
|
||||
background: var(--card-background-color, #1c1c1c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--primary-color); border-radius: 4px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.icon-btn {
|
||||
background: transparent; border: none; cursor: pointer;
|
||||
color: var(--secondary-text-color); padding: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.icon-btn:hover {
|
||||
background: var(--state-icon-color, rgba(255,255,255,0.06));
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
.icon-btn.danger:hover { color: var(--error-color); }
|
||||
.icon-btn ha-icon { --mdc-icon-size: 18px; }
|
||||
.add-row {
|
||||
display: flex; gap: 6px;
|
||||
padding-top: 8px; border-top: 1px solid var(--divider-color);
|
||||
}
|
||||
.add-row input {
|
||||
flex: 1; padding: 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
/* Card-specific overrides on the shared .btn */
|
||||
.btn.small { padding: 4px 8px; font-size: 12px; }
|
||||
.btn ha-icon { --mdc-icon-size: 16px; }
|
||||
`],a([g({attribute:!1})],e.prototype,"hass",2),a([o()],e.prototype,"_config",2),a([o()],e.prototype,"_groups",2),a([o()],e.prototype,"_loaded",2),a([o()],e.prototype,"_busy",2),a([o()],e.prototype,"_error",2),a([o()],e.prototype,"_newName",2),a([o()],e.prototype,"_editingId",2),a([o()],e.prototype,"_editingName",2);customElements.get("maintenance-groups-section-card")||customElements.define("maintenance-groups-section-card",e);window.customCards=window.customCards||[];window.customCards.push({type:"maintenance-groups-section-card",name:"Maintenance Supporter \u2014 Groups",description:"Inline group CRUD",preview:!1});export{e as MaintenanceGroupsSectionCard};
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
import{a as m}from"./chunk-Q7DQUCT7.js";import{a as h,b as n,d as c,e as _,f as v,g as r,i as e,k as f,s as l}from"./chunk-X7OW5OLQ.js";import{a as i}from"./chunk-PEGRBZWY.js";var a=class extends _{constructor(){super(...arguments);this._config={type:""};this._state=null;this._busy=!1;this._error="";this._localStart="";this._localEnd="";this._localBuffer=7;this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return this.hass?.language||"en"}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),f(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/state"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||"",this._localBuffer=t.buffer_days??7,this._dirty=!1}catch(t){this._error=l(t,this._lang)}}async _toggleEnabled(t){this._busy=!0,this._error="";try{let s=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",enabled:t});this._state=s}catch(s){this._error=l(s,this._lang)}finally{this._busy=!1}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",start:this._localStart||null,end:this._localEnd||null,buffer_days:this._localBuffer});this._state=t,this._dirty=!1}catch(t){this._error=l(t,this._lang)}finally{this._busy=!1}}}async _endNow(){if(this._isAdmin&&window.confirm(e("vacation_end_now_confirm",this._lang)||"End vacation immediately?")){this._busy=!0;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/end_now"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||""}catch(t){this._error=l(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_vacation"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,s=this._state;if(!s)return n`<ha-card><div class="loading">${e("loading",t)||"Loading\u2026"}</div></ha-card>`;let p=s.is_active===!0,d=s.enabled===!0,u=s.exempt_task_ids?.length??0,b=p?e("vacation_status_active",t)||"Active now":d?e("vacation_status_scheduled",t)||"Scheduled":e("vacation_status_inactive",t)||"Inactive",g=p?"active":d?"scheduled":"inactive";return n`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">🏖️</span>
|
||||
<span>${this._config.title||e("vacation_mode",t)||"Vacation mode"}</span>
|
||||
</div>
|
||||
<span class="status-pill ${g}">${b}</span>
|
||||
</div>
|
||||
|
||||
${this._error?n`<div class="error">${this._error}</div>`:c}
|
||||
|
||||
${this._isAdmin?n`
|
||||
<div class="row toggle-row">
|
||||
<label>${e("enable",t)||"Enable"}</label>
|
||||
<ha-switch
|
||||
.checked=${d}
|
||||
.disabled=${this._busy}
|
||||
@change=${o=>this._toggleEnabled(o.target.checked)}
|
||||
></ha-switch>
|
||||
</div>
|
||||
|
||||
<div class="dates-row">
|
||||
<div class="date-field">
|
||||
<label>${e("vacation_start",t)||"Start"}</label>
|
||||
<input type="date" .value=${this._localStart}
|
||||
?disabled=${this._busy}
|
||||
@input=${o=>{this._localStart=o.target.value,this._dirty=!0}} />
|
||||
</div>
|
||||
<div class="date-field">
|
||||
<label>${e("vacation_end",t)||"End"}</label>
|
||||
<input type="date" .value=${this._localEnd}
|
||||
?disabled=${this._busy}
|
||||
@input=${o=>{this._localEnd=o.target.value,this._dirty=!0}} />
|
||||
</div>
|
||||
<div class="date-field buffer">
|
||||
<label>${e("vacation_buffer",t)||"Buffer days"}</label>
|
||||
<input type="number" min="0" max="14"
|
||||
.value=${String(this._localBuffer)}
|
||||
?disabled=${this._busy}
|
||||
@input=${o=>{this._localBuffer=parseInt(o.target.value,10)||0,this._dirty=!0}} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button class="btn ${this._dirty?"primary":"muted"}"
|
||||
@click=${this._save}
|
||||
?disabled=${this._busy||!this._dirty}>
|
||||
<ha-icon icon="${this._dirty?"mdi:content-save":"mdi:check"}"></ha-icon>
|
||||
${this._dirty?e("save",t)||"Save":e("saved",t)||"Saved"}
|
||||
</button>
|
||||
${p?n`<button class="btn"
|
||||
@click=${this._endNow}
|
||||
?disabled=${this._busy}>
|
||||
${e("vacation_end_now",t)||"End now"}
|
||||
</button>`:c}
|
||||
${u>0?n`<button class="btn link"
|
||||
@click=${this._onDeepLink}>
|
||||
${u} ${e("vacation_exempt_count",t)||"exempt"}…
|
||||
</button>`:n`<button class="btn link"
|
||||
@click=${this._onDeepLink}>
|
||||
${e("vacation_advanced",t)||"Advanced\u2026"}
|
||||
</button>`}
|
||||
</div>
|
||||
`:n`
|
||||
<div class="readonly">
|
||||
${d&&s.start&&s.end?n`<div>${s.start} → ${s.end}</div>`:c}
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${e("vacation_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
</div>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};a.styles=[m,h`
|
||||
.status-pill {
|
||||
font-size: 11px; font-weight: 600;
|
||||
padding: 3px 8px; border-radius: 999px;
|
||||
text-transform: uppercase; letter-spacing: 0.5px;
|
||||
}
|
||||
.status-pill.active {
|
||||
background: rgba(76, 175, 80, 0.15);
|
||||
color: #4caf50;
|
||||
}
|
||||
.status-pill.scheduled {
|
||||
background: rgba(255, 152, 0, 0.15);
|
||||
color: #ff9800;
|
||||
}
|
||||
.status-pill.inactive {
|
||||
background: rgba(158, 158, 158, 0.15);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.row.toggle-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.row.toggle-row label {
|
||||
font-size: 14px; color: var(--primary-text-color);
|
||||
}
|
||||
.dates-row {
|
||||
display: grid; grid-template-columns: 1fr 1fr 100px; gap: 10px;
|
||||
}
|
||||
.date-field.buffer label { white-space: nowrap; }
|
||||
.date-field { display: flex; flex-direction: column; gap: 4px; }
|
||||
.date-field label {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.3px;
|
||||
}
|
||||
.date-field input {
|
||||
padding: 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.date-field input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.actions {
|
||||
display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
|
||||
}
|
||||
.readonly { display: flex; flex-direction: column; gap: 8px; }
|
||||
`],i([v({attribute:!1})],a.prototype,"hass",2),i([r()],a.prototype,"_config",2),i([r()],a.prototype,"_state",2),i([r()],a.prototype,"_busy",2),i([r()],a.prototype,"_error",2),i([r()],a.prototype,"_localStart",2),i([r()],a.prototype,"_localEnd",2),i([r()],a.prototype,"_localBuffer",2),i([r()],a.prototype,"_dirty",2);customElements.get("maintenance-vacation-section-card")||customElements.define("maintenance-vacation-section-card",a);window.customCards=window.customCards||[];window.customCards.push({type:"maintenance-vacation-section-card",name:"Maintenance Supporter \u2014 Vacation",description:"Inline vacation mode toggle + dates",preview:!1});export{a as MaintenanceVacationSectionCard};
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,671 @@
|
||||
/**
|
||||
* TaskMate Routine Card (#676)
|
||||
*
|
||||
* A guided, one-task-at-a-time flow for morning and bedtime routines. The
|
||||
* child card is a checklist — good for scanning, poor for a five-year-old
|
||||
* being walked through getting ready. This shows a single task at a time with
|
||||
* a big Done button, a progress bar, and a celebration at the end.
|
||||
*
|
||||
* Availability comes from the backend's own chore_availability matrix rather
|
||||
* than a re-implementation of the child card's filter, so the weather gate,
|
||||
* reactive deadlines, dependencies and rotation are all honoured for free.
|
||||
*
|
||||
* Version: 1.0.0
|
||||
*/
|
||||
|
||||
const LitElement = customElements.get("hui-masonry-view")
|
||||
? Object.getPrototypeOf(customElements.get("hui-masonry-view"))
|
||||
: Object.getPrototypeOf(customElements.get("hui-view"));
|
||||
|
||||
const html = LitElement.prototype.html;
|
||||
const css = LitElement.prototype.css;
|
||||
|
||||
const _safeColor = (c, d) => (typeof c === "string" && /^#[0-9a-fA-F]{3,8}$/.test(c) ? c : d);
|
||||
|
||||
const TIME_CATEGORIES = ["all", "morning", "afternoon", "evening", "night", "anytime"];
|
||||
|
||||
// The card has ONE layout, so it consumes the design tokens directly rather
|
||||
// than carrying a second _renderDesigned() template like the multi-layout
|
||||
// cards do. Every --tmd-* reference below is written with the card's original
|
||||
// value as the fallback, so "classic" — which defines no tokens — renders
|
||||
// exactly as it did before the design system was wired in.
|
||||
const DEFAULT_ACCENT = "#7c3aed";
|
||||
|
||||
class TaskMateRoutineCard extends LitElement {
|
||||
static get properties() {
|
||||
return {
|
||||
hass: { type: Object },
|
||||
config: { type: Object },
|
||||
_index: { type: Number },
|
||||
_finished: { type: Boolean },
|
||||
_busy: { type: Boolean },
|
||||
};
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this._index = 0;
|
||||
this._finished = false;
|
||||
this._busy = false;
|
||||
// Chores completed during THIS run, so the finish screen can total what
|
||||
// was just earned rather than everything the child has done today.
|
||||
this._runCompleted = new Map();
|
||||
// Tasks the child chose to leave for later. Kept for this run only.
|
||||
this._skipped = new Set();
|
||||
}
|
||||
|
||||
setConfig(config) {
|
||||
if (!config.entity) throw new Error("You need to define an entity");
|
||||
if (!config.child_id) throw new Error("You need to define a child_id");
|
||||
if (config.time_category && !TIME_CATEGORIES.includes(config.time_category)) {
|
||||
throw new Error(`time_category must be one of: ${TIME_CATEGORIES.join(", ")}`);
|
||||
}
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
getCardSize() { return 8; }
|
||||
|
||||
static getStubConfig() {
|
||||
return { entity: "sensor.taskmate_overview", child_id: "", time_category: "morning" };
|
||||
}
|
||||
|
||||
shouldUpdate(changedProps) {
|
||||
if (changedProps.has("hass")) {
|
||||
return window.__taskmate_hasChanged
|
||||
? window.__taskmate_hasChanged(changedProps.get("hass"), this.hass, this.config?.entity)
|
||||
: true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
_t(key, params) {
|
||||
const fn = window.__taskmate_localize;
|
||||
return fn ? fn(this.hass, key, params) : key;
|
||||
}
|
||||
|
||||
_attrs() {
|
||||
return (window.__taskmate_attrs && window.__taskmate_attrs(this.hass, this.config.entity))
|
||||
|| this.hass?.states?.[this.config.entity]?.attributes || {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the active design, stamp data-tm-design on the host (which is what
|
||||
* makes the :host-scoped token block apply inside this shadow root), and
|
||||
* settle the header colour.
|
||||
*
|
||||
* The accent is set as an inline property on the host rather than from a
|
||||
* <style> in the template: a shadow tree's <style> is ordered BEFORE
|
||||
* adoptedStyleSheets, so it loses to the :host default in static styles()
|
||||
* at equal specificity. An element's own inline property beats both.
|
||||
* An explicit header_color always wins; otherwise the rule in styles()
|
||||
* takes the design's accent, falling back to the card's purple in classic.
|
||||
* Headers stay full-colour in every style per the house rule.
|
||||
*/
|
||||
_applyDesign() {
|
||||
const design = window.__taskmate_design
|
||||
? window.__taskmate_design.apply(this, this.hass, this.config, this.config.entity)
|
||||
: "classic";
|
||||
const configured = this.config.header_color;
|
||||
if (typeof configured === "string" && /^#[0-9a-fA-F]{3,8}$/.test(configured)) {
|
||||
this.style.setProperty("--routine-accent", _safeColor(configured, DEFAULT_ACCENT));
|
||||
} else {
|
||||
this.style.removeProperty("--routine-accent");
|
||||
}
|
||||
return design;
|
||||
}
|
||||
|
||||
_child() {
|
||||
const attrs = this._attrs();
|
||||
return (attrs.children || []).find(c => String(c.id) === String(this.config.child_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* The routine's task list: chores the backend says are available to this
|
||||
* child, in the child's configured order, filtered to the card's period.
|
||||
* Chores completed during this run stay in the list (so the progress bar
|
||||
* doesn't jump around) but are marked done.
|
||||
*/
|
||||
_tasks() {
|
||||
const attrs = this._attrs();
|
||||
const child = this._child();
|
||||
if (!child) return [];
|
||||
|
||||
const childId = String(child.id);
|
||||
const availability = attrs.chore_availability || {};
|
||||
const period = this.config.time_category || "all";
|
||||
|
||||
const completedToday = new Set(
|
||||
(attrs.todays_completions || [])
|
||||
.filter(c => String(c.child_id) === childId && !c.bonus_subtask_id)
|
||||
.map(c => String(c.chore_id))
|
||||
);
|
||||
|
||||
const order = (child.chore_order || []).map(String);
|
||||
const list = (attrs.chores || []).filter(chore => {
|
||||
const id = String(chore.id);
|
||||
// Anything finished in this run stays visible as a completed step.
|
||||
if (this._runCompleted.has(id)) return true;
|
||||
if (!availability[id] || availability[id][childId] !== true) return false;
|
||||
if (completedToday.has(id)) return false;
|
||||
if (period !== "all" && chore.time_category !== period) return false;
|
||||
return true;
|
||||
});
|
||||
|
||||
list.sort((a, b) => {
|
||||
const ai = order.indexOf(String(a.id));
|
||||
const bi = order.indexOf(String(b.id));
|
||||
if (ai !== -1 && bi !== -1) return ai - bi;
|
||||
if (ai !== -1) return -1;
|
||||
if (bi !== -1) return 1;
|
||||
return String(a.name).localeCompare(String(b.name));
|
||||
});
|
||||
return list;
|
||||
}
|
||||
|
||||
_pointsFor(chore) {
|
||||
return chore.effective_points ?? chore.points ?? 0;
|
||||
}
|
||||
|
||||
async _complete(chore) {
|
||||
if (this._busy) return;
|
||||
const child = this._child();
|
||||
if (!child) return;
|
||||
this._busy = true;
|
||||
try {
|
||||
// Prefer the per-chore button entity so HA state-trigger automations
|
||||
// fire, exactly as the child card does. Fall back to the service when
|
||||
// the entity isn't registered yet (e.g. right after a restart).
|
||||
const buttonEntityId = window.__taskmate_find_button
|
||||
&& window.__taskmate_find_button(this.hass, child.id, "complete", chore.id);
|
||||
if (buttonEntityId) {
|
||||
await this.hass.callService("button", "press", { entity_id: buttonEntityId });
|
||||
} else {
|
||||
await this.hass.callService("taskmate", "complete_chore", {
|
||||
chore_id: chore.id, child_id: child.id,
|
||||
});
|
||||
}
|
||||
this._runCompleted.set(String(chore.id), {
|
||||
points: this._pointsFor(chore),
|
||||
pending: chore.requires_approval !== false,
|
||||
});
|
||||
// Skipped then done later is not "left for later" — otherwise the finish
|
||||
// screen claims tasks are outstanding that the child actually did.
|
||||
this._skipped.delete(String(chore.id));
|
||||
this._advance();
|
||||
} catch (err) {
|
||||
// Surface rather than silently stalling the routine on a failed call.
|
||||
this.dispatchEvent(new CustomEvent("hass-notification", {
|
||||
detail: { message: String(err?.message || err) }, bubbles: true, composed: true,
|
||||
}));
|
||||
} finally {
|
||||
this._busy = false;
|
||||
this.requestUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
_advance() {
|
||||
const total = this._tasks().length;
|
||||
if (this._index >= total - 1) {
|
||||
this._finished = true;
|
||||
} else {
|
||||
this._index = this._index + 1;
|
||||
}
|
||||
this.requestUpdate();
|
||||
}
|
||||
|
||||
_skip() {
|
||||
const tasks = this._tasks();
|
||||
const chore = tasks[this._index];
|
||||
if (chore) this._skipped.add(String(chore.id));
|
||||
this._advance();
|
||||
}
|
||||
|
||||
_back() {
|
||||
if (this._finished) { this._finished = false; return; }
|
||||
if (this._index > 0) this._index = this._index - 1;
|
||||
this.requestUpdate();
|
||||
}
|
||||
|
||||
_restart() {
|
||||
this._index = 0;
|
||||
this._finished = false;
|
||||
this._runCompleted = new Map();
|
||||
this._skipped = new Set();
|
||||
this.requestUpdate();
|
||||
}
|
||||
|
||||
render() {
|
||||
if (!this.hass || !this.config) return html``;
|
||||
this._applyDesign();
|
||||
const child = this._child();
|
||||
if (!child) {
|
||||
return html`<ha-card><div class="pad error">${this._t("routine.no_child")}</div></ha-card>`;
|
||||
}
|
||||
|
||||
const attrs = this._attrs();
|
||||
const pointsIcon = attrs.points_icon || "mdi:star";
|
||||
const tasks = this._tasks();
|
||||
const title = this.config.title || this._t("routine.title", { name: child.name });
|
||||
|
||||
if (!tasks.length) return this._renderEmpty(title);
|
||||
if (this._finished) return this._renderFinished(title, tasks, pointsIcon, child);
|
||||
|
||||
// Guard against the list shrinking underneath us (a parent ticking a chore
|
||||
// off elsewhere) — clamp rather than render undefined.
|
||||
const index = Math.min(this._index, tasks.length - 1);
|
||||
const chore = tasks[index];
|
||||
const done = this._runCompleted.get(String(chore.id));
|
||||
const pct = Math.round((index / tasks.length) * 100);
|
||||
|
||||
return html`
|
||||
<ha-card>
|
||||
<div class="head">
|
||||
<span class="who">${title}</span>
|
||||
</div>
|
||||
|
||||
<div class="progress">
|
||||
<div class="rt-bar"><i style="width:${pct}%"></i></div>
|
||||
<div class="count">${this._t("routine.task_of", { current: index + 1, total: tasks.length })}</div>
|
||||
</div>
|
||||
|
||||
<div class="dots">
|
||||
${tasks.map((t, i) => html`
|
||||
<span class="dot ${this._runCompleted.has(String(t.id)) ? "done" : ""} ${i === index ? "now" : ""}"></span>
|
||||
`)}
|
||||
</div>
|
||||
|
||||
<div class="body">
|
||||
<div class="icon"><ha-icon icon="${chore.icon || "mdi:checkbox-marked-circle-outline"}"></ha-icon></div>
|
||||
<div class="task">${chore.name}</div>
|
||||
${chore.description ? html`<div class="desc">${chore.description}</div>` : ""}
|
||||
<div class="points">
|
||||
<ha-icon icon="${pointsIcon}"></ha-icon> +${this._pointsFor(chore)}
|
||||
</div>
|
||||
${done?.pending ? html`<div class="pending">${this._t("routine.waiting_for_parent")}</div>` : ""}
|
||||
${chore.require_photo ? html`<div class="note">${this._t("routine.photo_note")}</div>` : ""}
|
||||
</div>
|
||||
|
||||
<div class="foot">
|
||||
${done
|
||||
? html`<button class="rt-btn rt-done is-done" disabled>
|
||||
${done.pending ? this._t("routine.sent_for_checking") : this._t("routine.completed")}
|
||||
</button>`
|
||||
: html`<button class="rt-btn rt-done" ?disabled=${this._busy}
|
||||
@click=${() => this._complete(chore)}>
|
||||
${this._t("routine.done")}
|
||||
</button>`}
|
||||
<div class="rt-row">
|
||||
<button class="rt-btn rt-back" ?disabled=${index === 0} @click=${this._back}>
|
||||
${this._t("routine.back")}
|
||||
</button>
|
||||
<button class="rt-btn rt-skip" @click=${this._skip}>
|
||||
${done ? this._t("routine.next") : this._t("routine.skip")}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</ha-card>
|
||||
`;
|
||||
}
|
||||
|
||||
_renderEmpty(title) {
|
||||
return html`
|
||||
<ha-card>
|
||||
<div class="head"><span class="who">${title}</span></div>
|
||||
<div class="empty">
|
||||
<ha-icon icon="mdi:check-circle-outline"></ha-icon>
|
||||
<h2>${this._t("routine.empty_title")}</h2>
|
||||
<p>${this._t("routine.empty_body")}</p>
|
||||
</div>
|
||||
</ha-card>
|
||||
`;
|
||||
}
|
||||
|
||||
_renderFinished(title, tasks, pointsIcon, child) {
|
||||
let earned = 0;
|
||||
let pending = 0;
|
||||
for (const entry of this._runCompleted.values()) {
|
||||
if (entry.pending) pending += entry.points; else earned += entry.points;
|
||||
}
|
||||
const skipped = this._skipped.size;
|
||||
|
||||
return html`
|
||||
<ha-card>
|
||||
<div class="head"><span class="who">${title}</span></div>
|
||||
<div class="progress">
|
||||
<div class="rt-bar"><i class="full" style="width:100%"></i></div>
|
||||
<div class="count">${this._t("routine.all_done_count", { total: tasks.length })}</div>
|
||||
</div>
|
||||
<div class="finished">
|
||||
<div class="cheer">🎉</div>
|
||||
<h2>${this._t("routine.finished_title")}</h2>
|
||||
<p>${this._t("routine.finished_body", { name: child.name })}</p>
|
||||
${earned > 0 ? html`
|
||||
<div class="earned"><ha-icon icon="${pointsIcon}"></ha-icon> ${this._t("routine.earned", { points: earned })}</div>
|
||||
` : ""}
|
||||
${pending > 0 ? html`
|
||||
<div class="earned pending-total">${this._t("routine.awaiting_points", { points: pending })}</div>
|
||||
` : ""}
|
||||
${skipped > 0 ? html`
|
||||
<p class="skipped">${this._t("routine.skipped_note", { count: skipped })}</p>
|
||||
` : ""}
|
||||
</div>
|
||||
<div class="foot">
|
||||
<button class="rt-btn rt-done" @click=${this._restart}>${this._t("routine.start_again")}</button>
|
||||
</div>
|
||||
</ha-card>
|
||||
`;
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
// Layout classes carry an rt- prefix because the shared design kit defines
|
||||
// its own .btn and .bar, and its :host([data-tm-design=...]) .btn rules
|
||||
// outrank a bare .btn-done here — which repainted the green Done button
|
||||
// with the console gradient and gave Skip equal visual weight.
|
||||
const base = css`
|
||||
:host { display: block; --routine-accent: var(--tmd-accent, #7c3aed); }
|
||||
ha-card {
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 460px;
|
||||
font-family: var(--tmd-font-body, inherit);
|
||||
background: var(--tmd-surface, var(--ha-card-background, var(--card-background-color, #fff)));
|
||||
color: var(--tmd-text, var(--primary-text-color));
|
||||
border-radius: var(--tmd-radius, var(--ha-card-border-radius, 12px));
|
||||
}
|
||||
.head {
|
||||
background: var(--routine-accent);
|
||||
color: var(--tmd-hd-text, #fff);
|
||||
padding: 16px 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
.who {
|
||||
font-weight: 800; font-size: 17px; flex: 1;
|
||||
font-family: var(--tmd-font-display, inherit);
|
||||
}
|
||||
|
||||
.progress { padding: 14px 20px 0; }
|
||||
.rt-bar {
|
||||
height: 8px;
|
||||
border-radius: 99px;
|
||||
background: var(--tmd-surface-2, var(--divider-color, #e5e7eb));
|
||||
border: 1px solid var(--tmd-border, transparent);
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
}
|
||||
.rt-bar > i {
|
||||
display: block;
|
||||
height: 100%;
|
||||
border-radius: 99px;
|
||||
background: var(--routine-accent);
|
||||
transition: width 0.25s ease;
|
||||
}
|
||||
.rt-bar > i.full { background: var(--tmd-good, var(--success-color, #16a34a)); }
|
||||
.count {
|
||||
font-size: 12.5px;
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
margin-top: 7px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.dots {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
justify-content: center;
|
||||
padding: 10px 20px 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.dot {
|
||||
width: 9px; height: 9px;
|
||||
border-radius: 50%;
|
||||
background: var(--tmd-surface-2, var(--divider-color, #e5e7eb));
|
||||
/* Transparent under classic, so the outline only appears in the
|
||||
designed styles — it is what keeps the steps distinguishable in
|
||||
accessible, where meaning must not rest on hue alone. */
|
||||
border: 1px solid var(--tmd-border, transparent);
|
||||
box-sizing: border-box;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
.dot.done { background: var(--tmd-good, var(--success-color, #16a34a)); }
|
||||
.dot.now { background: var(--routine-accent); transform: scale(1.35); }
|
||||
|
||||
.body {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
padding: 20px 26px 8px;
|
||||
gap: 14px;
|
||||
}
|
||||
.icon {
|
||||
width: 128px; height: 128px;
|
||||
border-radius: var(--tmd-radius, 34px);
|
||||
background: color-mix(in srgb, var(--routine-accent), transparent 88%);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
color: var(--routine-accent);
|
||||
}
|
||||
.icon ha-icon { --mdc-icon-size: 64px; }
|
||||
.task {
|
||||
font-size: 27px; font-weight: 800; line-height: 1.2;
|
||||
font-family: var(--tmd-font-display, inherit);
|
||||
}
|
||||
.desc {
|
||||
font-size: 14.5px; line-height: 1.45;
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
}
|
||||
.points {
|
||||
display: inline-flex; align-items: center; gap: 6px;
|
||||
background: color-mix(in srgb, var(--tmd-warn, #f59e0b) 16%, transparent);
|
||||
color: var(--tmd-gold, #92400e);
|
||||
padding: 5px 13px; border-radius: 99px;
|
||||
font-weight: 800; font-size: 14px;
|
||||
}
|
||||
.points ha-icon { --mdc-icon-size: 17px; }
|
||||
.pending {
|
||||
display: inline-flex; align-items: center; gap: 6px;
|
||||
background: color-mix(in srgb, var(--tmd-bad, #f97316) 12%, transparent);
|
||||
color: var(--tmd-bad, #9a3412);
|
||||
border: 1px solid color-mix(in srgb, var(--tmd-bad, #f97316) 35%, transparent);
|
||||
padding: 5px 12px; border-radius: 99px;
|
||||
font-weight: 700; font-size: 12.5px;
|
||||
}
|
||||
.note { font-size: 12.5px; color: var(--tmd-dim, var(--secondary-text-color)); }
|
||||
|
||||
.foot { padding: 14px 20px 20px; display: flex; flex-direction: column; gap: 10px; }
|
||||
.rt-btn {
|
||||
border: 0; border-radius: var(--tmd-radius-sm, 16px);
|
||||
font-family: var(--tmd-font-display, inherit); font-weight: 800;
|
||||
width: 100%; cursor: pointer;
|
||||
}
|
||||
.rt-btn:disabled { cursor: default; }
|
||||
.rt-done {
|
||||
background: var(--tmd-good, var(--success-color, #16a34a));
|
||||
color: #fff; padding: 19px; font-size: 19px;
|
||||
}
|
||||
/* The shared kit renders a "good" button as dark ink on the good colour
|
||||
(.btn.good in taskmate-design.js). Matching it here matters beyond
|
||||
consistency: on the accessible palette's #009E73, dark ink measures
|
||||
4.2:1 against white's 3.4:1. */
|
||||
:host([data-tm-design]:not([data-tm-design="classic"])) .rt-done { color: #06301f; }
|
||||
.rt-done.is-done {
|
||||
background: var(--tmd-dim, var(--disabled-text-color, #9ca3af));
|
||||
}
|
||||
:host([data-tm-design]:not([data-tm-design="classic"])) .rt-done.is-done { color: #fff; }
|
||||
.rt-row { display: flex; gap: 10px; }
|
||||
.rt-skip {
|
||||
background: var(--tmd-surface-2, var(--divider-color, #e5e7eb));
|
||||
color: var(--tmd-text, var(--primary-text-color));
|
||||
border: 1px solid var(--tmd-border, transparent);
|
||||
padding: 12px; font-size: 14px; flex: 1;
|
||||
}
|
||||
.rt-back {
|
||||
background: transparent;
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
border: 1px solid var(--tmd-border, var(--divider-color, #e5e7eb));
|
||||
padding: 12px; font-size: 14px; flex: 0 0 96px;
|
||||
}
|
||||
.rt-back:disabled { opacity: 0.4; }
|
||||
|
||||
.finished { text-align: center; padding: 34px 26px; flex: 1; }
|
||||
.finished .cheer { font-size: 66px; line-height: 1; }
|
||||
.finished h2 {
|
||||
font-size: 25px; margin: 12px 0 6px;
|
||||
font-family: var(--tmd-font-display, inherit);
|
||||
}
|
||||
.finished p {
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
font-size: 15px; margin: 0 0 6px;
|
||||
}
|
||||
.finished .skipped { font-size: 13px; margin-top: 12px; }
|
||||
.earned {
|
||||
display: inline-flex; gap: 6px; align-items: center; margin-top: 10px;
|
||||
background: color-mix(in srgb, var(--tmd-good, #16a34a) 14%, transparent);
|
||||
color: var(--tmd-good, #166534);
|
||||
padding: 9px 18px; border-radius: 99px;
|
||||
font-weight: 800; font-size: 16px;
|
||||
}
|
||||
.earned.pending-total {
|
||||
background: color-mix(in srgb, var(--tmd-bad, #f97316) 12%, transparent);
|
||||
color: var(--tmd-bad, #9a3412);
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.empty {
|
||||
text-align: center; padding: 64px 26px; flex: 1;
|
||||
color: var(--tmd-dim, var(--secondary-text-color));
|
||||
}
|
||||
.empty ha-icon { --mdc-icon-size: 60px; opacity: 0.5; }
|
||||
.empty h2 {
|
||||
font-size: 20px; margin: 14px 0 6px;
|
||||
color: var(--tmd-text, var(--primary-text-color));
|
||||
font-family: var(--tmd-font-display, inherit);
|
||||
}
|
||||
.empty p { font-size: 14.5px; margin: 0; }
|
||||
|
||||
.pad { padding: 24px; }
|
||||
.error { color: var(--tmd-bad, var(--error-color, #c62828)); }
|
||||
|
||||
@media (max-width: 420px) {
|
||||
.icon { width: 104px; height: 104px; border-radius: 28px; }
|
||||
.icon ha-icon { --mdc-icon-size: 52px; }
|
||||
.task { font-size: 23px; }
|
||||
}
|
||||
`;
|
||||
// The token block is :host-scoped, so it only takes effect when included
|
||||
// in THIS card's styles — a document-level rule cannot cross into the
|
||||
// shadow root.
|
||||
const tokens = window.__taskmate_design && window.__taskmate_design.styles
|
||||
? window.__taskmate_design.styles() : null;
|
||||
return tokens ? [tokens, base] : base;
|
||||
}
|
||||
}
|
||||
|
||||
class TaskMateRoutineCardEditor extends LitElement {
|
||||
static get properties() {
|
||||
return { hass: { type: Object }, _config: { type: Object } };
|
||||
}
|
||||
|
||||
setConfig(config) { this._config = { ...config }; }
|
||||
|
||||
_t(key, params) {
|
||||
const fn = window.__taskmate_localize;
|
||||
return fn ? fn(this.hass, key, params) : key;
|
||||
}
|
||||
|
||||
render() {
|
||||
if (!this._config) return html``;
|
||||
const attrs = (window.__taskmate_attrs && window.__taskmate_attrs(this.hass, this._config.entity)) || {};
|
||||
const children = attrs.children || [];
|
||||
return html`
|
||||
<div class="form">
|
||||
<ha-textfield
|
||||
label="Entity"
|
||||
.value=${this._config.entity || "sensor.taskmate_overview"}
|
||||
@input=${e => this._set("entity", e.target.value)}
|
||||
></ha-textfield>
|
||||
|
||||
<ha-select
|
||||
label="Child"
|
||||
.value=${this._config.child_id || ""}
|
||||
@selected=${e => this._set("child_id", e.target.value)}
|
||||
@closed=${e => e.stopPropagation()}
|
||||
>
|
||||
${children.map(c => html`<mwc-list-item .value=${c.id}>${c.name}</mwc-list-item>`)}
|
||||
</ha-select>
|
||||
|
||||
<ha-select
|
||||
label="Time of day"
|
||||
.value=${this._config.time_category || "all"}
|
||||
@selected=${e => this._set("time_category", e.target.value)}
|
||||
@closed=${e => e.stopPropagation()}
|
||||
>
|
||||
${TIME_CATEGORIES.map(t => html`<mwc-list-item .value=${t}>${t}</mwc-list-item>`)}
|
||||
</ha-select>
|
||||
|
||||
<ha-textfield
|
||||
label="Title (optional)"
|
||||
.value=${this._config.title || ""}
|
||||
@input=${e => this._set("title", e.target.value)}
|
||||
></ha-textfield>
|
||||
|
||||
<ha-select
|
||||
.label=${this._t("common.design.field_label")}
|
||||
.value=${this._config.card_design || "global"}
|
||||
@selected=${e => this._set("card_design", e.target.value)}
|
||||
@closed=${e => e.stopPropagation()}
|
||||
>
|
||||
${(window.__taskmate_design
|
||||
? window.__taskmate_design.editorOptions(this._t.bind(this))
|
||||
: [{ value: "global", label: "Use global default" }]
|
||||
).map(o => html`<mwc-list-item .value=${o.value}>${o.label}</mwc-list-item>`)}
|
||||
</ha-select>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
_set(key, value) {
|
||||
const newConfig = { ...this._config, [key]: value };
|
||||
// "global" is the absence of a per-card override, not a value to store.
|
||||
if (key === "card_design" && value === "global") delete newConfig[key];
|
||||
else if (value === null || value === "" || value === undefined) delete newConfig[key];
|
||||
this._config = newConfig;
|
||||
this.dispatchEvent(new CustomEvent("config-changed", {
|
||||
detail: { config: newConfig }, bubbles: true, composed: true,
|
||||
}));
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
return css`
|
||||
.form { display: flex; flex-direction: column; gap: 14px; padding: 8px 0; }
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("taskmate-routine-card", TaskMateRoutineCard);
|
||||
customElements.define("taskmate-routine-card-editor", TaskMateRoutineCardEditor);
|
||||
|
||||
window.customCards = window.customCards || [];
|
||||
window.customCards.push({
|
||||
type: "taskmate-routine-card",
|
||||
name: "TaskMate Routine",
|
||||
description: "Guided one-task-at-a-time flow for morning and bedtime routines",
|
||||
preview: true,
|
||||
getEntitySuggestion: (hass, entityId) =>
|
||||
window.__taskmate_suggest(hass, entityId, "taskmate-routine-card", "overview"),
|
||||
});
|
||||
|
||||
// Version is injected by the HA resource URL (?v=x.x.x) and read from the DOM
|
||||
const _tmVersion = new URLSearchParams(
|
||||
Array.from(document.querySelectorAll('script[src*="/taskmate-routine-card.js"]'))
|
||||
.map(s => s.src.split("?")[1]).find(Boolean) || ""
|
||||
).get("v") || "?";
|
||||
console.info(
|
||||
"%c TASKMATE ROUTINE CARD %c v" + _tmVersion + " ",
|
||||
"background:#7c3aed;color:white;font-weight:bold;padding:2px 4px;border-radius:4px 0 0 4px;",
|
||||
"background:#2c3e50;color:white;font-weight:bold;padding:2px 4px;border-radius:0 4px 4px 0;"
|
||||
);
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"mcp": {
|
||||
"ha-direct": {
|
||||
"type": "remote",
|
||||
"url": "http://192.168.1.140:9584/private_bjV5uaDnrjS1JEtBg8UP-g",
|
||||
"enabled": true
|
||||
}
|
||||
},
|
||||
"tools": {
|
||||
"ha-direct_*": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,628 @@
|
||||
!function(){"use strict";function t(t,e,i,r){var n,s=arguments.length,o=s<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,i,r);else for(var a=t.length-1;a>=0;a--)(n=t[a])&&(o=(s<3?n(o):s>3?n(e,i,o):n(e,i))||o);return s>3&&o&&Object.defineProperty(e,i,o),o}"function"==typeof SuppressedError&&SuppressedError;const e=globalThis,i=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,r=Symbol(),n=new WeakMap;let s=class{constructor(t,e,i){if(this._$cssResult$=!0,i!==r)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const e=this.t;if(i&&void 0===t){const i=void 0!==e&&1===e.length;i&&(t=n.get(e)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),i&&n.set(e,t))}return t}toString(){return this.cssText}};const o=t=>new s("string"==typeof t?t:t+"",void 0,r),a=(t,...e)=>{const i=1===t.length?t[0]:e.reduce((e,i,r)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[r+1],t[0]);return new s(i,t,r)},l=i?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return o(e)})(t):t,{is:c,defineProperty:d,getOwnPropertyDescriptor:h,getOwnPropertyNames:p,getOwnPropertySymbols:u,getPrototypeOf:m}=Object,f=globalThis,g=f.trustedTypes,_=g?g.emptyScript:"",b=f.reactiveElementPolyfillSupport,v=(t,e)=>t,$={toAttribute(t,e){switch(e){case Boolean:t=t?_:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},x=(t,e)=>!c(t,e),y={attribute:!0,type:String,converter:$,reflect:!1,useDefault:!1,hasChanged:x};Symbol.metadata??=Symbol("metadata"),f.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=y){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,e);void 0!==r&&d(this.prototype,t,r)}}static getPropertyDescriptor(t,e,i){const{get:r,set:n}=h(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:r,set(e){const s=r?.call(this);n?.call(this,e),this.requestUpdate(t,s,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??y}static _$Ei(){if(this.hasOwnProperty(v("elementProperties")))return;const t=m(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(v("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(v("properties"))){const t=this.properties,e=[...p(t),...u(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(l(t))}else void 0!==t&&e.push(l(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((t,r)=>{if(i)t.adoptedStyleSheets=r.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const i of r){const r=document.createElement("style"),n=e.litNonce;void 0!==n&&r.setAttribute("nonce",n),r.textContent=i.cssText,t.appendChild(r)}})(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EOLine truncated
|
||||
<ha-card>
|
||||
<div class="error">Entity not found: ${this._config.entity}</div>
|
||||
</ha-card>
|
||||
`;const e=this._config.min??0,i=this._config.max??5e3,r=Math.max(1,i-e),n=this._initialized&&null!==this._readEntityValue(),s=n?this._live:e,o=n?Ct((s-e)/r,0,1):0,a=Pt(o,this._stops),l=this._config.unit??t.attributes.unit_of_measurement??"W",c=this._config.name??t.attributes.friendly_name??this._config.entity,d=this._config.precision??0,h=n?this._format(s,d):"—",p=n?this._secondaryLine(s,l,a):"NO DATA",u={"--c1":a.c1,"--c2":a.c2,"--c3":a.c3,...Lt(this._config.background,zt)},m=qt+280*o,[f,g]=Rt(It,Wt,Bt,m);return q`
|
||||
<ha-card style=${xt(u)}>
|
||||
<div class="panel">
|
||||
<div class="header">
|
||||
<div>
|
||||
<div class="title">${c}</div>
|
||||
<div class="subtitle">
|
||||
${n?q`Live · ${(i/1e3).toFixed(1)} ${"W"===l?"kW":l} max`:"Awaiting a valid source value"}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stage">
|
||||
<div class="gauge ${n?"":"no-data"}">
|
||||
${this._renderSvg(a,m)}
|
||||
<div class="center">
|
||||
<div class="core">
|
||||
<div class="reading">
|
||||
<div class="label-now">${n?"Live draw":"Source unavailable"}</div>
|
||||
<div class="value">
|
||||
${h}${n?q`<span class="unit-inline">${l}</span>`:J}
|
||||
</div>
|
||||
<div class="unit">${p}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="knob"
|
||||
style=${xt({left:f/400*100+"%",top:g/400*100+"%"})}
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="status">
|
||||
<span
|
||||
><span class="pulse-dot ${n?"":"inactive"}"></span
|
||||
>${n?"Streaming":"No data"}</span
|
||||
>
|
||||
<span>Now <b>${n?`${h} ${l}`:"—"}</b></span>
|
||||
<span>Limit <b>${n?this._formatLimit(i,l):"—"}</b></span>
|
||||
</div>
|
||||
</div>
|
||||
</ha-card>
|
||||
`}_format(t,e){return e<=0?Math.round(t).toLocaleString():t.toLocaleString(void 0,{minimumFractionDigits:e,maximumFractionDigits:e})}_formatLimit(t,e){return"W"===e&&t>=1e3?`${(t/1e3).toFixed(1)} kW`:`${t.toLocaleString()} ${e}`}_secondaryLine(t,e,i){return"W"===e?`${(t/1e3).toFixed(2)} kW · ${i.mood}`:i.mood}_renderSvg(t,e){const i=[],r=(e-qt)/280;for(let e=0;e<=80;e++){const n=e/80,s=qt+280*n,o=e%8==0,a=128,l=Bt-(o?8:14),[c,d]=Rt(It,Wt,a,s),[h,p]=Rt(It,Wt,l,s),u=n<=r;i.push(G`
|
||||
<line
|
||||
x1=${c} y1=${d} x2=${h} y2=${p}
|
||||
stroke=${u?t.c1:"rgba(255,255,255,0.08)"}
|
||||
stroke-width=${o?1.6:1}
|
||||
stroke-linecap="round"
|
||||
opacity=${u?1:.55}
|
||||
style=${u?`filter: drop-shadow(0 0 4px ${t.c1})`:""}
|
||||
/>
|
||||
`)}return q`
|
||||
<svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet">
|
||||
<defs>
|
||||
<linearGradient id="pg-stroke" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color=${t.c1} />
|
||||
<stop offset="60%" stop-color=${t.c2} />
|
||||
<stop offset="100%" stop-color=${t.c3} />
|
||||
</linearGradient>
|
||||
<radialGradient id="pg-halo" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="60%" stop-color="transparent" />
|
||||
<stop offset="80%" stop-color=${t.c2} stop-opacity="0.5" />
|
||||
<stop offset="100%" stop-color="transparent" />
|
||||
</radialGradient>
|
||||
<radialGradient id="pg-aura" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="55%" stop-color="transparent" />
|
||||
<stop offset="72%" stop-color=${t.c1} stop-opacity="0.18" />
|
||||
<stop offset="86%" stop-color=${t.c2} stop-opacity="0.32" />
|
||||
<stop offset="100%" stop-color="transparent" />
|
||||
</radialGradient>
|
||||
<filter id="pg-blur-lg" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="6" />
|
||||
</filter>
|
||||
<filter id="pg-blur-xl" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="14" />
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<g class="spin-slow" style="transform-origin: 200px 200px;">
|
||||
<circle cx=${It} cy=${Wt} r=${174} fill="url(#pg-aura)" opacity="0.9" />
|
||||
</g>
|
||||
|
||||
<path
|
||||
d=${Ut(It,Wt,Bt,qt,410)}
|
||||
stroke="rgba(255,255,255,0.06)"
|
||||
stroke-width="3"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
/>
|
||||
|
||||
<g>${i}</g>
|
||||
|
||||
<path
|
||||
d=${Ut(It,Wt,Bt,qt,e)}
|
||||
stroke=${t.c1}
|
||||
stroke-width="26"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
opacity="0.35"
|
||||
filter="url(#pg-blur-xl)"
|
||||
/>
|
||||
<path
|
||||
d=${Ut(It,Wt,Bt,qt,e)}
|
||||
stroke="url(#pg-stroke)"
|
||||
stroke-width="14"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
opacity="0.6"
|
||||
filter="url(#pg-blur-lg)"
|
||||
/>
|
||||
<path
|
||||
d=${Ut(It,Wt,Bt,qt,e)}
|
||||
stroke="url(#pg-stroke)"
|
||||
stroke-width="3"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
/>
|
||||
|
||||
<g class="spin-fast" style="transform-origin: 200px 200px;">
|
||||
<circle
|
||||
cx=${It} cy=${Wt} r=${120}
|
||||
fill="none"
|
||||
stroke=${t.c2}
|
||||
stroke-opacity="0.18"
|
||||
stroke-width="1"
|
||||
stroke-dasharray="2 8"
|
||||
/>
|
||||
</g>
|
||||
|
||||
<circle
|
||||
cx=${It} cy=${Wt} r=${114}
|
||||
fill="url(#pg-halo)"
|
||||
opacity="0.7"
|
||||
class="shimmer"
|
||||
/>
|
||||
</svg>
|
||||
`}};Gt.styles=a`
|
||||
:host {
|
||||
--pg-bg: ${o(zt)};
|
||||
--pg-text: #eef3ff;
|
||||
--pg-muted: #6b7894;
|
||||
--c1: #1ee0ff;
|
||||
--c2: #2a7bff;
|
||||
--c3: #0a3aa0;
|
||||
|
||||
display: block;
|
||||
}
|
||||
|
||||
ha-card {
|
||||
background: var(--pg-bg);
|
||||
color: var(--pg-text);
|
||||
border: 1px solid color-mix(in oklab, currentColor 12%, transparent);
|
||||
border-radius: var(--ha-card-border-radius, 16px);
|
||||
box-shadow:
|
||||
0 20px 40px rgba(0, 0, 0, 0.45),
|
||||
0 0 0 1px color-mix(in oklab, currentColor 2%, transparent) inset;
|
||||
overflow: hidden;
|
||||
font-family: 'Inter', var(--primary-font-family, system-ui, sans-serif);
|
||||
}
|
||||
|
||||
.panel {
|
||||
position: relative;
|
||||
padding: 22px 20px 18px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.panel::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
pointer-events: none;
|
||||
background:
|
||||
radial-gradient(1px 1px at 20% 30%, color-mix(in oklab, currentColor 60%, transparent), transparent),
|
||||
radial-gradient(1px 1px at 70% 60%, color-mix(in oklab, currentColor 40%, transparent), transparent),
|
||||
radial-gradient(1px 1px at 40% 80%, color-mix(in oklab, currentColor 50%, transparent), transparent),
|
||||
radial-gradient(1px 1px at 85% 20%, color-mix(in oklab, currentColor 30%, transparent), transparent),
|
||||
radial-gradient(1px 1px at 15% 70%, color-mix(in oklab, currentColor 40%, transparent), transparent);
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
line-height: 1.1;
|
||||
letter-spacing: -0.4px;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: 11px;
|
||||
color: var(--pg-muted);
|
||||
margin-top: 4px;
|
||||
letter-spacing: 0.4px;
|
||||
}
|
||||
|
||||
.stage {
|
||||
flex: 1;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
position: relative;
|
||||
margin: 8px 0;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.gauge {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 320px;
|
||||
aspect-ratio: 1 / 1;
|
||||
}
|
||||
|
||||
.gauge svg {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.center {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.core {
|
||||
width: 56%;
|
||||
height: 56%;
|
||||
border-radius: 50%;
|
||||
background:
|
||||
radial-gradient(circle at 50% 40%, rgba(255, 255, 255, 0.06), transparent 60%),
|
||||
radial-gradient(
|
||||
circle at 50% 100%,
|
||||
color-mix(in oklab, var(--c2) 35%, transparent),
|
||||
transparent 70%
|
||||
),
|
||||
#050912;
|
||||
border: 1px solid rgba(255, 255, 255, 0.06);
|
||||
box-shadow:
|
||||
inset 0 0 40px color-mix(in oklab, var(--c2) 30%, transparent),
|
||||
inset 0 0 0 1px rgba(255, 255, 255, 0.04),
|
||||
0 0 60px color-mix(in oklab, var(--c1) 20%, transparent);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
transition: box-shadow 0.6s;
|
||||
}
|
||||
|
||||
.reading {
|
||||
text-align: center;
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.label-now {
|
||||
font-size: 9px;
|
||||
letter-spacing: 2.5px;
|
||||
color: var(--pg-muted);
|
||||
text-transform: uppercase;
|
||||
font-weight: 600;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.value {
|
||||
font-size: 36px;
|
||||
font-weight: 300;
|
||||
letter-spacing: -1.2px;
|
||||
font-variant-numeric: tabular-nums;
|
||||
/* Always white inside the dark gauge core regardless of card theme. */
|
||||
color: #fff;
|
||||
text-shadow: 0 0 20px color-mix(in oklab, var(--c1) 60%, transparent);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.unit-inline {
|
||||
font-size: 16px;
|
||||
color: color-mix(in oklab, #fff 55%, transparent);
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.unit {
|
||||
font-size: 11px;
|
||||
color: color-mix(in oklab, #fff 55%, transparent);
|
||||
margin-top: 6px;
|
||||
letter-spacing: 1.5px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.knob {
|
||||
position: absolute;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
border-radius: 50%;
|
||||
background: #0a1020;
|
||||
border: 1.5px solid rgba(255, 255, 255, 0.6);
|
||||
transform: translate(-50%, -50%);
|
||||
pointer-events: none;
|
||||
box-shadow:
|
||||
0 0 0 4px rgba(0, 0, 0, 0.4),
|
||||
0 0 20px color-mix(in oklab, var(--c1) 80%, transparent);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.knob::after {
|
||||
content: '';
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: var(--c1);
|
||||
box-shadow: 0 0 8px var(--c1);
|
||||
}
|
||||
|
||||
.status {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
padding: 6px 4px 0;
|
||||
font-size: 11px;
|
||||
color: var(--pg-muted);
|
||||
font-variant-numeric: tabular-nums;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.status b {
|
||||
color: var(--pg-text);
|
||||
font-weight: 600;
|
||||
font-family: 'SF Mono', 'JetBrains Mono', 'Menlo', 'Consolas', ui-monospace, monospace;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
.pulse-dot {
|
||||
display: inline-block;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 50%;
|
||||
background: var(--c1);
|
||||
margin-right: 6px;
|
||||
animation: pg-pulse 1.4s ease-in-out infinite;
|
||||
box-shadow: 0 0 8px var(--c1);
|
||||
}
|
||||
|
||||
.pulse-dot.inactive {
|
||||
background: var(--pg-muted);
|
||||
animation: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.gauge.no-data .spin-slow,
|
||||
.gauge.no-data .spin-fast,
|
||||
.gauge.no-data .shimmer {
|
||||
animation: none;
|
||||
}
|
||||
|
||||
@keyframes pg-pulse {
|
||||
0%,
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
50% {
|
||||
opacity: 0.4;
|
||||
transform: scale(0.7);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pg-spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.spin-slow {
|
||||
animation: pg-spin 24s linear infinite;
|
||||
transform-origin: 50% 50%;
|
||||
}
|
||||
|
||||
.spin-fast {
|
||||
animation: pg-spin 9s linear infinite reverse;
|
||||
transform-origin: 50% 50%;
|
||||
}
|
||||
|
||||
@keyframes pg-shimmer {
|
||||
0%,
|
||||
100% {
|
||||
opacity: 0.85;
|
||||
}
|
||||
50% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.shimmer {
|
||||
animation: pg-shimmer 2.4s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.error {
|
||||
padding: 16px;
|
||||
color: var(--error-color, #db4437);
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.spin-slow,
|
||||
.spin-fast,
|
||||
.shimmer,
|
||||
.pulse-dot {
|
||||
animation: none;
|
||||
}
|
||||
}
|
||||
`,t([ft({attribute:!1})],Gt.prototype,"hass",void 0),t([gt()],Gt.prototype,"_config",void 0),t([gt()],Gt.prototype,"_animated",void 0),t([gt()],Gt.prototype,"_live",void 0),t([gt()],Gt.prototype,"_stops",void 0),Gt=t([pt(yt)],Gt),(window.customCards=window.customCards||[]).push({type:At,name:"Power Gauge Bar Card",description:"A compact linear power gauge — stack one row per device, sharing color levels.",preview:!0,documentationURL:"https://github.com/Lirum-Labs/ha-power-gauge"});let Vt=class extends dt{constructor(){super(...arguments),this._live={},this._animated={},this._targets={},this._ramps={},this._initialized=new Set,this._ambientStart=0,this._loop=()=>{const t=performance.now(),e=this._config?.rolling_numbers??!0,i=(t-this._ambientStart)/1e3,r=e?.012*Math.sin(i*Math.PI*2/2.6):0,n={};for(const i of Object.keys(this._animated)){const s=this._ramps[i];if(s){const e=Ct((t-s.start)/500,0,1);this._animated[i]=St(s.from,s.to,Ot(e)),e>=1&&delete this._ramps[i]}const o=this._animated[i];n[i]=e?o+r*o:o}this._live=n,this._raf=requestAnimationFrame(this._loop)}}static async getConfigElement(){return await Promise.resolve().then(function(){return re}),document.createElement(kt)}static getStubConfig(){return{type:`custom:${At}`,entities:[],max:5e3}}setConfig(t){if(!t)throw new Error("Invalid configuration");if(!Array.isArray(t.entities)||0===t.entities.length)throw new Error("You need to define at least one entity");this._config={min:0,max:5e3,precision:0,rolling_numbers:!0,...t}}getCardSize(){return Math.max(1,this._config?.entities.length??1)}connectedCallback(){super.connectedCallback(),this._ambientStart=performance.now(),this._loop()}disconnectedCallback(){super.disconnectedCallback(),this._raf&&cancelAnimationFrame(this._raf)}willUpdate(t){if(this.hass&&this._config)for(const t of this._config.entities){const e="string"==typeof t?t:t.entity;if(!e)continue;const i=this._readValue(e);null!==i?this._initialized.has(e)?this._targets[e]!==i&&(this._targets[e]=i,this._ramps[e]={from:this._animated[e]??i,to:i,start:performance.now()}):(this._initialized.add(e),this._targets[e]=i,this._animated[e]=i,this._live[e]=i):(this._initialized.delete(e),delete this._targets[e],delete this._animated[e],delete this._live[e],delete this._ramps[e])}}_readValue(t){if(!this.hass)return null;const e=this.hass.states[t];if(!e)return null;const i=e.state.trim();if(""===i||"unavailable"===i||"unknown"===i)return null;const r=Number(i);return Number.isFinite(r)?r:null}_resolveRow(t){if(!this.hass||!this._config)return null;const e="object"==typeof t&&null!==t,i=e?t.entity:t;if(!i)return null;const r=this.hass.states[i],n={...this._config,...e?t:{}},s=n.min??0,o=n.max??5e3,a=n.unit??r?.attributes.unit_of_measurement??"W",l=n.precision??0;return{entity:i,name:e&&t.name||r?.attributes.friendly_name||i,unit:a,precision:l,min:s,max:o,stops:Ft(n)}}render(){if(!this._config||!this.hass)return J;const t=this._config.entities.map(t=>this._resolveRow(t)).filter(t=>null!==t),e=Lt(this._config.background,Nt);return q`
|
||||
<ha-card style=${xt(e)}>
|
||||
<div class="wrap">
|
||||
${this._config.title?q`<div class="card-title">${this._config.title}</div>`:J}
|
||||
<div class="stack">${t.map(t=>this._renderRow(t))}</div>
|
||||
</div>
|
||||
</ha-card>
|
||||
`}_renderRow(t){const e=this._initialized.has(t.entity)&&null!==this._readValue(t.entity),i=this._live[t.entity]??this._animated[t.entity]??0,r=Math.max(1,t.max-t.min),n=e?Ct((i-t.min)/r,0,1):0,s=Pt(n,t.stops),o=e?this._format(i,t.precision):"—";return q`
|
||||
<div
|
||||
class="row ${e?"":"no-data"}"
|
||||
style=${xt({"--c1":s.c1,"--c2":s.c2,"--w":100*n+"%"})}
|
||||
>
|
||||
<div class="label">${t.name}</div>
|
||||
<div class="value">
|
||||
${o}${e?q`<span class="unit">${t.unit}</span>`:J}
|
||||
</div>
|
||||
<div class="track" aria-hidden="true">
|
||||
<div class="fill"></div>
|
||||
<div class="cap"></div>
|
||||
</div>
|
||||
</div>
|
||||
`}_format(t,e){return e<=0?Math.round(t).toLocaleString():t.toLocaleString(void 0,{minimumFractionDigits:e,maximumFractionDigits:e})}};Vt.styles=a`
|
||||
:host {
|
||||
--pg-bg: ${o(Nt)};
|
||||
--pg-text: #eef3ff;
|
||||
--pg-muted: #6b7894;
|
||||
display: block;
|
||||
}
|
||||
|
||||
ha-card {
|
||||
background: var(--pg-bg);
|
||||
color: var(--pg-text);
|
||||
border: 1px solid color-mix(in oklab, currentColor 12%, transparent);
|
||||
border-radius: var(--ha-card-border-radius, 14px);
|
||||
box-shadow:
|
||||
0 12px 28px rgba(0, 0, 0, 0.35),
|
||||
0 0 0 1px color-mix(in oklab, currentColor 2%, transparent) inset;
|
||||
overflow: hidden;
|
||||
font-family: 'Inter', var(--primary-font-family, system-ui, sans-serif);
|
||||
}
|
||||
|
||||
.wrap {
|
||||
padding: 14px 14px 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.4px;
|
||||
text-transform: uppercase;
|
||||
color: color-mix(in oklab, currentColor 70%, transparent);
|
||||
padding: 2px 2px 0;
|
||||
}
|
||||
|
||||
.stack {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.row {
|
||||
--c1: #1ee0ff;
|
||||
--c2: #2a7bff;
|
||||
position: relative;
|
||||
padding: 10px 14px 12px;
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
color-mix(in oklab, currentColor 3%, transparent),
|
||||
color-mix(in oklab, currentColor 0.5%, transparent)
|
||||
);
|
||||
border: 1px solid color-mix(in oklab, currentColor 10%, transparent);
|
||||
box-shadow: inset 0 1px 0 color-mix(in oklab, currentColor 3%, transparent);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
grid-template-rows: auto auto;
|
||||
column-gap: 14px;
|
||||
row-gap: 8px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.label {
|
||||
grid-column: 1;
|
||||
grid-row: 1;
|
||||
font-size: 12px;
|
||||
color: color-mix(in oklab, currentColor 78%, transparent);
|
||||
letter-spacing: 0.2px;
|
||||
font-weight: 500;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.value {
|
||||
grid-column: 2;
|
||||
grid-row: 1;
|
||||
font-family: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
color: var(--pg-text);
|
||||
font-variant-numeric: tabular-nums;
|
||||
letter-spacing: -0.2px;
|
||||
}
|
||||
|
||||
.value .unit {
|
||||
font-size: 11px;
|
||||
color: color-mix(in oklab, currentColor 55%, transparent);
|
||||
margin-left: 4px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.track {
|
||||
grid-column: 1 / -1;
|
||||
grid-row: 2;
|
||||
position: relative;
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background: color-mix(in oklab, currentColor 8%, transparent);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.fill {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: var(--w);
|
||||
border-radius: 999px;
|
||||
background: linear-gradient(90deg, var(--c1), var(--c2));
|
||||
box-shadow:
|
||||
0 0 8px color-mix(in oklab, var(--c1) 50%, transparent),
|
||||
0 0 14px color-mix(in oklab, var(--c2) 30%, transparent);
|
||||
transition: background 0.4s;
|
||||
}
|
||||
|
||||
.cap {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: var(--w);
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50%;
|
||||
background: var(--c1);
|
||||
transform: translate(-50%, -50%);
|
||||
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.5), 0 0 8px var(--c1);
|
||||
}
|
||||
|
||||
.row.no-data .fill,
|
||||
.row.no-data .cap {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.fill {
|
||||
transition: none;
|
||||
}
|
||||
}
|
||||
`,t([ft({attribute:!1})],Vt.prototype,"hass",void 0),t([gt()],Vt.prototype,"_config",void 0),t([gt()],Vt.prototype,"_live",void 0),Vt=t([pt(At)],Vt),console.info("%c POWER-GAUGE %c v0.2.3 ","color:#fff; background:#1ee0ff; font-weight:600; padding:2px 6px; border-radius:3px 0 0 3px;","color:#1ee0ff; background:#0a0f1c; font-weight:600; padding:2px 6px; border-radius:0 3px 3px 0;");const Jt={number:{mode:"box",step:1}},Yt=[{name:"entity",required:!0,selector:{entity:{domain:["sensor","input_number"]}}},{name:"",type:"grid",schema:[{name:"name",selector:{text:{}}},{name:"unit",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"min",selector:Jt},{name:"max",selector:Jt},{name:"precision",selector:{number:{mode:"box",min:0,max:4,step:1}}}]},{name:"rolling_numbers",selector:{boolean:{}}},{name:"background",selector:{text:{}}},{name:"",type:"expandable",title:"Color levels",schema:[{name:"",type:"grid",schema:[{name:"normal",selector:Jt},{name:"normal_color",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"warning",selector:Jt},{name:"warning_color",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"critical",selector:Jt},{name:"critical_color",selector:{text:{}}}]}]}],Zt={entity:"Entity (required)",name:"Name (optional)",unit:"Unit override (optional)",min:"Minimum value",max:"Maximum value",precision:"Decimal places",rolling_numbers:"Rolling numbers (rapid fluctuation around the live value)",background:'Background (CSS color/gradient, "transparent" for HA theme)',normal:"Normal threshold",normal_color:`Normal color (default ${Tt})`,warning:"Warning threshold",warning_color:`Warning color (default ${Ht})`,critical:"Critical threshold",critical_color:`Critical color (default ${jt})`};let Kt=class extends dt{constructor(){super(...arguments),this._computeLabel=t=>Zt[t.name]??t.name}setConfig(t){this._config=t}render(){return this.hass&&this._config?q`
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this._config}
|
||||
.schema=${Yt}
|
||||
.computeLabel=${this._computeLabel}
|
||||
@value-changed=${this._valueChanged}
|
||||
></ha-form>
|
||||
`:J}_valueChanged(t){const e=t.detail;this.dispatchEvent(new CustomEvent("config-changed",{detail:{config:e.value},bubbles:!0,composed:!0}))}};Kt.styles=a`
|
||||
:host {
|
||||
display: block;
|
||||
}
|
||||
ha-form {
|
||||
display: block;
|
||||
}
|
||||
`,t([ft({attribute:!1})],Kt.prototype,"hass",void 0),t([gt()],Kt.prototype,"_config",void 0),Kt=t([pt(wt)],Kt);var Qt=Object.freeze({__proto__:null,get PowerGaugeCardEditor(){return Kt}});const Xt={number:{mode:"box",step:1}},te=[{name:"title",selector:{text:{}}},{name:"entities",required:!0,selector:{entity:{multiple:!0,domain:["sensor","input_number"]}}},{name:"",type:"grid",schema:[{name:"min",selector:Xt},{name:"max",selector:Xt},{name:"precision",selector:{number:{mode:"box",min:0,max:4,step:1}}},{name:"unit",selector:{text:{}}}]},{name:"rolling_numbers",selector:{boolean:{}}},{name:"background",selector:{text:{}}},{name:"",type:"expandable",title:"Color levels",schema:[{name:"",type:"grid",schema:[{name:"normal",selector:Xt},{name:"normal_color",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"warning",selector:Xt},{name:"warning_color",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"critical",selector:Xt},{name:"critical_color",selector:{text:{}}}]}]}],ee={title:"Card title (optional)",entities:"Entities (one bar per entity)",min:"Minimum value",max:"Maximum value",precision:"Decimal places",unit:"Unit override (optional)",rolling_numbers:"Rolling numbers (rapid fluctuation around the live value)",background:'Background (CSS color/gradient, "transparent" for HA theme)',normal:"Normal threshold",normal_color:`Normal color (default ${Tt})`,warning:"Warning threshold",warning_color:`Warning color (default ${Ht})`,critical:"Critical threshold",critical_color:`Critical color (default ${jt})`};let ie=class extends dt{constructor(){super(...arguments),this._computeLabel=t=>ee[t.name]??t.name}setConfig(t){this._config=t}render(){return this.hass&&this._config?q`
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this._config}
|
||||
.schema=${te}
|
||||
.computeLabel=${this._computeLabel}
|
||||
@value-changed=${this._valueChanged}
|
||||
></ha-form>
|
||||
<p class="hint">
|
||||
For per-row overrides (custom name, max, or color per device), edit the
|
||||
card YAML — each entry under <code>entities</code> can be
|
||||
<code>{ entity, name, max, normal, warning, critical, ... }</code>.
|
||||
</p>
|
||||
`:J}_valueChanged(t){const e=t.detail;this.dispatchEvent(new CustomEvent("config-changed",{detail:{config:e.value},bubbles:!0,composed:!0}))}};ie.styles=a`
|
||||
:host {
|
||||
display: block;
|
||||
}
|
||||
ha-form {
|
||||
display: block;
|
||||
}
|
||||
.hint {
|
||||
margin: 12px 4px 0;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #6b7894);
|
||||
}
|
||||
code {
|
||||
font-family: ui-monospace, 'SF Mono', Menlo, monospace;
|
||||
font-size: 11px;
|
||||
background: rgba(127, 127, 127, 0.12);
|
||||
padding: 1px 5px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
`,t([ft({attribute:!1})],ie.prototype,"hass",void 0),t([gt()],ie.prototype,"_config",void 0),ie=t([pt(kt)],ie);var re=Object.freeze({__proto__:null,get PowerGaugeBarCardEditor(){return ie}})}();
|
||||
@@ -0,0 +1,628 @@
|
||||
function t(t,e,i,r){var n,s=arguments.length,o=s<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,i,r);else for(var a=t.length-1;a>=0;a--)(n=t[a])&&(o=(s<3?n(o):s>3?n(e,i,o):n(e,i))||o);return s>3&&o&&Object.defineProperty(e,i,o),o}"function"==typeof SuppressedError&&SuppressedError;const e=globalThis,i=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,r=Symbol(),n=new WeakMap;let s=class{constructor(t,e,i){if(this._$cssResult$=!0,i!==r)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const e=this.t;if(i&&void 0===t){const i=void 0!==e&&1===e.length;i&&(t=n.get(e)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),i&&n.set(e,t))}return t}toString(){return this.cssText}};const o=t=>new s("string"==typeof t?t:t+"",void 0,r),a=(t,...e)=>{const i=1===t.length?t[0]:e.reduce((e,i,r)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[r+1],t[0]);return new s(i,t,r)},l=i?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return o(e)})(t):t,{is:c,defineProperty:d,getOwnPropertyDescriptor:h,getOwnPropertyNames:p,getOwnPropertySymbols:u,getPrototypeOf:m}=Object,f=globalThis,g=f.trustedTypes,_=g?g.emptyScript:"",b=f.reactiveElementPolyfillSupport,v=(t,e)=>t,$={toAttribute(t,e){switch(e){case Boolean:t=t?_:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},x=(t,e)=>!c(t,e),y={attribute:!0,type:String,converter:$,reflect:!1,useDefault:!1,hasChanged:x};Symbol.metadata??=Symbol("metadata"),f.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=y){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,e);void 0!==r&&d(this.prototype,t,r)}}static getPropertyDescriptor(t,e,i){const{get:r,set:n}=h(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:r,set(e){const s=r?.call(this);n?.call(this,e),this.requestUpdate(t,s,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??y}static _$Ei(){if(this.hasOwnProperty(v("elementProperties")))return;const t=m(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(v("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(v("properties"))){const t=this.properties,e=[...p(t),...u(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(l(t))}else void 0!==t&&e.push(l(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((t,r)=>{if(i)t.adoptedStyleSheets=r.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const i of r){const r=document.createElement("style"),n=e.litNonce;void 0!==n&&r.setAttribute("nonce",n),r.textContent=i.cssText,t.appendChild(r)}})(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnecLine truncated
|
||||
<ha-card>
|
||||
<div class="error">Entity not found: ${this._config.entity}</div>
|
||||
</ha-card>
|
||||
`;const e=this._config.min??0,i=this._config.max??5e3,r=Math.max(1,i-e),n=this._initialized&&null!==this._readEntityValue(),s=n?this._live:e,o=n?Ct((s-e)/r,0,1):0,a=Pt(o,this._stops),l=this._config.unit??t.attributes.unit_of_measurement??"W",c=this._config.name??t.attributes.friendly_name??this._config.entity,d=this._config.precision??0,h=n?this._format(s,d):"—",p=n?this._secondaryLine(s,l,a):"NO DATA",u={"--c1":a.c1,"--c2":a.c2,"--c3":a.c3,...Lt(this._config.background,zt)},m=qt+280*o,[f,g]=Rt(It,Wt,Bt,m);return q`
|
||||
<ha-card style=${xt(u)}>
|
||||
<div class="panel">
|
||||
<div class="header">
|
||||
<div>
|
||||
<div class="title">${c}</div>
|
||||
<div class="subtitle">
|
||||
${n?q`Live · ${(i/1e3).toFixed(1)} ${"W"===l?"kW":l} max`:"Awaiting a valid source value"}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stage">
|
||||
<div class="gauge ${n?"":"no-data"}">
|
||||
${this._renderSvg(a,m)}
|
||||
<div class="center">
|
||||
<div class="core">
|
||||
<div class="reading">
|
||||
<div class="label-now">${n?"Live draw":"Source unavailable"}</div>
|
||||
<div class="value">
|
||||
${h}${n?q`<span class="unit-inline">${l}</span>`:J}
|
||||
</div>
|
||||
<div class="unit">${p}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="knob"
|
||||
style=${xt({left:f/400*100+"%",top:g/400*100+"%"})}
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="status">
|
||||
<span
|
||||
><span class="pulse-dot ${n?"":"inactive"}"></span
|
||||
>${n?"Streaming":"No data"}</span
|
||||
>
|
||||
<span>Now <b>${n?`${h} ${l}`:"—"}</b></span>
|
||||
<span>Limit <b>${n?this._formatLimit(i,l):"—"}</b></span>
|
||||
</div>
|
||||
</div>
|
||||
</ha-card>
|
||||
`}_format(t,e){return e<=0?Math.round(t).toLocaleString():t.toLocaleString(void 0,{minimumFractionDigits:e,maximumFractionDigits:e})}_formatLimit(t,e){return"W"===e&&t>=1e3?`${(t/1e3).toFixed(1)} kW`:`${t.toLocaleString()} ${e}`}_secondaryLine(t,e,i){return"W"===e?`${(t/1e3).toFixed(2)} kW · ${i.mood}`:i.mood}_renderSvg(t,e){const i=[],r=(e-qt)/280;for(let e=0;e<=80;e++){const n=e/80,s=qt+280*n,o=e%8==0,a=128,l=Bt-(o?8:14),[c,d]=Rt(It,Wt,a,s),[h,p]=Rt(It,Wt,l,s),u=n<=r;i.push(G`
|
||||
<line
|
||||
x1=${c} y1=${d} x2=${h} y2=${p}
|
||||
stroke=${u?t.c1:"rgba(255,255,255,0.08)"}
|
||||
stroke-width=${o?1.6:1}
|
||||
stroke-linecap="round"
|
||||
opacity=${u?1:.55}
|
||||
style=${u?`filter: drop-shadow(0 0 4px ${t.c1})`:""}
|
||||
/>
|
||||
`)}return q`
|
||||
<svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet">
|
||||
<defs>
|
||||
<linearGradient id="pg-stroke" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color=${t.c1} />
|
||||
<stop offset="60%" stop-color=${t.c2} />
|
||||
<stop offset="100%" stop-color=${t.c3} />
|
||||
</linearGradient>
|
||||
<radialGradient id="pg-halo" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="60%" stop-color="transparent" />
|
||||
<stop offset="80%" stop-color=${t.c2} stop-opacity="0.5" />
|
||||
<stop offset="100%" stop-color="transparent" />
|
||||
</radialGradient>
|
||||
<radialGradient id="pg-aura" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="55%" stop-color="transparent" />
|
||||
<stop offset="72%" stop-color=${t.c1} stop-opacity="0.18" />
|
||||
<stop offset="86%" stop-color=${t.c2} stop-opacity="0.32" />
|
||||
<stop offset="100%" stop-color="transparent" />
|
||||
</radialGradient>
|
||||
<filter id="pg-blur-lg" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="6" />
|
||||
</filter>
|
||||
<filter id="pg-blur-xl" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="14" />
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<g class="spin-slow" style="transform-origin: 200px 200px;">
|
||||
<circle cx=${It} cy=${Wt} r=${174} fill="url(#pg-aura)" opacity="0.9" />
|
||||
</g>
|
||||
|
||||
<path
|
||||
d=${Ut(It,Wt,Bt,qt,410)}
|
||||
stroke="rgba(255,255,255,0.06)"
|
||||
stroke-width="3"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
/>
|
||||
|
||||
<g>${i}</g>
|
||||
|
||||
<path
|
||||
d=${Ut(It,Wt,Bt,qt,e)}
|
||||
stroke=${t.c1}
|
||||
stroke-width="26"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
opacity="0.35"
|
||||
filter="url(#pg-blur-xl)"
|
||||
/>
|
||||
<path
|
||||
d=${Ut(It,Wt,Bt,qt,e)}
|
||||
stroke="url(#pg-stroke)"
|
||||
stroke-width="14"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
opacity="0.6"
|
||||
filter="url(#pg-blur-lg)"
|
||||
/>
|
||||
<path
|
||||
d=${Ut(It,Wt,Bt,qt,e)}
|
||||
stroke="url(#pg-stroke)"
|
||||
stroke-width="3"
|
||||
fill="none"
|
||||
stroke-linecap="round"
|
||||
/>
|
||||
|
||||
<g class="spin-fast" style="transform-origin: 200px 200px;">
|
||||
<circle
|
||||
cx=${It} cy=${Wt} r=${120}
|
||||
fill="none"
|
||||
stroke=${t.c2}
|
||||
stroke-opacity="0.18"
|
||||
stroke-width="1"
|
||||
stroke-dasharray="2 8"
|
||||
/>
|
||||
</g>
|
||||
|
||||
<circle
|
||||
cx=${It} cy=${Wt} r=${114}
|
||||
fill="url(#pg-halo)"
|
||||
opacity="0.7"
|
||||
class="shimmer"
|
||||
/>
|
||||
</svg>
|
||||
`}};Gt.styles=a`
|
||||
:host {
|
||||
--pg-bg: ${o(zt)};
|
||||
--pg-text: #eef3ff;
|
||||
--pg-muted: #6b7894;
|
||||
--c1: #1ee0ff;
|
||||
--c2: #2a7bff;
|
||||
--c3: #0a3aa0;
|
||||
|
||||
display: block;
|
||||
}
|
||||
|
||||
ha-card {
|
||||
background: var(--pg-bg);
|
||||
color: var(--pg-text);
|
||||
border: 1px solid color-mix(in oklab, currentColor 12%, transparent);
|
||||
border-radius: var(--ha-card-border-radius, 16px);
|
||||
box-shadow:
|
||||
0 20px 40px rgba(0, 0, 0, 0.45),
|
||||
0 0 0 1px color-mix(in oklab, currentColor 2%, transparent) inset;
|
||||
overflow: hidden;
|
||||
font-family: 'Inter', var(--primary-font-family, system-ui, sans-serif);
|
||||
}
|
||||
|
||||
.panel {
|
||||
position: relative;
|
||||
padding: 22px 20px 18px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.panel::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
pointer-events: none;
|
||||
background:
|
||||
radial-gradient(1px 1px at 20% 30%, color-mix(in oklab, currentColor 60%, transparent), transparent),
|
||||
radial-gradient(1px 1px at 70% 60%, color-mix(in oklab, currentColor 40%, transparent), transparent),
|
||||
radial-gradient(1px 1px at 40% 80%, color-mix(in oklab, currentColor 50%, transparent), transparent),
|
||||
radial-gradient(1px 1px at 85% 20%, color-mix(in oklab, currentColor 30%, transparent), transparent),
|
||||
radial-gradient(1px 1px at 15% 70%, color-mix(in oklab, currentColor 40%, transparent), transparent);
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
line-height: 1.1;
|
||||
letter-spacing: -0.4px;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: 11px;
|
||||
color: var(--pg-muted);
|
||||
margin-top: 4px;
|
||||
letter-spacing: 0.4px;
|
||||
}
|
||||
|
||||
.stage {
|
||||
flex: 1;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
position: relative;
|
||||
margin: 8px 0;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.gauge {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 320px;
|
||||
aspect-ratio: 1 / 1;
|
||||
}
|
||||
|
||||
.gauge svg {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.center {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.core {
|
||||
width: 56%;
|
||||
height: 56%;
|
||||
border-radius: 50%;
|
||||
background:
|
||||
radial-gradient(circle at 50% 40%, rgba(255, 255, 255, 0.06), transparent 60%),
|
||||
radial-gradient(
|
||||
circle at 50% 100%,
|
||||
color-mix(in oklab, var(--c2) 35%, transparent),
|
||||
transparent 70%
|
||||
),
|
||||
#050912;
|
||||
border: 1px solid rgba(255, 255, 255, 0.06);
|
||||
box-shadow:
|
||||
inset 0 0 40px color-mix(in oklab, var(--c2) 30%, transparent),
|
||||
inset 0 0 0 1px rgba(255, 255, 255, 0.04),
|
||||
0 0 60px color-mix(in oklab, var(--c1) 20%, transparent);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
transition: box-shadow 0.6s;
|
||||
}
|
||||
|
||||
.reading {
|
||||
text-align: center;
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.label-now {
|
||||
font-size: 9px;
|
||||
letter-spacing: 2.5px;
|
||||
color: var(--pg-muted);
|
||||
text-transform: uppercase;
|
||||
font-weight: 600;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.value {
|
||||
font-size: 36px;
|
||||
font-weight: 300;
|
||||
letter-spacing: -1.2px;
|
||||
font-variant-numeric: tabular-nums;
|
||||
/* Always white inside the dark gauge core regardless of card theme. */
|
||||
color: #fff;
|
||||
text-shadow: 0 0 20px color-mix(in oklab, var(--c1) 60%, transparent);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.unit-inline {
|
||||
font-size: 16px;
|
||||
color: color-mix(in oklab, #fff 55%, transparent);
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.unit {
|
||||
font-size: 11px;
|
||||
color: color-mix(in oklab, #fff 55%, transparent);
|
||||
margin-top: 6px;
|
||||
letter-spacing: 1.5px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.knob {
|
||||
position: absolute;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
border-radius: 50%;
|
||||
background: #0a1020;
|
||||
border: 1.5px solid rgba(255, 255, 255, 0.6);
|
||||
transform: translate(-50%, -50%);
|
||||
pointer-events: none;
|
||||
box-shadow:
|
||||
0 0 0 4px rgba(0, 0, 0, 0.4),
|
||||
0 0 20px color-mix(in oklab, var(--c1) 80%, transparent);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.knob::after {
|
||||
content: '';
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: var(--c1);
|
||||
box-shadow: 0 0 8px var(--c1);
|
||||
}
|
||||
|
||||
.status {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
padding: 6px 4px 0;
|
||||
font-size: 11px;
|
||||
color: var(--pg-muted);
|
||||
font-variant-numeric: tabular-nums;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.status b {
|
||||
color: var(--pg-text);
|
||||
font-weight: 600;
|
||||
font-family: 'SF Mono', 'JetBrains Mono', 'Menlo', 'Consolas', ui-monospace, monospace;
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
.pulse-dot {
|
||||
display: inline-block;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 50%;
|
||||
background: var(--c1);
|
||||
margin-right: 6px;
|
||||
animation: pg-pulse 1.4s ease-in-out infinite;
|
||||
box-shadow: 0 0 8px var(--c1);
|
||||
}
|
||||
|
||||
.pulse-dot.inactive {
|
||||
background: var(--pg-muted);
|
||||
animation: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.gauge.no-data .spin-slow,
|
||||
.gauge.no-data .spin-fast,
|
||||
.gauge.no-data .shimmer {
|
||||
animation: none;
|
||||
}
|
||||
|
||||
@keyframes pg-pulse {
|
||||
0%,
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
50% {
|
||||
opacity: 0.4;
|
||||
transform: scale(0.7);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pg-spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.spin-slow {
|
||||
animation: pg-spin 24s linear infinite;
|
||||
transform-origin: 50% 50%;
|
||||
}
|
||||
|
||||
.spin-fast {
|
||||
animation: pg-spin 9s linear infinite reverse;
|
||||
transform-origin: 50% 50%;
|
||||
}
|
||||
|
||||
@keyframes pg-shimmer {
|
||||
0%,
|
||||
100% {
|
||||
opacity: 0.85;
|
||||
}
|
||||
50% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.shimmer {
|
||||
animation: pg-shimmer 2.4s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.error {
|
||||
padding: 16px;
|
||||
color: var(--error-color, #db4437);
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.spin-slow,
|
||||
.spin-fast,
|
||||
.shimmer,
|
||||
.pulse-dot {
|
||||
animation: none;
|
||||
}
|
||||
}
|
||||
`,t([ft({attribute:!1})],Gt.prototype,"hass",void 0),t([gt()],Gt.prototype,"_config",void 0),t([gt()],Gt.prototype,"_animated",void 0),t([gt()],Gt.prototype,"_live",void 0),t([gt()],Gt.prototype,"_stops",void 0),Gt=t([pt(yt)],Gt),(window.customCards=window.customCards||[]).push({type:At,name:"Power Gauge Bar Card",description:"A compact linear power gauge — stack one row per device, sharing color levels.",preview:!0,documentationURL:"https://github.com/Lirum-Labs/ha-power-gauge"});let Vt=class extends dt{constructor(){super(...arguments),this._live={},this._animated={},this._targets={},this._ramps={},this._initialized=new Set,this._ambientStart=0,this._loop=()=>{const t=performance.now(),e=this._config?.rolling_numbers??!0,i=(t-this._ambientStart)/1e3,r=e?.012*Math.sin(i*Math.PI*2/2.6):0,n={};for(const i of Object.keys(this._animated)){const s=this._ramps[i];if(s){const e=Ct((t-s.start)/500,0,1);this._animated[i]=St(s.from,s.to,Ot(e)),e>=1&&delete this._ramps[i]}const o=this._animated[i];n[i]=e?o+r*o:o}this._live=n,this._raf=requestAnimationFrame(this._loop)}}static async getConfigElement(){return await Promise.resolve().then(function(){return re}),document.createElement(kt)}static getStubConfig(){return{type:`custom:${At}`,entities:[],max:5e3}}setConfig(t){if(!t)throw new Error("Invalid configuration");if(!Array.isArray(t.entities)||0===t.entities.length)throw new Error("You need to define at least one entity");this._config={min:0,max:5e3,precision:0,rolling_numbers:!0,...t}}getCardSize(){return Math.max(1,this._config?.entities.length??1)}connectedCallback(){super.connectedCallback(),this._ambientStart=performance.now(),this._loop()}disconnectedCallback(){super.disconnectedCallback(),this._raf&&cancelAnimationFrame(this._raf)}willUpdate(t){if(this.hass&&this._config)for(const t of this._config.entities){const e="string"==typeof t?t:t.entity;if(!e)continue;const i=this._readValue(e);null!==i?this._initialized.has(e)?this._targets[e]!==i&&(this._targets[e]=i,this._ramps[e]={from:this._animated[e]??i,to:i,start:performance.now()}):(this._initialized.add(e),this._targets[e]=i,this._animated[e]=i,this._live[e]=i):(this._initialized.delete(e),delete this._targets[e],delete this._animated[e],delete this._live[e],delete this._ramps[e])}}_readValue(t){if(!this.hass)return null;const e=this.hass.states[t];if(!e)return null;const i=e.state.trim();if(""===i||"unavailable"===i||"unknown"===i)return null;const r=Number(i);return Number.isFinite(r)?r:null}_resolveRow(t){if(!this.hass||!this._config)return null;const e="object"==typeof t&&null!==t,i=e?t.entity:t;if(!i)return null;const r=this.hass.states[i],n={...this._config,...e?t:{}},s=n.min??0,o=n.max??5e3,a=n.unit??r?.attributes.unit_of_measurement??"W",l=n.precision??0;return{entity:i,name:e&&t.name||r?.attributes.friendly_name||i,unit:a,precision:l,min:s,max:o,stops:Ft(n)}}render(){if(!this._config||!this.hass)return J;const t=this._config.entities.map(t=>this._resolveRow(t)).filter(t=>null!==t),e=Lt(this._config.background,Nt);return q`
|
||||
<ha-card style=${xt(e)}>
|
||||
<div class="wrap">
|
||||
${this._config.title?q`<div class="card-title">${this._config.title}</div>`:J}
|
||||
<div class="stack">${t.map(t=>this._renderRow(t))}</div>
|
||||
</div>
|
||||
</ha-card>
|
||||
`}_renderRow(t){const e=this._initialized.has(t.entity)&&null!==this._readValue(t.entity),i=this._live[t.entity]??this._animated[t.entity]??0,r=Math.max(1,t.max-t.min),n=e?Ct((i-t.min)/r,0,1):0,s=Pt(n,t.stops),o=e?this._format(i,t.precision):"—";return q`
|
||||
<div
|
||||
class="row ${e?"":"no-data"}"
|
||||
style=${xt({"--c1":s.c1,"--c2":s.c2,"--w":100*n+"%"})}
|
||||
>
|
||||
<div class="label">${t.name}</div>
|
||||
<div class="value">
|
||||
${o}${e?q`<span class="unit">${t.unit}</span>`:J}
|
||||
</div>
|
||||
<div class="track" aria-hidden="true">
|
||||
<div class="fill"></div>
|
||||
<div class="cap"></div>
|
||||
</div>
|
||||
</div>
|
||||
`}_format(t,e){return e<=0?Math.round(t).toLocaleString():t.toLocaleString(void 0,{minimumFractionDigits:e,maximumFractionDigits:e})}};Vt.styles=a`
|
||||
:host {
|
||||
--pg-bg: ${o(Nt)};
|
||||
--pg-text: #eef3ff;
|
||||
--pg-muted: #6b7894;
|
||||
display: block;
|
||||
}
|
||||
|
||||
ha-card {
|
||||
background: var(--pg-bg);
|
||||
color: var(--pg-text);
|
||||
border: 1px solid color-mix(in oklab, currentColor 12%, transparent);
|
||||
border-radius: var(--ha-card-border-radius, 14px);
|
||||
box-shadow:
|
||||
0 12px 28px rgba(0, 0, 0, 0.35),
|
||||
0 0 0 1px color-mix(in oklab, currentColor 2%, transparent) inset;
|
||||
overflow: hidden;
|
||||
font-family: 'Inter', var(--primary-font-family, system-ui, sans-serif);
|
||||
}
|
||||
|
||||
.wrap {
|
||||
padding: 14px 14px 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.4px;
|
||||
text-transform: uppercase;
|
||||
color: color-mix(in oklab, currentColor 70%, transparent);
|
||||
padding: 2px 2px 0;
|
||||
}
|
||||
|
||||
.stack {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.row {
|
||||
--c1: #1ee0ff;
|
||||
--c2: #2a7bff;
|
||||
position: relative;
|
||||
padding: 10px 14px 12px;
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
color-mix(in oklab, currentColor 3%, transparent),
|
||||
color-mix(in oklab, currentColor 0.5%, transparent)
|
||||
);
|
||||
border: 1px solid color-mix(in oklab, currentColor 10%, transparent);
|
||||
box-shadow: inset 0 1px 0 color-mix(in oklab, currentColor 3%, transparent);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
grid-template-rows: auto auto;
|
||||
column-gap: 14px;
|
||||
row-gap: 8px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.label {
|
||||
grid-column: 1;
|
||||
grid-row: 1;
|
||||
font-size: 12px;
|
||||
color: color-mix(in oklab, currentColor 78%, transparent);
|
||||
letter-spacing: 0.2px;
|
||||
font-weight: 500;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.value {
|
||||
grid-column: 2;
|
||||
grid-row: 1;
|
||||
font-family: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
color: var(--pg-text);
|
||||
font-variant-numeric: tabular-nums;
|
||||
letter-spacing: -0.2px;
|
||||
}
|
||||
|
||||
.value .unit {
|
||||
font-size: 11px;
|
||||
color: color-mix(in oklab, currentColor 55%, transparent);
|
||||
margin-left: 4px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.track {
|
||||
grid-column: 1 / -1;
|
||||
grid-row: 2;
|
||||
position: relative;
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background: color-mix(in oklab, currentColor 8%, transparent);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.fill {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: var(--w);
|
||||
border-radius: 999px;
|
||||
background: linear-gradient(90deg, var(--c1), var(--c2));
|
||||
box-shadow:
|
||||
0 0 8px color-mix(in oklab, var(--c1) 50%, transparent),
|
||||
0 0 14px color-mix(in oklab, var(--c2) 30%, transparent);
|
||||
transition: background 0.4s;
|
||||
}
|
||||
|
||||
.cap {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: var(--w);
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50%;
|
||||
background: var(--c1);
|
||||
transform: translate(-50%, -50%);
|
||||
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.5), 0 0 8px var(--c1);
|
||||
}
|
||||
|
||||
.row.no-data .fill,
|
||||
.row.no-data .cap {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.fill {
|
||||
transition: none;
|
||||
}
|
||||
}
|
||||
`,t([ft({attribute:!1})],Vt.prototype,"hass",void 0),t([gt()],Vt.prototype,"_config",void 0),t([gt()],Vt.prototype,"_live",void 0),Vt=t([pt(At)],Vt),console.info("%c POWER-GAUGE %c v0.2.3 ","color:#fff; background:#1ee0ff; font-weight:600; padding:2px 6px; border-radius:3px 0 0 3px;","color:#1ee0ff; background:#0a0f1c; font-weight:600; padding:2px 6px; border-radius:0 3px 3px 0;");const Jt={number:{mode:"box",step:1}},Yt=[{name:"entity",required:!0,selector:{entity:{domain:["sensor","input_number"]}}},{name:"",type:"grid",schema:[{name:"name",selector:{text:{}}},{name:"unit",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"min",selector:Jt},{name:"max",selector:Jt},{name:"precision",selector:{number:{mode:"box",min:0,max:4,step:1}}}]},{name:"rolling_numbers",selector:{boolean:{}}},{name:"background",selector:{text:{}}},{name:"",type:"expandable",title:"Color levels",schema:[{name:"",type:"grid",schema:[{name:"normal",selector:Jt},{name:"normal_color",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"warning",selector:Jt},{name:"warning_color",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"critical",selector:Jt},{name:"critical_color",selector:{text:{}}}]}]}],Zt={entity:"Entity (required)",name:"Name (optional)",unit:"Unit override (optional)",min:"Minimum value",max:"Maximum value",precision:"Decimal places",rolling_numbers:"Rolling numbers (rapid fluctuation around the live value)",background:'Background (CSS color/gradient, "transparent" for HA theme)',normal:"Normal threshold",normal_color:`Normal color (default ${Tt})`,warning:"Warning threshold",warning_color:`Warning color (default ${Ht})`,critical:"Critical threshold",critical_color:`Critical color (default ${jt})`};let Kt=class extends dt{constructor(){super(...arguments),this._computeLabel=t=>Zt[t.name]??t.name}setConfig(t){this._config=t}render(){return this.hass&&this._config?q`
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this._config}
|
||||
.schema=${Yt}
|
||||
.computeLabel=${this._computeLabel}
|
||||
@value-changed=${this._valueChanged}
|
||||
></ha-form>
|
||||
`:J}_valueChanged(t){const e=t.detail;this.dispatchEvent(new CustomEvent("config-changed",{detail:{config:e.value},bubbles:!0,composed:!0}))}};Kt.styles=a`
|
||||
:host {
|
||||
display: block;
|
||||
}
|
||||
ha-form {
|
||||
display: block;
|
||||
}
|
||||
`,t([ft({attribute:!1})],Kt.prototype,"hass",void 0),t([gt()],Kt.prototype,"_config",void 0),Kt=t([pt(wt)],Kt);var Qt=Object.freeze({__proto__:null,get PowerGaugeCardEditor(){return Kt}});const Xt={number:{mode:"box",step:1}},te=[{name:"title",selector:{text:{}}},{name:"entities",required:!0,selector:{entity:{multiple:!0,domain:["sensor","input_number"]}}},{name:"",type:"grid",schema:[{name:"min",selector:Xt},{name:"max",selector:Xt},{name:"precision",selector:{number:{mode:"box",min:0,max:4,step:1}}},{name:"unit",selector:{text:{}}}]},{name:"rolling_numbers",selector:{boolean:{}}},{name:"background",selector:{text:{}}},{name:"",type:"expandable",title:"Color levels",schema:[{name:"",type:"grid",schema:[{name:"normal",selector:Xt},{name:"normal_color",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"warning",selector:Xt},{name:"warning_color",selector:{text:{}}}]},{name:"",type:"grid",schema:[{name:"critical",selector:Xt},{name:"critical_color",selector:{text:{}}}]}]}],ee={title:"Card title (optional)",entities:"Entities (one bar per entity)",min:"Minimum value",max:"Maximum value",precision:"Decimal places",unit:"Unit override (optional)",rolling_numbers:"Rolling numbers (rapid fluctuation around the live value)",background:'Background (CSS color/gradient, "transparent" for HA theme)',normal:"Normal threshold",normal_color:`Normal color (default ${Tt})`,warning:"Warning threshold",warning_color:`Warning color (default ${Ht})`,critical:"Critical threshold",critical_color:`Critical color (default ${jt})`};let ie=class extends dt{constructor(){super(...arguments),this._computeLabel=t=>ee[t.name]??t.name}setConfig(t){this._config=t}render(){return this.hass&&this._config?q`
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${this._config}
|
||||
.schema=${te}
|
||||
.computeLabel=${this._computeLabel}
|
||||
@value-changed=${this._valueChanged}
|
||||
></ha-form>
|
||||
<p class="hint">
|
||||
For per-row overrides (custom name, max, or color per device), edit the
|
||||
card YAML — each entry under <code>entities</code> can be
|
||||
<code>{ entity, name, max, normal, warning, critical, ... }</code>.
|
||||
</p>
|
||||
`:J}_valueChanged(t){const e=t.detail;this.dispatchEvent(new CustomEvent("config-changed",{detail:{config:e.value},bubbles:!0,composed:!0}))}};ie.styles=a`
|
||||
:host {
|
||||
display: block;
|
||||
}
|
||||
ha-form {
|
||||
display: block;
|
||||
}
|
||||
.hint {
|
||||
margin: 12px 4px 0;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #6b7894);
|
||||
}
|
||||
code {
|
||||
font-family: ui-monospace, 'SF Mono', Menlo, monospace;
|
||||
font-size: 11px;
|
||||
background: rgba(127, 127, 127, 0.12);
|
||||
padding: 1px 5px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
`,t([ft({attribute:!1})],ie.prototype,"hass",void 0),t([gt()],ie.prototype,"_config",void 0),ie=t([pt(kt)],ie);var re=Object.freeze({__proto__:null,get PowerGaugeBarCardEditor(){return ie}});
|
||||
@@ -0,0 +1,276 @@
|
||||
{
|
||||
"0xffffb40e0607ace4": {
|
||||
"energy": 12.43,
|
||||
"state": "ON",
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"voltage": 121.8,
|
||||
"countdown_to_turn_on": 0,
|
||||
"ac_frequency": 60,
|
||||
"power_factor": 0.13,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"power": 0.5,
|
||||
"linkquality": 120,
|
||||
"current": 0.03,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e0607af27": {
|
||||
"state": "ON",
|
||||
"voltage": 121.4,
|
||||
"ac_frequency": 60,
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"power": 2,
|
||||
"current": 0.12,
|
||||
"energy": 23.05,
|
||||
"power_factor": 0.16,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 109,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e0607aee8": {
|
||||
"state": "ON",
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"voltage": 121,
|
||||
"countdown_to_turn_on": 0,
|
||||
"energy": 42.42,
|
||||
"power_factor": 0.88,
|
||||
"ac_frequency": 60,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 83,
|
||||
"power": 82.5,
|
||||
"current": 0.81,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xb40e060fffe031e3": {
|
||||
"battery": 100,
|
||||
"contact": true,
|
||||
"tamper": false,
|
||||
"battery_low": false,
|
||||
"linkquality": 87,
|
||||
"voltage": 3100
|
||||
},
|
||||
"0xffffb40e060762a4": {
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"voltage": 120,
|
||||
"state": "ON",
|
||||
"ac_frequency": 60,
|
||||
"energy": 85.12,
|
||||
"power": 93.3,
|
||||
"current": 0.85,
|
||||
"power_factor": 0.9,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 109,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e0607b680": {
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"voltage": 121.8,
|
||||
"energy": 34.62,
|
||||
"state": "ON",
|
||||
"power": 18.7,
|
||||
"current": 0.26,
|
||||
"ac_frequency": 60,
|
||||
"power_factor": 0.57,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 69,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e060895b3": {
|
||||
"state": "ON",
|
||||
"voltage": 121.6,
|
||||
"ac_frequency": 60,
|
||||
"energy": 5.46,
|
||||
"current": 0.01,
|
||||
"power": 0.1,
|
||||
"power_factor": 0.11,
|
||||
"linkquality": 109,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xffffb40e0608864e": {
|
||||
"led_brightness": 100,
|
||||
"countdown_to_turn_off": 0,
|
||||
"voltage": 121.5,
|
||||
"energy": 15.09,
|
||||
"countdown_to_turn_on": 0,
|
||||
"state": "ON",
|
||||
"current": 0.02,
|
||||
"ac_frequency": 60,
|
||||
"power": 0.3,
|
||||
"power_factor": 0.2,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 112,
|
||||
"power_on_behavior": "on"
|
||||
},
|
||||
"0xb40e060fffe2d218": {
|
||||
"linkquality": 134,
|
||||
"water_leak_buzzer": "OFF",
|
||||
"battery": 0,
|
||||
"water_leak": false,
|
||||
"battery_low": false,
|
||||
"state": "ON",
|
||||
"update": {
|
||||
"state": "available",
|
||||
"installed_version": 66,
|
||||
"latest_version": 73,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/Water_Leak_Sensor_PROD_OTA_V73_v1.00.73.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0xffffb40e060893d8": {
|
||||
"state": "ON",
|
||||
"led_brightness": 100,
|
||||
"voltage": 122.1,
|
||||
"countdown_to_turn_off": 0,
|
||||
"countdown_to_turn_on": 0,
|
||||
"energy": 2.96,
|
||||
"power_on_behavior": "on",
|
||||
"linkquality": 94,
|
||||
"current": 0.03,
|
||||
"ac_frequency": 60,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 268513381,
|
||||
"latest_version": 268513381,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/SmartPlug_Zigbee_PROD_OTA_V101_1.01.01.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"power_factor": 0.07,
|
||||
"power": 0.1
|
||||
},
|
||||
"0xa4c1380d0679ffff": {
|
||||
"battery": 100,
|
||||
"temperature": 27.1,
|
||||
"temperature_units": "celsius",
|
||||
"temperature_calibration": 0,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 4352,
|
||||
"latest_version": 4352,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Sonoff/snzb02lwd_v1.1.0.ota",
|
||||
"latest_release_notes": null
|
||||
},
|
||||
"linkquality": 102
|
||||
},
|
||||
"0xffffb40e0606234b": {
|
||||
"contact": true,
|
||||
"battery_low": false,
|
||||
"battery": 100,
|
||||
"linkquality": 94,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 36,
|
||||
"latest_version": 36,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/GarageDoorSensor_PROD_OTA_V36_v1.00.36.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0x881a14fffe410db3": {
|
||||
"state": "ON",
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 50331681,
|
||||
"latest_version": 50331681,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-ws_release_prod_v50331681_969bee21-eca6-4f10-a4c0-9685c0cd5d52.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
},
|
||||
"brightness": 254,
|
||||
"color_temp": 357,
|
||||
"color_mode": "color_temp",
|
||||
"linkquality": 43
|
||||
},
|
||||
"0x7cc6b6fffe606710": {
|
||||
"state": "ON",
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 16777282,
|
||||
"latest_version": 16777282,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/IKEA/zingo-ww_release_prod_v16777282_a39f1e76-af87-4f04-bd7f-0faf71baf3e4.ota",
|
||||
"latest_release_notes": "https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html"
|
||||
},
|
||||
"brightness": 254,
|
||||
"linkquality": 36
|
||||
},
|
||||
"0xb40e060fffe717c5": {
|
||||
"battery": 100,
|
||||
"occupancy": false,
|
||||
"tamper": false,
|
||||
"battery_low": false,
|
||||
"linkquality": 65,
|
||||
"voltage": 3100,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 79,
|
||||
"latest_version": 79,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/Motion_Sensor_PROD_OTA_V79_v1.00.79.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
},
|
||||
"0xb40e060fffe7180a": {
|
||||
"battery": 100,
|
||||
"occupancy": false,
|
||||
"tamper": false,
|
||||
"battery_low": false,
|
||||
"linkquality": 91,
|
||||
"voltage": 3200,
|
||||
"update": {
|
||||
"state": "idle",
|
||||
"installed_version": 79,
|
||||
"latest_version": 79,
|
||||
"latest_source": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/ThirdReality/Motion_Sensor_PROD_OTA_V79_v1.00.79.ota",
|
||||
"latest_release_notes": null
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user