diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index ca4c70952a5..c609432dacc 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -51,9 +51,8 @@ speakers. The writing needs to be inclusive, objective, and not gender biased, polarizing, or discriminatory. We want to be welcoming to all users. -Write towards the reader directly, and not a group of users. Write from a second-person perspective, using "you" and "your" instead of "the user" -second-person perspective, using "you" and "your" instead of "the user" -or "users". +Write towards the reader directly, and not a group of users. +Write from a second-person perspective, using "you" and "your" instead of "the user" or "users". Make the text feel personal and friendly, as if you are talking to a friend who really enjoys technology and enjoys this hobby of home automation. Write in diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 11bf3a90ee4..f9aa349030a 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -11,7 +11,7 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v5.0.1 + - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 if: ${{ github.repository_owner == 'home-assistant' }} with: github-token: ${{ github.token }} diff --git a/.github/workflows/restrict-task-creation.yml b/.github/workflows/restrict-task-creation.yml index a3fbe2bb7f7..83653b159e9 100644 --- a/.github/workflows/restrict-task-creation.yml +++ b/.github/workflows/restrict-task-creation.yml @@ -12,7 +12,7 @@ jobs: if: github.event.issue.type.name == 'Task' steps: - name: Check if user is authorized - uses: actions/github-script@v7 + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 with: script: | const issueAuthor = context.payload.issue.user.login; diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index f41d0bbeda0..3d510c891e8 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -12,7 +12,7 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/stale@v9.1.0 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0 if: ${{ github.repository_owner == 'home-assistant' }} with: repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fb127a1aea5..32e77e985cb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,9 +8,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out files from GitHub - uses: actions/checkout@v5.0.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setting up Node.js - uses: actions/setup-node@v4.4.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 20 cache: "npm" @@ -35,9 +35,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out files from GitHub - uses: actions/checkout@v5.0.0 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Setting up Node.js - uses: actions/setup-node@v4.4.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: 20 cache: "npm" diff --git a/.gitignore b/.gitignore index 878022feb08..4cbffa1091d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,10 @@ source/_data/blueprint_exchange_data.json source/_data/version_data.json source/_data/alerts_data.json source/_data/language_scores.json +source/_data/codeowners.json source/_stash +source/stylesheets/homeassistant/pages/connect/zwa-2/index.css +source/stylesheets/homeassistant/pages/community/index.css source/stylesheets/screen.css source/.jekyll-cache/ vendor diff --git a/.vscode/cSpell.json b/.vscode/cSpell.json index 8fd7b5cbd2f..3e70c11caa2 100644 --- a/.vscode/cSpell.json +++ b/.vscode/cSpell.json @@ -11,6 +11,7 @@ "autodiscovery", "autoheal", "automations", + "Backblaze", "balloob", "bloomsky", "Bluesound", diff --git a/CODEOWNERS b/CODEOWNERS index 5f8e14280a4..92bd374ac12 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -8,6 +8,11 @@ # https://github.com/blog/2392-introducing-code-owners # Pages + +# Non-integration pages (manually maintained) +source/privacy/index.markdown @frenck + +# Integration pages (auto-synced from core) source/_integrations/3_day_blinds.markdown @starkillerOG source/_integrations/_integration_docs_template.markdown @home-assistant/core source/_integrations/abode.markdown @shred86 @@ -15,6 +20,7 @@ source/_integrations/acaia.markdown @zweckj source/_integrations/accuweather.markdown @bieniu source/_integrations/acmeda.markdown @atmurray source/_integrations/acomax.markdown @starkillerOG +source/_integrations/actron_air.markdown @kclif9 @JagadishDhanamjayam source/_integrations/adax.markdown @danielhiversen @lazytarget source/_integrations/adguard.markdown @frenck source/_integrations/ads.markdown @mrpasztoradam @@ -38,6 +44,7 @@ source/_integrations/airvisual.markdown @bachya source/_integrations/airvisual_pro.markdown @bachya source/_integrations/airzone.markdown @Noltari source/_integrations/airzone_cloud.markdown @Noltari +source/_integrations/aladdin_connect.markdown @swcloudgenie source/_integrations/alarm_control_panel.markdown @home-assistant/core source/_integrations/alert.markdown @home-assistant/core @frenck source/_integrations/alexa.markdown @home-assistant/cloud @ochlocracy @jbouwh @@ -50,7 +57,7 @@ source/_integrations/ambient_network.markdown @thomaskistler source/_integrations/ambient_station.markdown @bachya source/_integrations/amcrest.markdown @flacjacket source/_integrations/amp_motorization.markdown @starkillerOG -source/_integrations/analytics.markdown @home-assistant/core @ludeeus +source/_integrations/analytics.markdown @home-assistant/core source/_integrations/analytics_insights.markdown @joostlek source/_integrations/android_ip_webcam.markdown @engrbm87 source/_integrations/androidtv.markdown @JeffLIrion @ollo69 @@ -77,8 +84,8 @@ source/_integrations/arcam_fmj.markdown @elupus source/_integrations/arris_tg2492lg.markdown @vanbalken source/_integrations/arve.markdown @ikalnyi source/_integrations/aseko_pool_live.markdown @milanmeu -source/_integrations/assist_pipeline.markdown @balloob @synesthesiam -source/_integrations/assist_satellite.markdown @home-assistant/core @synesthesiam +source/_integrations/assist_pipeline.markdown @synesthesiam @arturpragacz +source/_integrations/assist_satellite.markdown @home-assistant/core @synesthesiam @arturpragacz source/_integrations/asuswrt.markdown @kennedyshead @ollo69 @Vaskivskyi source/_integrations/atag.markdown @MatsNL source/_integrations/aten_pe.markdown @mtdcr @@ -166,12 +173,13 @@ source/_integrations/comelit.markdown @chemelli74 source/_integrations/comfoconnect.markdown @michaelarnauts source/_integrations/command_line.markdown @gjohansson-ST source/_integrations/compensation.markdown @Petro31 +source/_integrations/compit.markdown @Przemko92 source/_integrations/coned.markdown @tronikos source/_integrations/config.markdown @home-assistant/core source/_integrations/configurator.markdown @home-assistant/core source/_integrations/constructa.markdown @DavidMStraub @Diegorro98 @MartinHjelmare source/_integrations/control4.markdown @lawtancool -source/_integrations/conversation.markdown @home-assistant/core @synesthesiam +source/_integrations/conversation.markdown @home-assistant/core @synesthesiam @arturpragacz source/_integrations/cookidoo.markdown @miaucl source/_integrations/coolmaster.markdown @OnFreund source/_integrations/counter.markdown @fabaff @@ -180,6 +188,7 @@ source/_integrations/cozytouch.markdown @imicknl source/_integrations/cpuspeed.markdown @fabaff source/_integrations/cribl.markdown @Bre77 source/_integrations/crownstone.markdown @Crownstone @RicArch97 +source/_integrations/cync.markdown @Kinachi249 source/_integrations/dacia.markdown @epenet source/_integrations/daikin.markdown @fredrike source/_integrations/date.markdown @home-assistant/core @@ -237,6 +246,7 @@ source/_integrations/ecowitt.markdown @pvizeli source/_integrations/efergy.markdown @tkdrob source/_integrations/egardia.markdown @jeroenterheerdt source/_integrations/eheimdigital.markdown @autinerd +source/_integrations/ekeybionyx.markdown @richardpolzer source/_integrations/electrasmart.markdown @jafar-atili source/_integrations/electric_kiwi.markdown @mikey0000 source/_integrations/elevenlabs.markdown @sorgfresser @@ -256,8 +266,6 @@ source/_integrations/energie_vanons.markdown @klaasnicolaas source/_integrations/energy.markdown @home-assistant/core source/_integrations/energyzero.markdown @klaasnicolaas source/_integrations/enigma2.markdown @autinerd -source/_integrations/enmax.markdown @tronikos -source/_integrations/enocean.markdown @bdurrer source/_integrations/enphase_envoy.markdown @bdraco @cgarwood @catsmanac source/_integrations/entur_public_transport.markdown @hfurubotten source/_integrations/environment_canada.markdown @gwww @michaeldavie @@ -272,7 +280,6 @@ source/_integrations/esphome.markdown @jesserockz @kbx81 @bdraco source/_integrations/eufylife_ble.markdown @bdr99 source/_integrations/event.markdown @home-assistant/core source/_integrations/evergy.markdown @tronikos -source/_integrations/evil_genius_labs.markdown @balloob source/_integrations/evohome.markdown @zxdavb source/_integrations/ezviz.markdown @RenierM26 source/_integrations/faa_delays.markdown @ntilley905 @@ -284,7 +291,9 @@ source/_integrations/file.markdown @fabaff source/_integrations/file_upload.markdown @home-assistant/core source/_integrations/filesize.markdown @gjohansson-ST source/_integrations/filter.markdown @dgomes +source/_integrations/fing.markdown @Lorenzo-Gasparini source/_integrations/fire_tv.markdown @JeffLIrion @ollo69 +source/_integrations/firefly_iii.markdown @erwindouna source/_integrations/fireservicerota.markdown @cyberjunky source/_integrations/firmata.markdown @DaAwesomeP source/_integrations/fitbit.markdown @allenporter @@ -292,7 +301,6 @@ source/_integrations/fivem.markdown @Sander0542 source/_integrations/fjaraskupan.markdown @elupus source/_integrations/flexit_bacnet.markdown @lellky @piotrbulinski source/_integrations/flexom.markdown @imicknl -source/_integrations/flick_electric.markdown @ZephireNZ source/_integrations/flipr.markdown @cnico source/_integrations/flo.markdown @dmulcahey source/_integrations/flume.markdown @ChrisMandich @bdraco @jeeftor @@ -300,8 +308,8 @@ source/_integrations/flux_led.markdown @icemanch source/_integrations/forecast_solar.markdown @klaasnicolaas @frenck source/_integrations/forked_daapd.markdown @uvjustin source/_integrations/fortios.markdown @kimfrellsen -source/_integrations/foscam.markdown @krmarien -source/_integrations/frankever.markdown @balloob @bieniu @thecode @chemelli74 @bdraco +source/_integrations/foscam.markdown @Foscam-wangzhengyu +source/_integrations/frankever.markdown @bieniu @thecode @chemelli74 @bdraco source/_integrations/freebox.markdown @hacf-fr @Quentame source/_integrations/freedompro.markdown @stefano055415 source/_integrations/fritz.markdown @AaronDavidSchneider @chemelli74 @mib1185 @@ -340,7 +348,6 @@ source/_integrations/google_assistant.markdown @home-assistant/cloud source/_integrations/google_assistant_sdk.markdown @tronikos source/_integrations/google_cloud.markdown @lufton @tronikos source/_integrations/google_drive.markdown @tronikos -source/_integrations/google_gemini.markdown @tronikos @ivanlh source/_integrations/google_generative_ai_conversation.markdown @tronikos @ivanlh source/_integrations/google_mail.markdown @tkdrob source/_integrations/google_photos.markdown @allenporter @@ -353,6 +360,7 @@ source/_integrations/gpsd.markdown @fabaff @jrieger source/_integrations/gree.markdown @cmroche source/_integrations/greeneye_monitor.markdown @jkeljo source/_integrations/group.markdown @home-assistant/core +source/_integrations/growatt_server.markdown @johanzander source/_integrations/guardian.markdown @bachya source/_integrations/habitica.markdown @tr4nt0r source/_integrations/hardware.markdown @home-assistant/core @@ -395,7 +403,7 @@ source/_integrations/honeywell.markdown @rdfurman @mkmer source/_integrations/html5.markdown @alexyao2015 source/_integrations/http.markdown @home-assistant/core source/_integrations/huawei_lte.markdown @scop @fphammerle -source/_integrations/hue.markdown @balloob @marcelveldt +source/_integrations/hue.markdown @marcelveldt source/_integrations/huisbaasje.markdown @dennisschroer source/_integrations/humidifier.markdown @home-assistant/core @Shulyaka source/_integrations/hunterdouglas_powerview.markdown @bdraco @kingy444 @trullock @@ -423,6 +431,7 @@ source/_integrations/immich.markdown @mib1185 source/_integrations/improv_ble.markdown @emontnemery source/_integrations/incomfort.markdown @jbouwh source/_integrations/indianamichiganpower.markdown @tronikos +source/_integrations/inels.markdown @epdevlab source/_integrations/influxdb.markdown @mdegat01 source/_integrations/inkbird.markdown @bdraco source/_integrations/input_boolean.markdown @home-assistant/core @@ -436,7 +445,7 @@ source/_integrations/insteon.markdown @teharris1 source/_integrations/integration.markdown @dgomes source/_integrations/intellifire.markdown @jeeftor source/_integrations/intesishome.markdown @jnimmo -source/_integrations/iometer.markdown @MaestroOnICe +source/_integrations/iometer.markdown @jukrebs source/_integrations/ios.markdown @robbiet480 source/_integrations/iotawatt.markdown @gtdiehl @jyavenard source/_integrations/iotty.markdown @shapournemati-iotty @@ -445,6 +454,7 @@ source/_integrations/ipma.markdown @dgomes source/_integrations/ipp.markdown @ctalkington source/_integrations/iqvia.markdown @bachya source/_integrations/irish_rail_transport.markdown @ttroy50 +source/_integrations/irm_kmi.markdown @jdejaegh source/_integrations/iron_os.markdown @tr4nt0r source/_integrations/isal.markdown @bdraco source/_integrations/iskra.markdown @iskramis @@ -476,6 +486,7 @@ source/_integrations/knocki.markdown @joostlek @jgatto1 @JakeBosh source/_integrations/knx.markdown @Julius2342 @farmio @marvin-w source/_integrations/kodi.markdown @OnFreund source/_integrations/konnected.markdown @heythisisnate +source/_integrations/konnected_esphome.markdown @jesserockz @kbx81 @bdraco source/_integrations/kostal_plenticore.markdown @stegm source/_integrations/kraken.markdown @eifinger source/_integrations/krispol.markdown @starkillerOG @@ -498,11 +509,12 @@ source/_integrations/letpot.markdown @jpelgrom source/_integrations/leviton_z_wave.markdown @home-assistant/z-wave source/_integrations/lg_netcast.markdown @Drafteed @splinter98 source/_integrations/lg_thinq.markdown @LG-ThinQ-Integration +source/_integrations/libre_hardware_monitor.markdown @Sab44 source/_integrations/lidarr.markdown @tkdrob source/_integrations/lifx.markdown @Djelibeybi source/_integrations/light.markdown @home-assistant/core source/_integrations/linak.markdown @abmantis -source/_integrations/linkedgo.markdown @balloob @bieniu @thecode @chemelli74 @bdraco +source/_integrations/linkedgo.markdown @bieniu @thecode @chemelli74 @bdraco source/_integrations/linkplay.markdown @Velleman source/_integrations/linux_battery.markdown @fabaff source/_integrations/linx.markdown @starkillerOG @@ -520,6 +532,7 @@ source/_integrations/lookin.markdown @ANMalko @bdraco source/_integrations/loqed.markdown @mikewoudenberg source/_integrations/luci.markdown @mzdrale source/_integrations/luftdaten.markdown @fabaff @frenck +source/_integrations/lunatone.markdown @MoonDevLT source/_integrations/lupusec.markdown @majuss @suaveolent source/_integrations/lutron.markdown @cdheiser @wilburCForce source/_integrations/lutron_caseta.markdown @swails @danaues @eclair4151 @@ -548,6 +561,7 @@ source/_integrations/melnor.markdown @vanstinator source/_integrations/met.markdown @danielhiversen source/_integrations/met_eireann.markdown @DylanGore source/_integrations/meteo_france.markdown @hacf-fr @oncleben31 @Quentame +source/_integrations/meteo_lt.markdown @xE1H source/_integrations/meteoalarm.markdown @rolfberkenbosch source/_integrations/meteoclimatic.markdown @adrianmo source/_integrations/metoffice.markdown @MrHarcombe @avee87 @@ -589,8 +603,9 @@ source/_integrations/nam.markdown @bieniu source/_integrations/nanoleaf.markdown @milanmeu @joostlek source/_integrations/nasweb.markdown @nasWebio source/_integrations/national_grid_us.markdown @tronikos -source/_integrations/nederlandse_spoorwegen.markdown @YarmoM +source/_integrations/nederlandse_spoorwegen.markdown @YarmoM @heindrichpaul source/_integrations/neff.markdown @DavidMStraub @Diegorro98 @MartinHjelmare +source/_integrations/neo.markdown @bieniu @thecode @chemelli74 @bdraco source/_integrations/ness_alarm.markdown @nickw444 source/_integrations/nest.markdown @allenporter source/_integrations/netatmo.markdown @cgtobi @@ -610,6 +625,7 @@ source/_integrations/nightscout.markdown @marciogranzotto source/_integrations/niko_home_control.markdown @VandeurenGlenn source/_integrations/nilu.markdown @hfurubotten source/_integrations/nina.markdown @DeerMaximum +source/_integrations/nintendo_parental_controls.markdown @pantherale0 source/_integrations/nissan_leaf.markdown @filcole source/_integrations/noaa_tides.markdown @jdelaney72 source/_integrations/nobo_hub.markdown @echoromeo @oyvindwe @@ -632,7 +648,7 @@ source/_integrations/nyt_games.markdown @joostlek source/_integrations/nzbget.markdown @chriscla source/_integrations/obihai.markdown @dshokouhi @ejpenney source/_integrations/octoprint.markdown @rfleming71 -source/_integrations/ogemray.markdown @balloob @bieniu @thecode @chemelli74 @bdraco +source/_integrations/ogemray.markdown @bieniu @thecode @chemelli74 @bdraco source/_integrations/ohmconnect.markdown @robbiet480 source/_integrations/ohme.markdown @dan-r source/_integrations/ollama.markdown @synesthesiam @@ -645,11 +661,11 @@ source/_integrations/onkyo.markdown @arturpragacz @eclair4151 source/_integrations/onvif.markdown @hunterjm @jterrace source/_integrations/open_meteo.markdown @frenck source/_integrations/open_router.markdown @joostlek -source/_integrations/openai_conversation.markdown @balloob source/_integrations/openerz.markdown @misialq source/_integrations/openexchangerates.markdown @MartinHjelmare source/_integrations/opengarage.markdown @danielhiversen source/_integrations/openhome.markdown @bazwilliams +source/_integrations/openrgb.markdown @felipecrs source/_integrations/opensky.markdown @joostlek source/_integrations/opentherm_gw.markdown @mvn23 source/_integrations/openuv.markdown @bachya @@ -684,15 +700,16 @@ source/_integrations/pi_hole.markdown @shenxn source/_integrations/picnic.markdown @corneyl @codesalatdev source/_integrations/pinecil.markdown @tr4nt0r source/_integrations/ping.markdown @jpbede -source/_integrations/piper.markdown @balloob @synesthesiam +source/_integrations/piper.markdown @synesthesiam source/_integrations/pitsos.markdown @DavidMStraub @Diegorro98 @MartinHjelmare source/_integrations/plaato.markdown @JohNan source/_integrations/playstation_network.markdown @jackjpowell @tr4nt0r source/_integrations/plex.markdown @jjlawren source/_integrations/plugwise.markdown @CoMPaTech @bouwew -source/_integrations/plum_lightpad.markdown @ColinHarrington @prystupa source/_integrations/point.markdown @fredrike +source/_integrations/pooldose.markdown @lmaertin source/_integrations/poolsense.markdown @haemishkyd +source/_integrations/portainer.markdown @erwindouna source/_integrations/portlandgeneral.markdown @tronikos source/_integrations/powerfox.markdown @klaasnicolaas source/_integrations/powerwall.markdown @bdraco @jrester @daniel-simpson @@ -705,7 +722,6 @@ source/_integrations/prometheus.markdown @knyar source/_integrations/prosegur.markdown @dgomes source/_integrations/proximity.markdown @mib1185 source/_integrations/proxmoxve.markdown @jhollowe @Corbeno -source/_integrations/prusalink.markdown @balloob source/_integrations/ps4.markdown @ktnrg45 source/_integrations/pse.markdown @tronikos source/_integrations/psoklahoma.markdown @tronikos @@ -758,7 +774,7 @@ source/_integrations/rest_command.markdown @jpbede source/_integrations/rexel.markdown @imicknl source/_integrations/rflink.markdown @javicalle source/_integrations/rfxtrx.markdown @danielhiversen @elupus @RobBie1221 -source/_integrations/rhasspy.markdown @balloob @synesthesiam +source/_integrations/rhasspy.markdown @synesthesiam source/_integrations/ridwell.markdown @bachya source/_integrations/ring.markdown @sdb9696 source/_integrations/risco.markdown @OnFreund @@ -769,6 +785,7 @@ source/_integrations/roku.markdown @ctalkington source/_integrations/romy.markdown @xeniter source/_integrations/roomba.markdown @pschmitt @cyr-ius @shenxn @Orhideous source/_integrations/roon.markdown @pavoni +source/_integrations/route_b_smart_meter.markdown @SeraphicRav source/_integrations/rpi_power.markdown @shenxn @swetoast source/_integrations/rss_feed_template.markdown @home-assistant/core source/_integrations/ruckus_unleashed.markdown @lanrat @ms264556 @gabe565 @@ -782,6 +799,7 @@ source/_integrations/saj.markdown @fredericvl source/_integrations/samsam.markdown @klaasnicolaas source/_integrations/samsungtv.markdown @chemelli74 @epenet source/_integrations/sanix.markdown @tomaszsluszniak +source/_integrations/satel_integra.markdown @Tommatheussen source/_integrations/scene.markdown @home-assistant/core source/_integrations/schedule.markdown @home-assistant/core source/_integrations/schlage.markdown @dknowles2 @@ -809,9 +827,10 @@ source/_integrations/serial.markdown @fabaff source/_integrations/seven_segments.markdown @fabaff source/_integrations/seventeentrack.markdown @shaiu source/_integrations/sfr_box.markdown @epenet -source/_integrations/sharkiq.markdown @JeffResc @funkybunch +source/_integrations/sftp_storage.markdown @maretodoric +source/_integrations/sharkiq.markdown @JeffResc @funkybunch @TheOneOgre source/_integrations/shell_command.markdown @home-assistant/core -source/_integrations/shelly.markdown @balloob @bieniu @thecode @chemelli74 @bdraco +source/_integrations/shelly.markdown @bieniu @thecode @chemelli74 @bdraco source/_integrations/shodan.markdown @fabaff source/_integrations/sia.markdown @eavanvalkenburg source/_integrations/siemens.markdown @DavidMStraub @Diegorro98 @MartinHjelmare @@ -851,7 +870,7 @@ source/_integrations/snapcast.markdown @luar123 source/_integrations/snmp.markdown @nmaggioni source/_integrations/snoo.markdown @Lash-L source/_integrations/snooz.markdown @AustinBrunkhorst -source/_integrations/solaredge.markdown @frenck @bdraco +source/_integrations/solaredge.markdown @frenck @bdraco @tronikos source/_integrations/solaredge_local.markdown @drobtravels @scheric source/_integrations/solarlog.markdown @Ernst79 @dontinelli source/_integrations/solax.markdown @squishykid @Darsstar @@ -880,6 +899,7 @@ source/_integrations/stt.markdown @home-assistant/core source/_integrations/subaru.markdown @G-Two source/_integrations/suez_water.markdown @ooii @jb101010-2 source/_integrations/sun.markdown @home-assistant/core +source/_integrations/sunricher_dali_center.markdown @niracler source/_integrations/supla.markdown @mwegrzynek source/_integrations/surepetcare.markdown @benleb @danielhiversen source/_integrations/swepco.markdown @tronikos @@ -889,7 +909,7 @@ source/_integrations/switch.markdown @home-assistant/core source/_integrations/switch_as_x.markdown @home-assistant/core source/_integrations/switchbee.markdown @jafar-atili source/_integrations/switchbot.markdown @danielhiversen @RenierM26 @murtas @Eloston @dsypniewski @zerzhang -source/_integrations/switchbot_cloud.markdown @SeraphicRav @laurence-presland @Gigatrappeur +source/_integrations/switchbot_cloud.markdown @SeraphicRav @laurence-presland @Gigatrappeur @XiaoLing-git source/_integrations/switcher_kis.markdown @thecode @YogevBokobza source/_integrations/switchmate.markdown @danielhiversen @qiz-li source/_integrations/symfonisk.markdown @jjlawren @peterager @@ -900,7 +920,7 @@ source/_integrations/synology_srm.markdown @aerialls source/_integrations/system_bridge.markdown @timmo001 source/_integrations/systemmonitor.markdown @gjohansson-ST source/_integrations/tado.markdown @erwindouna -source/_integrations/tag.markdown @balloob @dmulcahey +source/_integrations/tag.markdown @home-assistant/core source/_integrations/tailscale.markdown @frenck source/_integrations/tailwind.markdown @frenck source/_integrations/tami4.markdown @Guy293 @@ -972,6 +992,7 @@ source/_integrations/uprise_smart_shades.markdown @starkillerOG source/_integrations/uptime.markdown @frenck source/_integrations/uptime_kuma.markdown @tr4nt0r source/_integrations/uptimerobot.markdown @ludeeus @chemelli74 +source/_integrations/usage_prediction.markdown @home-assistant/core source/_integrations/usb.markdown @bdraco source/_integrations/usgs_earthquakes_feed.markdown @exxamalte source/_integrations/utility_meter.markdown @dgomes @@ -981,23 +1002,23 @@ source/_integrations/vallox.markdown @andre-richter @slovdahl @viiru- @yozik04 source/_integrations/valve.markdown @home-assistant/core source/_integrations/vegehub.markdown @ghowevege source/_integrations/velbus.markdown @Cereal2nd @brefra -source/_integrations/velux.markdown @Julius2342 @DeerMaximum @pawlizio +source/_integrations/velux.markdown @Julius2342 @DeerMaximum @pawlizio @wollew source/_integrations/venstar.markdown @garbled1 @jhollowe source/_integrations/vermont_castings.markdown @jeeftor source/_integrations/versasense.markdown @imstevenxyz source/_integrations/version.markdown @ludeeus -source/_integrations/vesync.markdown @markperdue @webdjoe @thegardenmonkey @cdnninja @iprak +source/_integrations/vesync.markdown @markperdue @webdjoe @thegardenmonkey @cdnninja @iprak @sapuseven source/_integrations/vicare.markdown @CFenner +source/_integrations/victron_remote_monitoring.markdown @AndyTempel source/_integrations/vilfo.markdown @ManneW source/_integrations/vivotek.markdown @HarlemSquirrel source/_integrations/vizio.markdown @raman325 source/_integrations/vlc_telnet.markdown @rodripf @MartinHjelmare source/_integrations/vodafone_station.markdown @paoloantinori @chemelli74 source/_integrations/voice_assistant.markdown @balloob @synesthesiam -source/_integrations/voip.markdown @balloob @synesthesiam @jaminh +source/_integrations/voip.markdown @synesthesiam @jaminh source/_integrations/volumio.markdown @OnFreund source/_integrations/volvo.markdown @thomasddn -source/_integrations/volvooncall.markdown @molobrakos source/_integrations/wake_on_lan.markdown @ntilley905 source/_integrations/wake_word.markdown @home-assistant/core @synesthesiam source/_integrations/wallbox.markdown @hesselonline @@ -1019,7 +1040,7 @@ source/_integrations/websocket_api.markdown @home-assistant/core source/_integrations/weheat.markdown @jesperraemaekers source/_integrations/wemo.markdown @esev source/_integrations/whirlpool.markdown @abmantis @mkmer -source/_integrations/whisper.markdown @balloob @synesthesiam +source/_integrations/whisper.markdown @synesthesiam source/_integrations/whois.markdown @frenck source/_integrations/wiffi.markdown @mampfes source/_integrations/wilight.markdown @leofig-rj @@ -1032,7 +1053,7 @@ source/_integrations/wolflink.markdown @adamkrol93 @mtielen source/_integrations/workday.markdown @fabaff @gjohansson-ST source/_integrations/worldclock.markdown @fabaff source/_integrations/ws66i.markdown @ssaenger -source/_integrations/wyoming.markdown @balloob @synesthesiam +source/_integrations/wyoming.markdown @synesthesiam source/_integrations/xbox.markdown @hunterjm source/_integrations/xiaomi_aqara.markdown @danielhiversen @syssi source/_integrations/xiaomi_ble.markdown @Jc2k @Ernst79 diff --git a/Gemfile b/Gemfile index 7f5b289baec..10442ca3a42 100644 --- a/Gemfile +++ b/Gemfile @@ -3,16 +3,16 @@ source 'https://rubygems.org' ruby '> 2.5.0' group :development do - gem 'rake', '13.3.0' + gem 'rake', '13.3.1' gem 'jekyll', '4.4.1' gem 'compass', '1.0.3' gem 'sass-globbing', '1.1.5' gem 'stringex', '2.8.6' # > 2.1.0 causes slowdowns https://github.com/sass/sassc-ruby/issues/189 gem 'sassc', '2.1.0' - gem 'sass-embedded', '1.91.0' - gem 'rubocop', '1.80.1' - gem 'ruby-lsp', '0.26.1' + gem 'sass-embedded', '1.93.2' + gem 'rubocop', '1.81.7' + gem 'ruby-lsp', '0.26.2' gem 'rackup', '2.2.1' end @@ -23,8 +23,8 @@ group :jekyll_plugins do gem 'jekyll-toc', '0.19.0' end -gem 'sinatra', '4.1.1' -gem 'nokogiri', '1.18.9' +gem 'sinatra', '4.2.1' +gem 'nokogiri', '1.18.10' # Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem # and associated library diff --git a/Gemfile.lock b/Gemfile.lock index 569a27516e9..612542e5d9e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,10 +5,10 @@ GEM public_suffix (>= 2.0.2, < 7.0) ast (2.4.3) base64 (0.3.0) - bigdecimal (3.2.2) + bigdecimal (3.3.1) chunky_png (1.4.0) colorator (1.1.0) - commonmarker (0.23.11) + commonmarker (0.23.12) compass (1.0.3) chunky_png (~> 1.2) compass-core (~> 1.0.2) @@ -30,10 +30,10 @@ GEM ffi (1.17.2-arm64-darwin) ffi (1.17.2-x86_64-linux-gnu) forwardable-extended (2.6.0) - google-protobuf (4.32.0-arm64-darwin) + google-protobuf (4.33.0-arm64-darwin) bigdecimal rake (>= 13) - google-protobuf (4.32.0-x86_64-linux-gnu) + google-protobuf (4.33.0-x86_64-linux-gnu) bigdecimal rake (>= 13) http_parser.rb (0.8.0) @@ -70,7 +70,7 @@ GEM nokogiri (~> 1.12) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.13.2) + json (2.15.2) kramdown (2.5.1) rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) @@ -86,21 +86,21 @@ GEM multi_json (1.17.0) mustermann (3.0.4) ruby2_keywords (~> 0.0.1) - nokogiri (1.18.9-arm64-darwin) + nokogiri (1.18.10-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-gnu) + nokogiri (1.18.10-x86_64-linux-gnu) racc (~> 1.4) parallel (1.27.0) - parser (3.3.9.0) + parser (3.3.10.0) ast (~> 2.4.1) racc pathutil (0.16.2) forwardable-extended (~> 2.6) - prism (1.4.0) + prism (1.6.0) public_suffix (6.0.2) racc (1.8.1) - rack (3.2.1) - rack-protection (4.1.1) + rack (3.2.4) + rack-protection (4.2.1) base64 (>= 0.1.0) logger (>= 1.6.0) rack (>= 3.0.0, < 4) @@ -110,16 +110,16 @@ GEM rackup (2.2.1) rack (>= 3) rainbow (3.1.1) - rake (13.3.0) + rake (13.3.1) rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rbs (3.9.4) + rbs (3.9.5) logger - regexp_parser (2.11.2) - rexml (3.4.2) - rouge (4.6.0) - rubocop (1.80.1) + regexp_parser (2.11.3) + rexml (3.4.4) + rouge (4.6.1) + rubocop (1.81.7) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -127,13 +127,13 @@ GEM parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.46.0, < 2.0) + rubocop-ast (>= 1.47.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.46.0) + rubocop-ast (1.47.1) parser (>= 3.3.7.2) prism (~> 1.4) - ruby-lsp (0.26.1) + ruby-lsp (0.26.2) language_server-protocol (~> 3.17.0) prism (>= 1.2, < 2.0) rbs (>= 3, < 5) @@ -141,9 +141,9 @@ GEM ruby2_keywords (0.0.5) safe_yaml (1.0.5) sass (3.4.25) - sass-embedded (1.91.0-arm64-darwin) + sass-embedded (1.93.2-arm64-darwin) google-protobuf (~> 4.31) - sass-embedded (1.91.0-x86_64-linux-gnu) + sass-embedded (1.93.2-x86_64-linux-gnu) google-protobuf (~> 4.31) sass-globbing (1.1.5) sass (>= 3.1) @@ -151,11 +151,11 @@ GEM ffi (~> 1.9) sassc (2.1.0-x86_64-linux) ffi (~> 1.9) - sinatra (4.1.1) + sinatra (4.2.1) logger (>= 1.6.0) mustermann (~> 3.0) rack (>= 3.0.0, < 4) - rack-protection (= 4.1.1) + rack-protection (= 4.2.1) rack-session (>= 2.0.0, < 3) tilt (~> 2.0) stringex (2.8.6) @@ -180,15 +180,15 @@ DEPENDENCIES jekyll-paginate (= 1.1.0) jekyll-sitemap (= 1.4.0) jekyll-toc (= 0.19.0) - nokogiri (= 1.18.9) + nokogiri (= 1.18.10) rackup (= 2.2.1) - rake (= 13.3.0) - rubocop (= 1.80.1) - ruby-lsp (= 0.26.1) - sass-embedded (= 1.91.0) + rake (= 13.3.1) + rubocop (= 1.81.7) + ruby-lsp (= 0.26.2) + sass-embedded (= 1.93.2) sass-globbing (= 1.1.5) sassc (= 2.1.0) - sinatra (= 4.1.1) + sinatra (= 4.2.1) stringex (= 2.8.6) tzinfo (~> 2.0) tzinfo-data diff --git a/Rakefile b/Rakefile index 0948a8b0655..722d7e1eed8 100644 --- a/Rakefile +++ b/Rakefile @@ -32,6 +32,8 @@ task :generate do abort("Generating version data failed") unless success success = system "rake language_scores_data" abort("Generating language scores data failed") unless success + success = system "rake codeowners_data" + abort("Extracting codeowners") unless success success = system "jekyll build" abort("Generating site failed") unless success if ENV["CONTEXT"] != 'production' @@ -71,6 +73,7 @@ task :preview, :listen do |t, args| system "rake analytics_data" system "rake version_data" system "rake language_scores_data" + system "rake codeowners_data" system "rake alerts_data" jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll build -t --watch --incremental") compassPid = Process.spawn("compass watch") @@ -128,3 +131,25 @@ task :language_scores_data do file.write(JSON.generate(remote_data)) end end + +desc "Extract CODEOWNERS and output to _data/codeowners.json" +task :codeowners_data do + codeowners = [] + File.readlines("CODEOWNERS").each do |line| + next if line.start_with?("#") || line.strip.empty? + parts = line.split + next if parts.length < 2 + owners = parts[1..-1] + owners.each do |owner| + owner = owner.delete_prefix('@') + next if owner.include?('/') + codeowners << owner unless codeowners.include?(owner) + end + end + + codeowners.sort! + + File.open("#{source_dir}/_data/codeowners.json", "w") do |file| + file.write(JSON.generate(codeowners)) + end +end \ No newline at end of file diff --git a/_config.yml b/_config.yml index c4741d91c4b..d5a1968f1c3 100644 --- a/_config.yml +++ b/_config.yml @@ -107,9 +107,9 @@ social: # Home Assistant release details current_major_version: 2025 -current_minor_version: 9 +current_minor_version: 11 current_patch_version: 0 -date_released: 2025-09-03 +date_released: 2025-11-05 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. diff --git a/activity-panel.png b/activity-panel.png new file mode 100644 index 00000000000..f84fa093f96 Binary files /dev/null and b/activity-panel.png differ diff --git a/package-lock.json b/package-lock.json index 14171c02bb0..d54fbfb35dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,11 +20,11 @@ "remark-lint-prohibited-strings": "^4.0.0", "remark-lint-unordered-list-marker-style": "^4.0.1", "remark-stringify": "^11.0.0", - "textlint": "^15.2.2", + "textlint": "^15.2.3", "textlint-filter-rule-allowlist": "^4.0.0", "textlint-filter-rule-comments": "^1.2.2", "textlint-rule-common-misspellings": "^1.0.1", - "textlint-rule-terminology": "^5.2.15" + "textlint-rule-terminology": "^5.2.16" } }, "node_modules/@azu/format-text": { @@ -144,9 +144,9 @@ "license": "MIT" }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.17.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", - "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.20.0.tgz", + "integrity": "sha512-kOQ4+fHuT4KbR2iq2IjeV32HiihueuOf1vJkq18z08CLZ1UQrTc8BXJpVfxZkq45+inLLD+D4xx4nBjUelJa4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -267,82 +267,68 @@ } }, "node_modules/@textlint/ast-node-types": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-13.4.1.tgz", - "integrity": "sha512-qrZyhCh8Ekk6nwArx3BROybm9BnX6vF7VcZbijetV/OM3yfS4rTYhoMWISmhVEP2H2re0CtWEyMl/XF+WdvVLQ==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.3.tgz", + "integrity": "sha512-GEhoxfmh6TF+xC8TJmAUwOzzh0J6sVDqjKhwTTwetf7YDdhHbIv1PuUb/dTadMVIWs1H0+JD4Y27n6LWMmqn9Q==", "dev": true, "license": "MIT" }, "node_modules/@textlint/ast-tester": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-15.2.2.tgz", - "integrity": "sha512-puwnJSPOeqtPQslz6ehfEF1wqoTb/iTebHj+vy6zePpHhBZRJdZKOqPe7p83Atetc8O5SEYa1aJ8ur8sSm0wQw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-15.2.3.tgz", + "integrity": "sha512-eT0DBbQTa7Hm0JRRHT9vUv6VoIuY19eqI8UL2I7AzE820DSrrNkgGg/ZxB9I6BCDK/Yg96lJ45fMIeOFPvuJaQ==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/ast-node-types": "15.2.2", - "debug": "^4.4.1" + "@textlint/ast-node-types": "15.2.3", + "debug": "^4.4.3" } }, - "node_modules/@textlint/ast-tester/node_modules/@textlint/ast-node-types": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.2.tgz", - "integrity": "sha512-9ByYNzWV8tpz6BFaRzeRzIov8dkbSZu9q7IWqEIfmRuLWb2qbI/5gTvKcoWT1HYs4XM7IZ8TKSXcuPvMb6eorA==", - "dev": true, - "license": "MIT" - }, "node_modules/@textlint/ast-traverse": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-15.2.2.tgz", - "integrity": "sha512-5uZCNp6fSYvDgQW3LGnJYC90ac1qWhUZJtjE1tI0fPk7U14Gr0Qu5FEOMuW0YUV5aoo3P1OpwrKPt2U6FFlrvg==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-15.2.3.tgz", + "integrity": "sha512-XqlEVbQanAu40pGrtoRJzV3bWUxiCvqpu6FBmHotUgah1jjNWe6DQRkDsjcil9qXrVjXfQFAjG8ZuDk9/sUcGg==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/ast-node-types": "15.2.2" + "@textlint/ast-node-types": "15.2.3" } }, - "node_modules/@textlint/ast-traverse/node_modules/@textlint/ast-node-types": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.2.tgz", - "integrity": "sha512-9ByYNzWV8tpz6BFaRzeRzIov8dkbSZu9q7IWqEIfmRuLWb2qbI/5gTvKcoWT1HYs4XM7IZ8TKSXcuPvMb6eorA==", - "dev": true, - "license": "MIT" - }, "node_modules/@textlint/config-loader": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-15.2.2.tgz", - "integrity": "sha512-uFlxTMhgS0jLzdn4xd3TDS/3QWlE8br2LQVnCjdNmvyU7qNpXHy/9+XUEfbvVMyBXrfBnDIFY4AQAXfhGdOo7g==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-15.2.3.tgz", + "integrity": "sha512-dSedypITXGyh/Bz0t/tQU1NMyehfZeeYhEMtfqpdFY6a3ABLpfaZpOMOZd9EP4zwu2oi2OsooQBMbn/ZdXJ12w==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/kernel": "15.2.2", - "@textlint/module-interop": "15.2.2", - "@textlint/resolver": "15.2.2", - "@textlint/types": "15.2.2", - "@textlint/utils": "15.2.2", - "debug": "^4.4.1", + "@textlint/kernel": "15.2.3", + "@textlint/module-interop": "15.2.3", + "@textlint/resolver": "15.2.3", + "@textlint/types": "15.2.3", + "@textlint/utils": "15.2.3", + "debug": "^4.4.3", "rc-config-loader": "^4.1.3" } }, "node_modules/@textlint/feature-flag": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-15.2.2.tgz", - "integrity": "sha512-SX//fr056jGT3aRDbPTz4k0kEqyHRTvbHTr7HgC3yuksO89NKl605gmU9flrykBZC+i4GOMcR2BL4SweiNXbTg==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-15.2.3.tgz", + "integrity": "sha512-XW2NVj3K7Pi8jlgwxKMUh7L1y+EMN+s47TtEC1rkagI581THgHnAyAe+/aHZsF/CJEwevZtGnaan2MY1rnbsYA==", "dev": true, "license": "MIT" }, "node_modules/@textlint/fixer-formatter": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-15.2.2.tgz", - "integrity": "sha512-wX52sevPrM/hWDAolBm5yJkSQ5QGmLYMja4C1Ao3o/HVO5eI/Q6PS8amtoGJOilOXKrVV0hBuEwGdrXuyGngXw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-15.2.3.tgz", + "integrity": "sha512-cdA3Pt2aaR2NKDBqv/rZiZ8VIuTsUZYX1uaq6v2T2HDFlHn46gv6A4TPg8w5ACpoHid1+kADqe67GRpCxPb9rQ==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/module-interop": "15.2.2", - "@textlint/resolver": "15.2.2", - "@textlint/types": "15.2.2", + "@textlint/module-interop": "15.2.3", + "@textlint/resolver": "15.2.3", + "@textlint/types": "15.2.3", "chalk": "^4.1.2", - "debug": "^4.4.1", + "debug": "^4.4.3", "diff": "^5.2.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", @@ -356,45 +342,38 @@ "dev": true }, "node_modules/@textlint/kernel": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-15.2.2.tgz", - "integrity": "sha512-xFtIx3thI3SC2wk4uApJ5lW0cks4pkSfoRejfYoAMwPd1VyvFhCsQQWNRTyXIlXfNIGT6qY82SoPyXvi3XF6Zg==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-15.2.3.tgz", + "integrity": "sha512-A+YVhh5cFMDrNbnhA754/PT2WrVirQ/zCvGKJz/+yKR+ju97eQc6wZOcu/vYAEsS0+vDZRyR/opD+aOaI3GHZA==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/ast-node-types": "15.2.2", - "@textlint/ast-tester": "15.2.2", - "@textlint/ast-traverse": "15.2.2", - "@textlint/feature-flag": "15.2.2", - "@textlint/source-code-fixer": "15.2.2", - "@textlint/types": "15.2.2", - "@textlint/utils": "15.2.2", - "debug": "^4.4.1", + "@textlint/ast-node-types": "15.2.3", + "@textlint/ast-tester": "15.2.3", + "@textlint/ast-traverse": "15.2.3", + "@textlint/feature-flag": "15.2.3", + "@textlint/source-code-fixer": "15.2.3", + "@textlint/types": "15.2.3", + "@textlint/utils": "15.2.3", + "debug": "^4.4.3", "fast-equals": "^4.0.3", "structured-source": "^4.0.0" } }, - "node_modules/@textlint/kernel/node_modules/@textlint/ast-node-types": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.2.tgz", - "integrity": "sha512-9ByYNzWV8tpz6BFaRzeRzIov8dkbSZu9q7IWqEIfmRuLWb2qbI/5gTvKcoWT1HYs4XM7IZ8TKSXcuPvMb6eorA==", - "dev": true, - "license": "MIT" - }, "node_modules/@textlint/linter-formatter": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.2.2.tgz", - "integrity": "sha512-oMVaMJ3exFvXhCj3AqmCbLaeYrTNLqaJnLJMIlmnRM3/kZdxvku4OYdaDzgtlI194cVxamOY5AbHBBVnY79kEg==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.2.3.tgz", + "integrity": "sha512-gnFGl8MejAS4rRDPKV2OYvU0Tb0iJySOPDahf+RCK30b615UqY6CjqWxXw1FvXfT3pHPoRrefVu39j1AKm2ezg==", "dev": true, "license": "MIT", "dependencies": { "@azu/format-text": "^1.0.2", "@azu/style-format": "^1.0.1", - "@textlint/module-interop": "15.2.2", - "@textlint/resolver": "15.2.2", - "@textlint/types": "15.2.2", + "@textlint/module-interop": "15.2.3", + "@textlint/resolver": "15.2.3", + "@textlint/types": "15.2.3", "chalk": "^4.1.2", - "debug": "^4.4.1", + "debug": "^4.4.3", "js-yaml": "^3.14.1", "lodash": "^4.17.21", "pluralize": "^2.0.0", @@ -405,14 +384,14 @@ } }, "node_modules/@textlint/markdown-to-ast": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-15.2.2.tgz", - "integrity": "sha512-7LsDOCApuM5463e4mfJAORyOMDxzJGmfDfoT6RtwL5P1T1kKGxLl5yudzdfm8++WB8v4wJZZEUQqppejeDRs9Q==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-15.2.3.tgz", + "integrity": "sha512-5kz75TBEOUQIpqCaV65l98YSIpfyOyTKSn4et9A//iSbjiwZHDK3HBo2jDWdkHmGX28+w1hBFDR7/eFMnbxAJQ==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/ast-node-types": "15.2.2", - "debug": "^4.4.1", + "@textlint/ast-node-types": "15.2.3", + "debug": "^4.4.3", "mdast-util-gfm-autolink-literal": "^0.1.3", "neotraverse": "^0.6.18", "remark-footnotes": "^3.0.0", @@ -423,13 +402,6 @@ "unified": "^9.2.2" } }, - "node_modules/@textlint/markdown-to-ast/node_modules/@textlint/ast-node-types": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.2.tgz", - "integrity": "sha512-9ByYNzWV8tpz6BFaRzeRzIov8dkbSZu9q7IWqEIfmRuLWb2qbI/5gTvKcoWT1HYs4XM7IZ8TKSXcuPvMb6eorA==", - "dev": true, - "license": "MIT" - }, "node_modules/@textlint/markdown-to-ast/node_modules/bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", @@ -673,9 +645,9 @@ } }, "node_modules/@textlint/module-interop": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.2.2.tgz", - "integrity": "sha512-2rmNcWrcqhuR84Iio1WRzlc4tEoOMHd6T7urjtKNNefpTt1owrTJ9WuOe60yD3FrTW0J/R0ux5wxUbP/eaeFOA==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.2.3.tgz", + "integrity": "sha512-dV6M3ptOFJjR5bgYUMeVqc8AqFrMtCEFaZEiLAfMufX29asYonI2K8arqivOA69S2Lh6esyij6V7qpQiXeK/cA==", "dev": true, "license": "MIT" }, @@ -703,83 +675,69 @@ } }, "node_modules/@textlint/resolver": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.2.2.tgz", - "integrity": "sha512-4hGWjmHt0y+5NAkoYZ8FvEkj8Mez9TqfbTm3BPjoV32cIfEixl2poTOgapn1rfm73905GSO3P1jiWjmgvii13Q==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.2.3.tgz", + "integrity": "sha512-Qd3udqo2sWa3u0sYgDVd9M/iybBVBJLrWGaID6Yzl9GyhdGi0E6ngo3b9r+H6psbJDIaCKi54IxvC9q5didWfA==", "dev": true, "license": "MIT" }, "node_modules/@textlint/source-code-fixer": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-15.2.2.tgz", - "integrity": "sha512-Cstr9wjK7toLmY2hhlZ3YcIh8o/gr7E5dpCd9IalNiMBedvvLYuOfhktKgUa4E7oFcGtl0leDPgx5ENDY25JDw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-15.2.3.tgz", + "integrity": "sha512-DfKy15kGFG8ddEYDyeRKilVI3nTSdEp5/sw7ariyUXk2spAW8xdToRpgeMaluF4Cp5gcGa6bVOTDJapj/UfFvA==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/types": "15.2.2", - "debug": "^4.4.1" + "@textlint/types": "15.2.3", + "debug": "^4.4.3" } }, "node_modules/@textlint/text-to-ast": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-15.2.2.tgz", - "integrity": "sha512-IphrojtJw3eW/1JMm/Hzc0dsDFALpEzjankABS6tIHMvB2O+2wejRDbDaqmgCgMCr+lGKoMNg5Xvlr5x9XRxww==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-15.2.3.tgz", + "integrity": "sha512-xweE4sDTz56tLy90UXcjn/YEYZr2NH/Kh4Kr5FmQ8K4MtJXOVOubnwmN9503/Vmj4Mq9uNuEzR35D4H2LVHriQ==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/ast-node-types": "15.2.2" + "@textlint/ast-node-types": "15.2.3" } }, - "node_modules/@textlint/text-to-ast/node_modules/@textlint/ast-node-types": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.2.tgz", - "integrity": "sha512-9ByYNzWV8tpz6BFaRzeRzIov8dkbSZu9q7IWqEIfmRuLWb2qbI/5gTvKcoWT1HYs4XM7IZ8TKSXcuPvMb6eorA==", - "dev": true, - "license": "MIT" - }, "node_modules/@textlint/textlint-plugin-markdown": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-15.2.2.tgz", - "integrity": "sha512-JzmHAtC2C4LOpJ/JD2YsqBZt9ej4khFFDI0d9E6P9y9AO/HOEv4GeT7aAjGGPG6AVO977aGiJ92EK9kTwlVnIQ==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-15.2.3.tgz", + "integrity": "sha512-fpHuWt1Tonl+UuObH5upByvPWQjd9swu+beMlrSagBWTFblEyNxGwgaQkTjaWC/SYqJn4TkTsT1c1IZJaHV5oQ==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/markdown-to-ast": "15.2.2", - "@textlint/types": "15.2.2" + "@textlint/markdown-to-ast": "15.2.3", + "@textlint/types": "15.2.3" } }, "node_modules/@textlint/textlint-plugin-text": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-15.2.2.tgz", - "integrity": "sha512-bZYlxw8S9zsuJgx2EAR23RFyQ3JtyuIDUA3dbt5Sov2eo20LitNjDIqrQgDo85widbOD/6rG7VioNesV1/6HFw==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-15.2.3.tgz", + "integrity": "sha512-d5a1dXCYqx3cz8Q8dg5JFqWGbZHbfnYIKsue5DndEY6YtZ99JnaAvReo6GuJK5Pg+6pgOys2OvyZRxFA4D59fQ==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/text-to-ast": "15.2.2", - "@textlint/types": "15.2.2" + "@textlint/text-to-ast": "15.2.3", + "@textlint/types": "15.2.3" } }, "node_modules/@textlint/types": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.2.2.tgz", - "integrity": "sha512-X2BHGAR3yXJsCAjwYEDBIk9qUDWcH4pW61ISfmtejau+tVqKtnbbvEZnMTb6mWgKU1BvTmftd5DmB1XVDUtY3g==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.2.3.tgz", + "integrity": "sha512-i8XVmDHJwykMXcGgkSxZLjdbeqnl+voYAcIr94KIe0STwgkHIhwHJgb/tEVFawGClHo+gPczF12l1C5+TAZEzQ==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/ast-node-types": "15.2.2" + "@textlint/ast-node-types": "15.2.3" } }, - "node_modules/@textlint/types/node_modules/@textlint/ast-node-types": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.2.tgz", - "integrity": "sha512-9ByYNzWV8tpz6BFaRzeRzIov8dkbSZu9q7IWqEIfmRuLWb2qbI/5gTvKcoWT1HYs4XM7IZ8TKSXcuPvMb6eorA==", - "dev": true, - "license": "MIT" - }, "node_modules/@textlint/utils": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-15.2.2.tgz", - "integrity": "sha512-uPCfBl2NF4tiXGjAE5DAwah0Bn/EFsgtXhDEIJV4hsSfBQBD8Guqnh8MvJj25fvZaQS+MTNGiEC6bFXtIMHuAg==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-15.2.3.tgz", + "integrity": "sha512-B5OHi1P6JA0Hy04MmmTeNXFTsSfvgbbqQAWj9iUHg+GhPtd8GyFzb0uxLDIp1oqAGN8eM2hR/n8vwz4WsfPqMw==", "dev": true, "license": "MIT" }, @@ -1380,9 +1338,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -1616,13 +1574,13 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", - "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "dev": true, "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=18.0.0" } }, "node_modules/execall": { @@ -1744,9 +1702,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -2480,7 +2438,8 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.sortby": { "version": "4.7.0", @@ -4488,13 +4447,14 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/picocolors": { @@ -4613,19 +4573,36 @@ } }, "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", + "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", "dev": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.6.3", + "iconv-lite": "0.7.0", "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/rc-config-loader": { @@ -6715,9 +6692,9 @@ } }, "node_modules/strip-json-comments": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.2.tgz", - "integrity": "sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", + "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", "dev": true, "license": "MIT", "engines": { @@ -6797,28 +6774,28 @@ "dev": true }, "node_modules/textlint": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/textlint/-/textlint-15.2.2.tgz", - "integrity": "sha512-0V02Lvs7GJfXPNJgBVhayysW+9qe0bZVmyD8FrYzkW70xZcSoVK4Hdl6825wpQqn8KgdB171WNYlWq5FPEAPgg==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/textlint/-/textlint-15.2.3.tgz", + "integrity": "sha512-TV6STsR0iDSuBtQTtgtAlQVT65OubHcpxOIGxWgRCBfRqlEwdkD6v3tx6ydE16nk0VdpPJP3/PuIMLKQSQk/ZA==", "dev": true, "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "^1.17.2", - "@textlint/ast-node-types": "15.2.2", - "@textlint/ast-traverse": "15.2.2", - "@textlint/config-loader": "15.2.2", - "@textlint/feature-flag": "15.2.2", - "@textlint/fixer-formatter": "15.2.2", - "@textlint/kernel": "15.2.2", - "@textlint/linter-formatter": "15.2.2", - "@textlint/module-interop": "15.2.2", - "@textlint/resolver": "15.2.2", - "@textlint/textlint-plugin-markdown": "15.2.2", - "@textlint/textlint-plugin-text": "15.2.2", - "@textlint/types": "15.2.2", - "@textlint/utils": "15.2.2", - "debug": "^4.4.1", - "file-entry-cache": "^10.1.3", + "@modelcontextprotocol/sdk": "^1.19.1", + "@textlint/ast-node-types": "15.2.3", + "@textlint/ast-traverse": "15.2.3", + "@textlint/config-loader": "15.2.3", + "@textlint/feature-flag": "15.2.3", + "@textlint/fixer-formatter": "15.2.3", + "@textlint/kernel": "15.2.3", + "@textlint/linter-formatter": "15.2.3", + "@textlint/module-interop": "15.2.3", + "@textlint/resolver": "15.2.3", + "@textlint/textlint-plugin-markdown": "15.2.3", + "@textlint/textlint-plugin-text": "15.2.3", + "@textlint/types": "15.2.3", + "@textlint/utils": "15.2.3", + "debug": "^4.4.3", + "file-entry-cache": "^10.1.4", "glob": "^10.4.5", "md5": "^2.3.0", "optionator": "^0.9.4", @@ -6927,39 +6904,31 @@ } }, "node_modules/textlint-rule-terminology": { - "version": "5.2.15", - "resolved": "https://registry.npmjs.org/textlint-rule-terminology/-/textlint-rule-terminology-5.2.15.tgz", - "integrity": "sha512-Gmh4au9iB14aNEFNi8fCF3gYYdL5tHw4Ihw1DMGpEADiK4j75PYGFOElzjqmyqRNnhLPWxY/b5OrP77EYmPasA==", + "version": "5.2.16", + "resolved": "https://registry.npmjs.org/textlint-rule-terminology/-/textlint-rule-terminology-5.2.16.tgz", + "integrity": "sha512-1HQotOLJb6kGAgmRYEA9KiIU+fQupZcOVpZEEhFwmRempvpNnhKowa7Zfpss2v6sbp8Ya+iXRs9xKGw+xheCbQ==", "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.17.21", - "strip-json-comments": "^5.0.1", - "textlint-rule-helper": "^2.3.1" + "strip-json-comments": "^5.0.3", + "textlint-rule-helper": "^2.5.0" }, "engines": { "node": ">=20" } }, "node_modules/textlint-rule-terminology/node_modules/textlint-rule-helper": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.3.1.tgz", - "integrity": "sha512-b1bijvyiUmKinfFE5hkQMSXs3Ky8jyZ3Y6SOoTRJKV9HLL2LWUVFAUezO7z4FpAkVvYruDYWCwA5qWV8GmvyUw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/textlint-rule-helper/-/textlint-rule-helper-2.5.0.tgz", + "integrity": "sha512-QIbFPtyqLy0g5BJn8mryk9iHzGYicNaFIpLFPiEnb4RXxrEGeQ2W2aARQ9yEXLIAqo+OwK4ndWBAWkbgJEPzTQ==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/ast-node-types": "^13.4.1", + "@textlint/ast-node-types": "^15.2.1", "structured-source": "^4.0.0", "unist-util-visit": "^2.0.3" } }, - "node_modules/textlint/node_modules/@textlint/ast-node-types": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.2.tgz", - "integrity": "sha512-9ByYNzWV8tpz6BFaRzeRzIov8dkbSZu9q7IWqEIfmRuLWb2qbI/5gTvKcoWT1HYs4XM7IZ8TKSXcuPvMb6eorA==", - "dev": true, - "license": "MIT" - }, "node_modules/textlint/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", diff --git a/package.json b/package.json index 989468aff98..3d0b6395fe3 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,11 @@ "remark-lint-prohibited-strings": "^4.0.0", "remark-lint-unordered-list-marker-style": "^4.0.1", "remark-stringify": "^11.0.0", - "textlint": "^15.2.2", + "textlint": "^15.2.3", "textlint-filter-rule-allowlist": "^4.0.0", "textlint-filter-rule-comments": "^1.2.2", "textlint-rule-common-misspellings": "^1.0.1", - "textlint-rule-terminology": "^5.2.15" + "textlint-rule-terminology": "^5.2.16" }, "resolutions": { "minimist": ">=1.2.5" diff --git a/sass/homeassistant/_overrides.scss b/sass/homeassistant/_overrides.scss index 9acd804a142..3169da728a4 100644 --- a/sass/homeassistant/_overrides.scss +++ b/sass/homeassistant/_overrides.scss @@ -328,6 +328,7 @@ dd { display: flex; align-items: center; font-weight: normal; + @media only screen and (max-width: $menu-collapse) { user-select: none; } @@ -612,11 +613,11 @@ a.material-card:hover { .links ul { list-style: none; margin: 0; -} + } .links li { display: inline; -} + } } .installation-survey { @@ -894,10 +895,19 @@ a.material-card:hover { // make it blink every 1.5 seconds, no smoothing animation: blink 1.5s infinite; animation-timing-function: steps(1); + @keyframes blink { - 0% { opacity: 1; } - 50% { opacity: 0.2; } - 100% { opacity: 1; } + 0% { + opacity: 1; + } + + 50% { + opacity: 0.2; + } + + 100% { + opacity: 1; + } } } @@ -1228,12 +1238,48 @@ article.listing { border-radius: 8px; box-shadow: rgba(0, 0, 0, 0.5) 0 0 1px; vertical-align: middle; + } + img, + table, + div.contain { &+p { margin-top: 1.5rem; } } + div.contain { + display: grid; + font-size: .9rem; + font-style: italic; + gap: 16px; + text-align: center; + + img { + background-color: unset; + border-radius: 20px; + border: unset; + box-shadow: unset; + display: block; + filter: drop-shadow(0 6px 16px rgba(0, 0, 0, 0.1)); + margin: 0 auto; + max-width: 620px; + width: 100%; + } + + &.fw{ + img { + max-width: 100%; + } + } + + &.nb { + img { + border-radius: unset; + } + } + } + img.no-shadow { border: 0; box-shadow: none; @@ -1275,11 +1321,20 @@ article.listing { border-radius: 8px; border-width: 8px; text-align: center; + overflow: hidden; padding-bottom: 8px; font-size: 0.9rem; box-shadow: rgba(0, 0, 0, 0.5) 0 0 1px; + font-style: italic; border: 0; + lite-youtube{ + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + overflow: hidden; + margin: 0 auto 8px; + } + img { display: block; box-shadow: none; @@ -1308,10 +1363,10 @@ article.listing { text-decoration: underline; overflow-wrap: break-word; - &[rel*="external"]{ + &[rel*="external"] { position: relative; - &:after{ + &:after { content: "\00a0\00a0\00a0\00a0\00a0"; display: inline-block; } diff --git a/sass/homeassistant/pages/_getting_started.scss b/sass/homeassistant/pages/_getting_started.scss index 64c829a2be1..acfbe1b84e7 100644 --- a/sass/homeassistant/pages/_getting_started.scss +++ b/sass/homeassistant/pages/_getting_started.scss @@ -1,6 +1,10 @@ #getting_started { .installations { + &.second { + margin-top: 50px; + } + .label { background: #e8e6f0; border-radius: 4px; @@ -143,7 +147,7 @@ } iconify-icon.external-link { - padding-top: 4px; + display: none; } svg { @@ -285,4 +289,4 @@ } } } -} \ No newline at end of file +} diff --git a/sass/homeassistant/pages/community/_base.scss b/sass/homeassistant/pages/community/_base.scss new file mode 100644 index 00000000000..d76c155f5a7 --- /dev/null +++ b/sass/homeassistant/pages/community/_base.scss @@ -0,0 +1,132 @@ +.container { + display: flex; + margin: 0 auto; + max-width: calc(var(--container-max-width) + (var(--container-gutters) * 2)); + padding: 12px calc(var(--container-gutters) / 2); + width: 100%; + height: 100%; + + @include bp(desktop) { + padding: 12px var(--container-gutters); + } + + &-full { + margin: 0 auto; + padding: 0 calc(var(--container-gutters) / 2); + max-width: calc(var(--container-full-max-width) + (var(--container-gutters) * 2)); + width: 100%; + + @include bp(desktop) { + padding: 0 var(--container-gutters); + } + } +} + +footer{ + isolation: isolate; + position: relative; + &:before{ + content: ''; + position: absolute; + height: 500px; + left: 0; + right: 0; + bottom: 100%; + background: linear-gradient(180deg, #F5F6FA 0%, #FFFFFF 100%); + } +} + +html{ + scroll-padding-top: 92px; +} + +#landingpage { + background-color: #F5F6FA; + color: #002332; + + height: auto; + + .page-content { + overflow-x: clip; + padding-top: 68px; + } + + .content { + max-width: unset; + margin: 0; + } + + img { + box-shadow: unset; + vertical-align: unset; + border: unset; + } + + .spacer { + display: none; + } +} + +section { + padding: var(--section-spacing-y) 0; + position: relative; + z-index: 1; +} + +main#page-community { + h1, + .h1 { + @include h1; + } + + h2, + .h2 { + @include h2; + } + + h3, + .h3 { + @include h3; + text-transform: unset; + letter-spacing: unset; + } + + h4, + .h4 { + @include h4; + } + + h5, + .h5 { + @include h5; + } + + h6, + .h6 { + @include h6; + } + + .small { + @include small; + } + + .big { + @include big; + } + + p { + color: var(--typography-paragraph-color); + font-size: var(--typography-paragraph-font-size); + font-weight: var(--typography-paragraph-font-weight); + line-height: var(--typography-paragraph-line-height); + margin: 0; + + &:last-child { + margin-bottom: 0; + } + } + + figure { + margin: 0; + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/_buttons.scss b/sass/homeassistant/pages/community/_buttons.scss new file mode 100644 index 00000000000..9dfa1bdb225 --- /dev/null +++ b/sass/homeassistant/pages/community/_buttons.scss @@ -0,0 +1,107 @@ + .button { + // Reset - remove after global button refactor + border: unset; + color: initial; + height: unset; + line-height: initial; + margin: unset; + overflow: hidden; + + align-items: center; + background-color: #99DFFC; + border-radius: 40px; + display: inline-flex; + font-size: 10px; + font-weight: 600; + padding: 10px 24px; + transition: color 0.2s ease, background-color 0.2s ease; + + @include bp(desktop) { + font-size: 14px; + } + + &:hover { + box-shadow: unset; + background-color: var(--color-primary); + color: #ffffff; + } + + &:before { + content: unset; + } + + &:has(.icon) { + gap: 4px; + padding: 4px 14px 4px 4px; + + @include bp(desktop) { + gap: 10px; + padding: 8px 24px 8px 8px; + } + } + + &.secondary { + background-color: var(--color-secondary); + + &:hover { + background-color: var(--color-primary); + color: #ffffff; + } + } + + &.hollow-dark { + background-color: unset; + box-shadow: inset 0 0 0 1px #fff; + color: #ffffff; + + + &:hover { + background-color: #ffffff; + color: #002332; + + + } + } + } + + .buttons { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 12px; + + // If DSAP is enabled + &[data-dsap] { + + // Only apply if scrolling down into view + &:not([data-dsap-is="in"]):not([data-dsap-is="above"]) { + // Only if scrolling down into the element + + .button { + transition-duration: 0s; + transition-delay: 0s; + opacity: 0; + transform: translateY(50px); + scale: 0.85; + } + } + + .button { + transform: translateY(0); + + @for $i from 1 through 10 { + &:nth-child(#{$i}) { + transition-property: transform, opacity, scale; + transition-duration: .5s; + transition-delay: #{0.1 + ($i * 0.05)}s; + transition-timing-function: cubic-bezier(0.2, 1, 0.5, 1); + + } + } + } + } + + @include bp(desktop) { + gap: 24px; + } + } \ No newline at end of file diff --git a/sass/homeassistant/pages/community/_event-card.scss b/sass/homeassistant/pages/community/_event-card.scss new file mode 100644 index 00000000000..09eb6987cf1 --- /dev/null +++ b/sass/homeassistant/pages/community/_event-card.scss @@ -0,0 +1,21 @@ +.event-card{ + background-color: rgba(255,255,255,0.4); + padding: 12px; + border-radius: 12px; + border: 1px solid #ffffff; + + .button{ + margin-top: 20px; + } + + .event-title{ + @include h4; + } + + .event-meta{ + @include p; + color: #4F606E; + margin-top: 6px; + font-size: 12px; + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/_icon.scss b/sass/homeassistant/pages/community/_icon.scss new file mode 100644 index 00000000000..582a2b1343b --- /dev/null +++ b/sass/homeassistant/pages/community/_icon.scss @@ -0,0 +1,25 @@ +.icon{ + aspect-ratio: 1/1; + background-color: #ffffff; + border-radius: 50%; + color: #002332; + height: 100%; + padding: 4px; + display: grid; + place-items: center; + height: 24px; + width: 24px; + + &:has(use[href="#facebook"]){ + padding: 0; + svg{ + height: 100%; + width: 100%; + } + } + + svg{ + width: 100%; + height: 100%; + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/_mixins.scss b/sass/homeassistant/pages/community/_mixins.scss new file mode 100644 index 00000000000..cf71fb96520 --- /dev/null +++ b/sass/homeassistant/pages/community/_mixins.scss @@ -0,0 +1,84 @@ +@mixin bp($breakpoint) { + @if $breakpoint ==large-mobile { + @media (min-width: 500px) { + @content; + } + } + + @else if $breakpoint ==tablet { + @media (min-width: 768px) { + @content; + } + } + + @else if $breakpoint ==desktop { + @media (min-width: 1024px) { + @content; + } + } + + @else if $breakpoint ==large-desktop { + @media (min-width: 1280px) { + @content; + } + } + + // else if the breakpoint is a pixel value, use it as is + @else { + @media (min-width: $breakpoint) { + @content; + } + } +} + +@mixin h1 { + font-size: var(--typography-h1-font-size); + font-weight: var(--typography-h1-font-weight); + line-height: var(--typography-h1-line-height); + letter-spacing: -1px; +} +@mixin h2 { + font-size: var(--typography-h2-font-size); + font-weight: var(--typography-h2-font-weight); + line-height: var(--typography-h2-line-height); + letter-spacing: -1px; +} +@mixin h3 { + font-size: var(--typography-h3-font-size); + font-weight: var(--typography-h3-font-weight); + line-height: var(--typography-h3-line-height); +} +@mixin h4 { + font-size: var(--typography-h4-font-size); + font-weight: var(--typography-h4-font-weight); + line-height: var(--typography-h4-line-height); +} +@mixin h5 { + font-size: var(--typography-h5-font-size); + font-weight: var(--typography-h5-font-weight); + line-height: var(--typography-h5-line-height); +} +@mixin h6 { + font-size: var(--typography-h6-font-size); + font-weight: var(--typography-h6-font-weight); + line-height: var(--typography-h6-line-height); +} + +@mixin p { + font-size: var(--typography-paragraph-font-size); + font-weight: var(--typography-paragraph-font-weight); + line-height: var(--typography-paragraph-line-height); +} + +@mixin small{ + font-size: var(--typography-small-paragraph-font-size, var(--typography-paragraph-font-size)); + font-weight: var(--typography-small-paragraph-font-weight, var(--typography-paragraph-font-weight)); + line-height: var(--typography-small-paragraph-line-height, var(--typography-paragraph-line-height)); +} + +@mixin big { + font-size: var(--typography-big-font-size); + font-weight: var(--typography-big-font-weight); + line-height: var(--typography-big-line-height); + text-transform: uppercase; +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/_photos.scss b/sass/homeassistant/pages/community/_photos.scss new file mode 100644 index 00000000000..4051722b6b3 --- /dev/null +++ b/sass/homeassistant/pages/community/_photos.scss @@ -0,0 +1,92 @@ +.photos { + display: grid; + isolation: isolate; + place-items: center; + position: relative; + + &[data-dsap]:not([data-dsap-is="in"]):not([data-dsap-is="above"]) { // Only if scrolling down into the element + .photo { + opacity: 0; + left: 0; + top: 0; + right: 0; + transform: rotate(0) scale(0.8); + transition-duration: 0s; + transition-delay: 0s; + + &.large { + opacity: 1; + + } + } + } + + .photo { + background-color: #ffffff; + grid-area: 1/1; + display: flex; + flex-direction: column; + gap: 8px; + transition-property: transform, opacity, top, left, right; + transition-duration: .8s; + transition-delay: .25s; + transition-timing-function: cubic-bezier(0.2, 1, 0.5, 1); + + @for $i from 1 through 3 { + &:nth-child(#{$i}) { + transition-delay: #{0.25 + ($i * 0.05)}s; + } + } + + img { + aspect-ratio: 1/1; + width: 100%; + background-color: #f5f5f5; + } + + figcaption { + font-size: 16px; + text-align: center; + } + + &.small { + border-radius: 8px; + padding: 6px; + position: absolute; + right: -15%; + top: -10%; + width: 50%; + z-index: 1; + transform: rotate(9deg); + + img { + border-radius: 4px; + } + } + + &.medium { + border-radius: 12px; + left: -10%; + padding: 8px; + position: absolute; + top: -15%; + width: 70%; + z-index: 2; + transform: rotate(-15deg); + + img { + border-radius: 6px; + } + } + + &.large { + border-radius: 12px; + padding: 12px; + z-index: 3; + + img { + border-radius: 6px; + } + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/_stats.scss b/sass/homeassistant/pages/community/_stats.scss new file mode 100644 index 00000000000..dc6ab93cd34 --- /dev/null +++ b/sass/homeassistant/pages/community/_stats.scss @@ -0,0 +1,26 @@ +.stats { + display: flex; + flex-wrap: wrap; + gap: 24px 40px; + + .stat { + display: flex; + flex-direction: column; + min-width: 100px; + + .stat-value { + @include h3; + + color: var(--color-secondary); + display: flex; + gap: 4px; + } + + .stat-label { + @include small; + + max-width: 140px; + text-wrap: balance; + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/_variables.scss b/sass/homeassistant/pages/community/_variables.scss new file mode 100644 index 00000000000..0d4acb003ff --- /dev/null +++ b/sass/homeassistant/pages/community/_variables.scss @@ -0,0 +1,57 @@ +:root { + --color-primary: #00AEF8; + --color-secondary: #16F3BE; + + // Containers and widths + --container-max-width: 1100px; + --container-full-max-width: 1400px; + --container-gutters: 24px; + + --section-spacing-y: 52px; + + // Typography + --typography-base-font: "Figtree", serif; + --typography-heading-line-height: 1.25; + + --typography-h1-font-size: 36px; + --typography-h1-font-weight: 600; + --typography-h1-line-height: 1; + + --typography-h2-font-size: 30px; + --typography-h2-font-weight: 600; + --typography-h2-line-height: 1.1; + + --typography-h3-font-size: 24px; + --typography-h3-font-weight: 700; + --typography-h3-line-height: var(--typography-heading-line-height); + + --typography-h4-font-size: 14px; + --typography-h4-font-weight: 700; + --typography-h4-line-height: 1.25; + + --typography-paragraph-color: #4F606E; + --typography-paragraph-font-size: 16px; + --typography-paragraph-font-weight: 400; + --typography-paragraph-line-height: 1.25; + + --typography-small-paragraph-font-size: 12px; + --typography-small-paragraph-line-height: 1.3; + + --typography-big-font-size: 46px; + --typography-big-font-weight: 700; + --typography-big-line-height: 1; +} + +@include bp(desktop) { + :root { + --section-spacing-y: 80px; + + --typography-h1-font-size: 66px; + --typography-h2-font-size: 48px; + --typography-h3-font-size: 32px; + --typography-h4-font-size: 20px; + --typography-paragraph-font-size: 24px; + --typography-small-paragraph-font-size: 16px; + --typography-big-font-size: 128px; + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/components/_faq.scss b/sass/homeassistant/pages/community/components/_faq.scss new file mode 100644 index 00000000000..1e793b438ad --- /dev/null +++ b/sass/homeassistant/pages/community/components/_faq.scss @@ -0,0 +1,260 @@ +section#faq { + + .container{ + flex-direction: column; + + h2{ + margin: 0; + margin-bottom: 30px; + @include bp(desktop){ + margin-bottom: 60px; + } + } + } + + .accordion { + + .accordion-items { + display: flex; + flex-direction: column; + margin-top: 1px; + } + + .accordion-item { + --open: 0; + border-bottom: 1px solid #72787E; + display: flex; + flex-direction: column; + + // Checkbox-driven open state + input[type="checkbox"] { + display: none; + } + + input[type="checkbox"]:checked ~ .accordion-item-heading { + // Optionally style the heading when open + } + + input[type="checkbox"]:checked ~ .accordion-item-content-animation-wrapper { + grid-template-rows: 1fr; + transition: grid-template-rows 0.4s ease 0s; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } + + .accordion-item-content-transform-wrapper { + opacity: 1; + transform: translateY(0); + transition: transform 0.4s ease, visibility 0s 0.4s ease, margin-top 0.4s ease, opacity 0.3s ease 0.425s; + visibility: visible; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } + } + + input[type="checkbox"]:checked ~ .accordion-item-heading .button-more { + background-color: var(--color-primary) + } + + input[type="checkbox"]:checked ~ .accordion-item-heading .button-more:before, + input[type="checkbox"]:checked ~ .accordion-item-heading .button-more:after { + transform: translate(-50%, -50%) scale(calc(64/28)); + } + + input[type="checkbox"]:checked ~ .accordion-item-heading .button-more:hover:before, + input[type="checkbox"]:checked ~ .accordion-item-heading .button-more:hover:after { + transform: translate(-50%, -50%) scale(calc(56/28)); + } + + input[type="checkbox"]:checked ~ .accordion-item-heading .button-more .plus { + transform: translate(-50%, -50%) rotate(90deg); + } + + input[type="checkbox"]:checked ~ .accordion-item-heading .button-more .plus:before { + opacity: 0; + } + input[type="checkbox"]:checked ~ .accordion-item-heading .button-more .plus:after { + background-color: #ffffff; + } + + &-heading { + cursor: pointer; + margin-bottom: -1px; + transition: background-color 0.3s, color 0.3s; + user-select: none; + isolation: isolate; + + label{ + + display: flex; + justify-content: space-between; + padding: 20px 0; + z-index: 1; + + @include bp(desktop){ + padding: 40px 0; + } + } + + &-title { + font-weight: 400; + font-size: 20px; + color: #002332; + @include bp(desktop){ + font-size: 24px; + } + } + + &-icon { + display: grid; + flex-shrink: 0; + height: 32px; + place-items: center; + position: relative; + width: 32px; + } + + .button-more { + background-color: #ffffff; + border-radius: 50%; + cursor: pointer; + height: 24px; + position: relative; + transition: background-color 0.25s ease-out, box-shadow 0.25s ease-out; + width: 24px; + + .plus { + height: 8px; + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%) rotate(0deg); + transition: transform .25s ease-out; + width: 8px; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } + + .plus:before, + .plus:after { + background-color: var(--color-primary); + content: ''; + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + transition: opacity .25s ease-out, background-color .25s ease-out; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } + + .plus:before { + height: 2px; + width: 8px; + } + + .plus:after { + height: 8px; + width: 2px; + } + + &:before { + -webkit-backdrop-filter: blur(2px); + backdrop-filter: blur(2px); + background-color: rgba(255, 255, 255, .25); + border-radius: 50%; + content: ''; + height: 28px; + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + transition: transform .25s ease-out; + width: 28px; + z-index: -1; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } + + &:after { + border-radius: 50%; + content: ''; + height: 28px; + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + width: 28px; + z-index: 1; + } + + &:hover:before, + &:hover:after { + transform: translate(-50%, -50%) scale(calc(34/28)); + } + + // .active state now handled by input:checked selectors above + } + } + + &-content { + gap: 20px; + grid-template-rows: 0fr; + justify-content: center; + padding: 0 0 20px 0; + transition: grid-template-rows 0.3s, transform, visibility 0.3s; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } + + &, + p { + color: #4F606E; + font-size: 16px; + line-height: 1.5; + margin: 0; + } + + p:not(:last-child) { + margin-bottom: 1rem; + } + + &-animation { + min-height: 0; + } + + &-animation-wrapper { + display: grid; + grid-template-rows: 0fr; + overflow: hidden; + transition: grid-template-rows 0.4s ease; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } + + &-transform-wrapper { + margin-top: 0; + opacity: 0.875; + transform: translateY(-100%); + transition: transform 0.4s ease, margin-top 0.4s ease, opacity 0.3s ease; + + @media (prefers-reduced-motion: reduce) { + transition: none; + } + } + } + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/components/_global.scss b/sass/homeassistant/pages/community/components/_global.scss new file mode 100644 index 00000000000..46b4ef6fe68 --- /dev/null +++ b/sass/homeassistant/pages/community/components/_global.scss @@ -0,0 +1,54 @@ +section#global { + padding-bottom: 0; + + .container { + align-items: center; + flex-direction: column; + gap: 0 40px; + + @include bp(desktop) { + flex-direction: row; + } + } + + .content { + display: flex; + flex-basis: 0; + flex-direction: column; + flex-grow: 1; + gap: 24px; + + @include bp(desktop) { + gap: 60px; + } + + &-inner { + display: flex; + flex-direction: column; + gap: 6px; + + @include bp(desktop) { + gap: 12px; + } + } + + h2 { + margin: 0; + } + + } + + .photos-wrapper { + max-width: 424px; + padding: 100px 0 0; + + @include bp(desktop) { + margin-left: 75px; + } + + .photos { + flex-basis: 0; + flex-grow: 1; + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/components/_hero.scss b/sass/homeassistant/pages/community/components/_hero.scss new file mode 100644 index 00000000000..16fdcca0836 --- /dev/null +++ b/sass/homeassistant/pages/community/components/_hero.scss @@ -0,0 +1,44 @@ +section#hero { + --section-spacing-y: 0; + + background-image: url('/images/community/hero-m.svg'); + background-position: center; + background-size: cover; + border-radius: 12px; + display: flex; + flex-direction: column; + justify-content: flex-end; + min-height: 600px; + + @include bp(tablet) { + background-image: url('/images/community/hero.svg'); + background-position: center; + border-radius: 24px; + } + + .container { + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 24px 12px; + + @include bp(tablet) { + padding: 164px 12px 66px 12px; + } + + .content { + align-items: flex-start; + display: flex; + flex-direction: column; + max-width: 670px; + + .event-card, .button { + margin-top: 24px; + + @include bp(tablet) { + margin-top: 32px; + } + } + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/components/_join.scss b/sass/homeassistant/pages/community/components/_join.scss new file mode 100644 index 00000000000..35fe3221dc9 --- /dev/null +++ b/sass/homeassistant/pages/community/components/_join.scss @@ -0,0 +1,106 @@ +section#join { + isolation: isolate; + + .container { + align-items: center; + flex-direction: column; + position: relative; + } + + h2 { + align-items: center; + display: flex; + flex-direction: column; + margin: 0 auto; + text-transform: unset; + + span:not(:first-child) { + margin-top: 8px; + + @include bp(desktop) { + margin-top: 24px; + } + } + } + + p { + //background-color: rgba(245, 246, 250, 0.6); + //backdrop-filter: blur(2px); + max-width: 650px; + text-align: center; + text-wrap: balance; + padding-top: 16px; + z-index: 1; + + @include bp(desktop) { + padding-top: 40px; + } + } + + .buttons { + margin-top: 52px; + z-index: 1; + + @include bp(desktop) { + margin-top: 60px; + } + } + + .avatars { + display: grid; + // 12 cols + grid-template-columns: repeat(6, 1fr); + position: absolute; + inset: 0; + + &[data-dsap]:not([data-dsap-is="in"]):not([data-dsap-is="above"]) { // Reset after scroll up + .avatar{ + opacity: 0; + } + } + + @include bp(tablet) { + grid-template-columns: repeat(12, 1fr); + } + + + .avatar { + justify-self: center; + transition: opacity 0.25s ease-out; + + &.hide{ + img{ + opacity: 0; + } + } + + img { + height: 48px; + width: 48px; + border-radius: 50%; + transition: opacity 0.5s ease-out; + } + + + // hide every even avatar on desktop + + &:nth-child(odd) { + display: none; + @include bp(tablet) { + display: block; + } + } + + + $list: 21,31,76,0,35,70,100,95,50,6,30,26; + @for $i from 1 through 12 { + &:nth-child(#{$i}) { + $offset: nth($list, $i); + transform: translateY(calc(#{$offset} * 1%)); + opacity: 1; + transition-delay: #{0.2 + ($i * 0.05)}s; + } + } + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/components/_meetups.scss b/sass/homeassistant/pages/community/components/_meetups.scss new file mode 100644 index 00000000000..ef5804881e1 --- /dev/null +++ b/sass/homeassistant/pages/community/components/_meetups.scss @@ -0,0 +1,126 @@ +section#meetups { + + background-color: #CCEFFE; + border-radius: 12px; + overflow: hidden; + margin-top: 24px; + + @include bp(tablet) { + border-radius: 24px; + } + + .container { + gap: 60px; + flex-direction: column; + + @include bp(tablet) { + flex-direction: row; + } + + .content { + display: flex; + flex-direction: column; + align-items: flex-start; + + h2 { + margin: 0; + margin-bottom: 20px; + + @include bp(tablet) { + margin-bottom: 40px; + } + } + + svg:has(use[href="#community"]) { + height: 40px; + width: 40px; + margin-bottom: 12px; + + @include bp(desktop) { + margin-bottom: 40px; + height: 80px; + width: 80px; + } + } + + .event-card, .button { + margin-top: 20px; + + @include bp(tablet) { + margin-top: 32px; + } + } + } + + .guide { + background-color: rgba(246, 248, 251, 0.2); + border: 1px solid #ffffff; + border-radius: 12px; + padding: 40px 24px; + + h3 { + margin: 0; + text-wrap: balance; + margin-bottom: 12px; + } + + p { + color: #002332; + } + + .buttons { + justify-content: flex-start; + } + + .steps { + display: flex; + flex-direction: column; + gap: 8px; + margin: 40px 0; + + .step { + @include small; + padding-left: 32px; + line-height: 1.5; + color: #4F606E; + position: relative; + + &:before { + content: ''; + width: 15px; + height: 15px; + border-radius: 50%; + + box-shadow: inset 0 0 0 5px var(--color-primary); + left: 0; + top: 4px; + position: absolute; + } + + &:not(:last-child) { + padding-bottom: 28px; + + &:after { + content: ''; + width: 1px; + background-color: #4F606E; + left: 7px; + bottom: -4px; + top: 26px; + position: absolute; + } + } + } + } + } + } + + .content, + .guide { + @include bp(desktop) { + flex-grow: 1; + flex-basis: 50%; + width: 100%; + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/components/_nav.scss b/sass/homeassistant/pages/community/components/_nav.scss new file mode 100644 index 00000000000..339f5c33cd5 --- /dev/null +++ b/sass/homeassistant/pages/community/components/_nav.scss @@ -0,0 +1,36 @@ +section#nav { + --section-spacing-y: 20px; + @include bp(tablet) { + --section-spacing-y: 40px; + } + + .nav-pills{ + display: flex; + justify-content: center; + flex-wrap: wrap; + + gap: 12px; + + .nav-pill{ + background-color: #ffffff; + border-radius: 32px; + cursor: pointer; + transition: background-color 0.25s ease, color 0.25s ease; + font-size: 12px; + font-weight: 500; + padding: 6px 12px; + white-space: nowrap; + text-decoration: none; + color: #002332; + + &:hover{ + background-color: var(--color-primary); + color: #ffffff; + } + + @include bp(tablet) { + font-size: 14px; + } + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/components/_newsletter.scss b/sass/homeassistant/pages/community/components/_newsletter.scss new file mode 100644 index 00000000000..c4f2cea8e15 --- /dev/null +++ b/sass/homeassistant/pages/community/components/_newsletter.scss @@ -0,0 +1,157 @@ +section#newsletter { + --section-spacing-y: 0; + background-color: #002332; + border-radius: 12px; + overflow: hidden; + + .container { + gap: 0px 60px; + align-items: flex-end; + justify-content: center; + align-items: center; + flex-direction: column; + + @include bp(tablet) { + align-items: center; + flex-direction: row; + } + + @include bp(desktop) { + align-items: flex-end; + } + } + + + + h2 { + margin-top: 0; + text-wrap: balance; + } + + &, + p { + color: #ffffff; + } + + @include bp(tablet) { + border-radius: 24px; + } + + .content { + padding: 52px 0; + + @include bp(tablet) { + padding: 100px 0; + } + } + + .buttons { + justify-content: flex-start; + margin-top: 20px; + + @include bp(tablet) { + margin-top: 40px; + } + } + + .editions { + display: flex; + flex-direction: column; + flex-shrink: 0; + max-width: 570px; + align-items: center; + margin-bottom: -40px; + width: 100%; + order: 1; + + @include bp(tablet) { + order: -1; + flex-basis: 50%; + align-self: center; + } + @include bp(desktop) { + } + + @include bp(large-desktop) { + flex-basis: 570px; + align-self: flex-end; + margin-bottom: -64px; + + } + + &[data-dsap]:not([data-dsap-is="in"]):not([data-dsap-is="above"]) { + + // Only if scrolling down into the element + .edition { + transition-duration: 0s; + transition-delay: 0s; + + &:nth-child(1) { + transform: translateY(120px); + } + + &:nth-child(2) { + transform: translateY(40px); + } + } + } + + .edition { + aspect-ratio: 571/300; + width: 100%; + max-width: 100%; + position: relative; + border-radius: 6px; + overflow: hidden; + transition: transform 0.8s cubic-bezier(0.3, 1, 0.5, 1); + transition-delay: .25s; + + @include bp(tablet) { + border-radius: 12px; + } + + .label { + display: none; + } + + img { + width: 100%; + height: 100%; + object-fit: cover; + position: absolute; + border-radius: 0; + inset: 0; + } + + &:nth-child(1) { + max-width: 80%; + height: 45px; + transition-delay: .3s; + z-index: 1; + + @include bp(tablet) { + height: 70px; + } + } + + &:nth-child(2) { + max-width: 90%; + justify-self: center; + height: 50px; + transform: translateY(-20px); + z-index: 2; + + @include bp(tablet) { + height: 80px; + } + } + + &:nth-child(3) { + max-width: 100%; + justify-self: center; + z-index: 3; + transform: translateY(-40px); + } + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/community/index.scss b/sass/homeassistant/pages/community/index.scss new file mode 100644 index 00000000000..ddfff1905df --- /dev/null +++ b/sass/homeassistant/pages/community/index.scss @@ -0,0 +1,20 @@ +// Setup +@import "homeassistant/pages/community/mixins.scss"; +@import "homeassistant/pages/community/variables.scss"; + +// Base +@import "homeassistant/pages/community/base.scss"; +@import "homeassistant/pages/community/icon.scss"; +@import "homeassistant/pages/community/buttons.scss"; +@import "homeassistant/pages/community/event-card.scss"; +@import "homeassistant/pages/community/photos.scss"; +@import "homeassistant/pages/community/stats.scss"; + +// Components +@import "homeassistant/pages/community/components/nav.scss"; +@import "homeassistant/pages/community/components/hero.scss"; +@import "homeassistant/pages/community/components/global.scss"; +@import "homeassistant/pages/community/components/join.scss"; +@import "homeassistant/pages/community/components/newsletter.scss"; +@import "homeassistant/pages/community/components/meetups.scss"; +@import "homeassistant/pages/community/components/faq.scss"; diff --git a/sass/homeassistant/pages/connect/zwa-2/_base.scss b/sass/homeassistant/pages/connect/zwa-2/_base.scss index 0bb1b92facf..cd667a92206 100644 --- a/sass/homeassistant/pages/connect/zwa-2/_base.scss +++ b/sass/homeassistant/pages/connect/zwa-2/_base.scss @@ -24,3 +24,20 @@ section { } } } + +.nc-collaboration{ + position: absolute; + &.mobile{ + display: block; + @include bp(desktop){ + display: none; + } + } + + &.desktop{ + display: none; + @include bp(desktop){ + display: block; + } + } +} \ No newline at end of file diff --git a/sass/homeassistant/pages/connect/zwa-2/components/_buy.scss b/sass/homeassistant/pages/connect/zwa-2/components/_buy.scss index 9a3e2d1b4fb..f6f660a31f9 100644 --- a/sass/homeassistant/pages/connect/zwa-2/components/_buy.scss +++ b/sass/homeassistant/pages/connect/zwa-2/components/_buy.scss @@ -55,6 +55,7 @@ section#buy { @include bp(desktop) { z-index: unset; + position: relative; } } @@ -108,24 +109,32 @@ section#buy { } } - .terms { padding: 0 16px; max-width: 520px; font-size: 14px; position: absolute; - bottom: 20px; + bottom: 50px; max-width: 22rem; margin-top: 5rem; @include bp(desktop) { - bottom: 80px; + bottom: 130px; font-size: 16px; margin-top: unset; max-width: 26rem; } + @include bp(1750px) { max-width: 33rem; } } + + .nc-collaboration{ + bottom: 20px; + max-width: calc(100% - 20px); + @include bp(desktop){ + bottom: 60px; + } + } } \ No newline at end of file diff --git a/sass/homeassistant/pages/connect/zwa-2/components/_faq.scss b/sass/homeassistant/pages/connect/zwa-2/components/_faq.scss index 242a3da3c53..38e39e81a0e 100644 --- a/sass/homeassistant/pages/connect/zwa-2/components/_faq.scss +++ b/sass/homeassistant/pages/connect/zwa-2/components/_faq.scss @@ -229,6 +229,19 @@ section#faq { margin: 0; } + img{ + border-radius: 8px; + display: block; + max-width: 800px; + width: 100%; + } + + img,p { + &:not(:last-child) { + margin-bottom: 16px; + } + } + &-animation { min-height: 0; } diff --git a/source/404.html b/source/404.html index d9c9f946a9b..155757ad6f5 100644 --- a/source/404.html +++ b/source/404.html @@ -11,7 +11,7 @@ body_id: not_found
- + + - + + diff --git a/source/_integrations/_integration_docs_template.markdown b/source/_integrations/_integration_docs_template.markdown index 6b49608f02d..e8b44fe4101 100644 --- a/source/_integrations/_integration_docs_template.markdown +++ b/source/_integrations/_integration_docs_template.markdown @@ -6,7 +6,7 @@ ha_iot_class: Local Push ha_codeowners: - '@home-assistant/core' ha_domain: my_integration -ha_integration_type: integration +ha_integration_type: hub related: - url: https://developers.home-assistant.io/docs/documenting/standards title: Documentation standard @@ -87,24 +87,22 @@ Timeframe: ## Supported functionality -### Entities - The **My integration** integration provides the following entities. -#### Buttons +### Buttons - **Start backflush** - **Description**: Starts the backflush process on your machine. You got 15 seconds to turn the paddle after activation. - **Available for machines**: all -#### Numbers +### Numbers - **Dose** - **Description**: Dosage (in ticks) for each key - **Available for machines**: GS3 AV, Linea Mini. - **Remarks**: GS3 has this multiple times, one for each physical key (1-4), and the entities are disabled by default. -#### Sensors +### Sensors - **Current coffee temperature** - **Description**: Current temperature of the coffee boiler. @@ -116,7 +114,7 @@ The **My integration** integration provides the following entities. - **Available for machines**: Linea Micra, GS3 AV, GS3 MP. - **Remarks**: - -#### Selects +### Selects - **Prebrew/-infusion mode** - **Description**: Whether to use prebrew, preinfusion, or neither. @@ -128,7 +126,7 @@ The **My integration** integration provides the following entities. - **Options**: 1, 2, 3 - **Available for machines**: Linea Micra -#### Updates +### Updates - **Gateway firmware** - **Description**: Firmware status of the gateway. @@ -174,11 +172,11 @@ The integration does not provide the ability to reboot, which can instead be don When trying to set up the integration, the form shows the message “This device can’t be reached”. -##### Description +#### Description This means the settings on the device are incorrect, since the device needs to be enabled for local communication. -##### Resolution +#### Resolution To resolve this issue, try the following steps: diff --git a/source/_integrations/actron_air.markdown b/source/_integrations/actron_air.markdown new file mode 100644 index 00000000000..215a3b86221 --- /dev/null +++ b/source/_integrations/actron_air.markdown @@ -0,0 +1,44 @@ +--- +title: Actron Air +description: Instructions on how to integrate the Actron Air A/C controller into Home Assistant. +ha_category: + - Climate +ha_release: 2025.11 +ha_iot_class: Cloud Polling +ha_config_flow: true +ha_codeowners: + - '@kclif9' + - '@JagadishDhanamjayam' +ha_domain: actron_air +ha_platforms: + - climate +ha_integration_type: integration +ha_quality_scale: bronze +ha_dhcp: true +--- + +The **Actron Air** {% term integration %} allows you to control [Actron Air](https://www.actronair.com.au/) Air Conditioning controllers into Home Assistant. + +## Prerequisites + +You must have an **Actron Air** Air-Conditioner with the Neo tablet wall controller, an active internet connection, and be registered to an email address. + +## Supported devices + +This integration currently supports the Actron Air Neo controller, however other units are intended to be supported soon. + +{% include integrations/config_flow.md %} + +## Supported functionality + +### Climate + +The integration will create a climate entity for the main air conditioning system found and for each zone. The main air conditioner unit will be reflected based on the name in the Actron Air Neo app. You can set the temperature, operation mode, and fan speed through this entity. + +Each zone will be reflected as a separate climate entity. You can set the temperature and operation mode per zone (if supported by your air conditioner). + +## Removing the integration + +This integration follows standard integration removal. + +{% include integrations/remove_device_service.md %} diff --git a/source/_integrations/adguard.markdown b/source/_integrations/adguard.markdown index 23d65ab4dba..cbb69e27c66 100644 --- a/source/_integrations/adguard.markdown +++ b/source/_integrations/adguard.markdown @@ -14,6 +14,7 @@ ha_domain: adguard ha_platforms: - sensor - switch + - update ha_integration_type: service --- @@ -78,6 +79,14 @@ The **AdGuard protection** switch acts as a master control. When turned off, it Turning off **Query log** stops all sensor updates. AdGuard requires query logging to provide statistics. {% endimportant %} +### Update + +The integration provides an {% term update %} entity to check for and install AdGuard Home software updates. + +{% note %} +The update entity is not available for Docker-based installations of AdGuard Home (_those also not for the [AdGuard Home add-on](https://github.com/hassio-addons/addon-adguard-home), but for the add-on its own update entity is created by the supervisor_). +{% endnote %} + ## Actions The integration provides {% term actions %} to manage filter subscriptions in AdGuard Home. Use these actions in automations to dynamically control content filtering based on time, presence, or other conditions. diff --git a/source/_integrations/ai_task.markdown b/source/_integrations/ai_task.markdown index 1617f5d6a13..f8e68f23d48 100644 --- a/source/_integrations/ai_task.markdown +++ b/source/_integrations/ai_task.markdown @@ -31,13 +31,41 @@ Generates data using AI. | `instructions` | no | String containing the specific instructions for the AI to follow when generating the text. | | `entity_id` | yes | String that points at an `entity_id` of an LLM task entity. If not specified, uses the default LLM task. | | `structure` | yes | Dictionary defining the structure of the output data. When set, the AI will return structured data with the specified fields. Each field can have a `description`, `selector`, and optional `required` property. | -| `attachments` | yes | List of attachments to include in the task. Each attachment is the output of the [Media Selector](https://www.home-assistant.io/docs/blueprint/selectors/#media-selector). +| `attachments` | yes | List of attachments to include in the task. Each attachment is the output of the [Media Selector](/docs/blueprint/selectors/#media-selector). | The response variable is a dictionary with the following keys: - `data`: The generated text or structured data (depending on whether `structure` is specified). - `conversation_id`: The ID of the conversation used for the task. +## Action `ai_task.generate_image` + +Generates image using AI. + +| Data attribute | Optional | Description | +| ---------------------- | -------- | --------------------------------------------------------------------------------------------------------------- | +| `task_name` | no | String that identifies the type of image generation task (for example, "floor map", "weather visualization"). | +| `instructions` | no | String containing the specific instructions for the AI to follow when generating the image. | +| `entity_id` | yes | String that points at an `entity_id` of an LLM task entity. If not specified, uses the default LLM task. | +| `attachments` | yes | List of attachments to include in the task. Each attachment is the output of the [Media Selector](/docs/blueprint/selectors/#media-selector). | + +The response variable is a dictionary with the following keys: + +- `media_source_id`: The [Media Source](/integrations/media_source/) content ID of the generated image. +- `url`: The URL of the generated image, without the host part. The URL is only valid for one hour. +- `revised_prompt`: Some models would overwrite the instructions to add more details or context. This is the actual prompt used by the image model. +- `model`: The image model that was used for the image generation. +- `mime_type`: The MIME type of the image. +- `width`: The image width. +- `height`: The image height. +- `conversation_id`: The ID of the conversation used for the task. + +The image will also be saved in the first media directory and will be browsable with the Media Source integration. + +File Naming Convention: +- Format: `{date}_{time}_{sanitized_task_name}.{ext}` +- Example: `2025-01-19_123456_home-security-camera.png` + ## Examples ### Template entity counting items on a camera @@ -147,3 +175,40 @@ automation: ``` {% endraw %} + +### Weather visualization example + +{% raw %} + +```yaml +# Example: Up-to date weather image +automation: + - alias: "Update image when weather changes" + triggers: + - trigger: state + entity_id: weather.home + actions: + - alias: "Generate an image with AI Task" + action: ai_task.generate_image + response_variable: generated_image + data: + task_name: weather visualization + instructions: >- + New York when the weather is {{ states("weather.home") }} + + - alias: "Send out a manual event to update the image entity" + event: new_weather_image + event_data: + url: '{{ generated_image.url }}' + +template: + - trigger: + - alias: "Update image when a new weather image is generated" + trigger: event + event_type: new_weather_image + image: + - name: "AI generated image of New York" + url: "http://localhost:8123{{ trigger.event.data.url }}" +``` + +{% endraw %} diff --git a/source/_integrations/airos.markdown b/source/_integrations/airos.markdown index 34b5b61ad24..fb5d86d8a8d 100644 --- a/source/_integrations/airos.markdown +++ b/source/_integrations/airos.markdown @@ -13,8 +13,8 @@ ha_platforms: - binary_sensor - diagnostics - sensor -ha_integration_type: integration -ha_quality_scale: bronze +ha_integration_type: device +ha_quality_scale: silver --- Ubiquiti UISP-range of [wireless](https://techspecs.ui.com/uisp/wireless) products offer a comprehensive suite of devices specifically designed for interconnecting various locations. As long as these airOS devices can 'see' each other without any (or limited) obstructions like buildings or trees, a stable and high-bandwidth "beam" can be established. Even their most cost-effective devices can achieve up to 450 Mbps real TCP/IP throughput and maintain reliable links up 10km range! diff --git a/source/_integrations/airthings_ble.markdown b/source/_integrations/airthings_ble.markdown index 917598b78df..bac17dee25b 100644 --- a/source/_integrations/airthings_ble.markdown +++ b/source/_integrations/airthings_ble.markdown @@ -28,7 +28,7 @@ Requires Airthings hardware and a compatible Bluetooth dongle. The Airthings BLE integration will automatically discover devices once the [Bluetooth](/integrations/bluetooth) integration is enabled and functional. This will include the device name and its serial number. -There are two ways of retrieving the 10-digit serial number of a Wave device: +There are two ways of retrieving the 10-digit serial number of an Airthings device: 1. At the back of the device, located under the magnetic backplate. 2. Airthings app: **Device settings -> Device info -> Serial Number** @@ -41,6 +41,7 @@ This integration uses the last 6 digits of the serial number. - Wave Mini - Wave Plus - Wave Enhance +- Corentium Home 2 ## Sensors diff --git a/source/_integrations/airzone.markdown b/source/_integrations/airzone.markdown index 8efb6972bee..9a0f7fe64a3 100644 --- a/source/_integrations/airzone.markdown +++ b/source/_integrations/airzone.markdown @@ -70,6 +70,12 @@ For each Airzone zone (thermostat) a *climate entity* is created. ## Select +For each Airzone system (HVAC machine), the following *selects* are created: + +| Condition | Description | +| :------------------ | :--------------------------------- | +| Q-Adapt | Airflow control algorithm. | + For each Airzone zone (thermostat), the following *selects* are created: | Condition | Description | diff --git a/source/_integrations/aladdin_connect.markdown b/source/_integrations/aladdin_connect.markdown index d2c20be61e3..9f6e7b46c9c 100644 --- a/source/_integrations/aladdin_connect.markdown +++ b/source/_integrations/aladdin_connect.markdown @@ -9,10 +9,11 @@ ha_domain: aladdin_connect ha_platforms: - cover - sensor -ha_integration_type: integration +ha_integration_type: hub ha_codeowners: - '@swcloudgenie' ha_config_flow: true +ha_dhcp: true --- The Aladdin Connect integration lets you control Genie Aladdin Connect garage doors through Home Assistant. @@ -27,9 +28,6 @@ Only doors that are owned by your Aladdin Connect account will be available. Doo 2. Create an account. 3. Add a device to the app. -{% note %} -For help with setup, see the [AladdinConnect documentation](https://www.geniecompany.com/aladdin-connect-support). -{% endnote %} {% include integrations/config_flow.md %} @@ -38,9 +36,3 @@ For help with setup, see the [AladdinConnect documentation](https://www.geniecom This integration follows standard integration removal. No extra steps are required. {% include integrations/remove_device_service.md %} - -## Troubleshooting -If you see the below attached screen instead of the login page, please ensure that your -{% term "`configuration.yaml`" %} file includes either a [`default_config:`](/integrations/default_config/) or [`cloud:`](/integrations/cloud/) section. - -![OAuth Error Screen](/images/integrations/aladdin_connect/oauth-screenshot.png) diff --git a/source/_integrations/alexa_devices.markdown b/source/_integrations/alexa_devices.markdown index 44a4b879aa3..529dfe8669e 100644 --- a/source/_integrations/alexa_devices.markdown +++ b/source/_integrations/alexa_devices.markdown @@ -19,7 +19,7 @@ ha_platforms: - sensor - switch ha_integration_type: hub -ha_quality_scale: silver +ha_quality_scale: platinum --- The **Alexa Devices** {% term integration %} lets you control Alexa-enabled devices connected to your Amazon account. @@ -74,10 +74,24 @@ Available actions: `notify.send_message`, `alexa_devices.send_sound`, `alexa_dev Devices with appropriate functionality will have speak and announce notify entities created. These can be used as the target for the `notify.send_message` action. +| Data attribute | Optional | Description | +| -------------- | -------- | ----------------------------------------- | +| `message` | no | Text to be output (see below for advanced markup) | + {% tip %} When sending notifications to multiple devices, you may experience delays due to rate limiting by Amazon. You can avoid this by sending notifications to speaker groups created in Alexa. {% endtip %} +{% details "Advanced Message Markup" %} + +Amazon provide markup to control not only what is said but how it is said and to add additional option such as pausing and playing certain audio clips. Details of this are covered in [Amazon's documentation](https://developer.amazon.com/en-US/docs/alexa/custom-skills/speech-synthesis-markup-language-ssml-reference.html) where there are lots of examples (just pass everything between the `` and `` elements into the `message` parameter of the action). + +Audio files must meet certain criteria on size, bit and sample rates and must be served over HTTPS (see [documentation](https://developer.amazon.com/en-US/docs/alexa/custom-skills/speech-synthesis-markup-language-ssml-reference.html#audio) for full details). These restrictions make them fine for text and sound effects but you will not be able to play music this way. + +Amazon provide a set of [sounds you can use](https://developer.amazon.com/en-US/docs/alexa/custom-skills/ask-soundlibrary.html) which contains the markup you will need for that clip. + +{% enddetails %} + #### Action `alexa_devices.send_text_command` This action essentially allows you to control Alexa using text commands rather than speech. You should be able to request anything you would via speech using this action. @@ -89,14 +103,34 @@ This action essentially allows you to control Alexa using text commands rather t #### Action `alexa_devices.send_sound` -This action allows you to play one of the built-in Alexa sounds. The full list of sounds and their variants is available in [Amazon's documentation](https://developer.amazon.com/en-US/docs/alexa/custom-skills/ask-soundlibrary.html) +This action allows you to play one of the built-in Alexa sounds. The full list of sounds is available in [Amazon's documentation (needs authentication)](https://alexa.amazon.com/api/behaviors/entities?skillId=amzn1.ask.1p.sound) | Data attribute | Optional | Description | | -------------- | -------- | ----------------------------------------- | | `device_id` | no | Device on which you want to play sound | -| `sound_variant` | no | The variant you want to play (generally 1) | | `sound` | no | The name of the sound to play | +## Sensors + +The integration creates sensor entities when the connected device exposes that information. Not every device supports every sensor. + +### Alarm, timer, and reminder sensors + +All Alexa-enabled devices have timestamp sensors that show the next scheduled alarm, timer, and reminder along with their labels. + +### Environmental and device sensors + +- **Temperature** +- **Illuminance** +- **Wi-Fi and Bluetooth connectivity** + +## Supported functionality + +In addition to sensors, you can use the following entities: + +- **Notify** - Speak and Announce notifications +- **Switch** - Do not disturb + ## Examples ### Send announcement when you arrive home @@ -140,37 +174,47 @@ data: ```yaml action: alexa_devices.send_sound data: - sound_variant: 1 - sound: amzn_sfx_doorbell_chime + sound: amzn_sfx_doorbell_chime_01 device_id: 037d79c1af96c67ba57ebcae560fb18e ``` -### Play alternative doorbell sound +### Using advanced markup in a notification ```yaml -action: alexa_devices.send_sound +action: notify.send_message data: - sound_variant: 2 - sound: amzn_sfx_doorbell_chime - device_id: 037d79c1af96c67ba57ebcae560fb18e + message: > + Hello, lets have some examples. + This is me being mildly excited! + The farmer's dog was called bingo. + I can sing high and I can sing low +target: + entity_id: notify.study_dot_speak +``` + +```yaml +action: notify.send_message +data: + message: > + Stop! Hammer Time. Watch out +