diff --git a/docs/configuration/cameras/README.md b/docs/configuration/cameras/README.md index c65068fc..a4166b9c 100644 --- a/docs/configuration/cameras/README.md +++ b/docs/configuration/cameras/README.md @@ -420,7 +420,7 @@ cameras: | ------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `event_type` | | The Home Assistant event type to subscribe to (e.g. `zha_event`, `deconz_event`, or a custom event name fired by one of your automations). Same field name and meaning as in HA automation YAML. May be a single string or a list of strings to match any of them. | | `event_data` | | Optional dictionary of key/value pairs the event's payload must contain for this entry to trigger. Mirrors Home Assistant's `event_data` matching exactly: the top-level keys you list must be present in the payload (extra payload keys are ignored), and nested objects are matched the same way -- list only the keys you care about and extra nested keys are ignored. Omit entirely to trigger on every fire of this `event_type`. | -| `context` | | Optional filter on the event's `context` object. Recognised fields: `id`, `user_id`, `parent_id`. Each field may be a single value (equality) or a list (membership). All listed fields must match. | +| `context` | | Optional filter on the event's `context` object. Recognized fields: `id`, `user_id`, `parent_id`. Each field may be a single value (equality) or a list (membership). All listed fields must match. | > [!TIP] Shared `event_type` values like `zha_event` and `deconz_event` fire for **every** device on that integration. Without an `event_data` filter the camera would trigger on any Zigbee/deCONZ device press in your home. Use `event_data` to narrow down to the specific device you care about; you can copy values straight out of **Developer tools → Events** in Home Assistant. diff --git a/docs/configuration/conditions-triggers.md b/docs/configuration/conditions-triggers.md index e310920c..9deb0266 100644 --- a/docs/configuration/conditions-triggers.md +++ b/docs/configuration/conditions-triggers.md @@ -229,7 +229,7 @@ triggers: | `trigger` | Must be `event`. | | `event_type` | The Home Assistant event type to subscribe to (e.g. `zha_event`, `deconz_event`, or a custom event fired by one of your automations). May be a single string or a list of strings to match any of them. | | `event_data` | Optional dictionary of key/value pairs the event's payload must contain for this entry to match. Mirrors Home Assistant's `event_data` matching exactly: the top-level keys you list must be present in the payload (extra payload keys are ignored), and nested objects are matched the same way -- list only the keys you care about and extra nested keys are ignored. Omit entirely to match every fire of `event_type`. | -| `context` | Optional filter on the event's `context` object. Recognised fields: `id`, `user_id`, `parent_id`. Each field may be a single value (equality) or a list (membership). All listed fields must match. | +| `context` | Optional filter on the event's `context` object. Recognized fields: `id`, `user_id`, `parent_id`. Each field may be a single value (equality) or a list (membership). All listed fields must match. | The fired event is exposed to action templates as `trigger.event.*`, matching HA's event trigger template surface (`trigger.event.event_type`, `trigger.event.data`, `trigger.event.context`, `trigger.event.origin`, `trigger.event.time_fired`). diff --git a/docs/configuration/folders.md b/docs/configuration/folders.md index 0082c4e1..cb757be8 100644 --- a/docs/configuration/folders.md +++ b/docs/configuration/folders.md @@ -64,7 +64,7 @@ folders: ``` > [!TIP] -> To match everything at a given level whilst parsing nothing would simply be +> To match everything at a given level while parsing nothing would simply be > represented by an empty object `{}` #### Matchers diff --git a/docs/configuration/live.md b/docs/configuration/live.md index 8d54fbb6..4030bfcd 100644 --- a/docs/configuration/live.md +++ b/docs/configuration/live.md @@ -61,7 +61,7 @@ live: | `enabled` | `true` | Whether the on-screen call controls are shown during a call. Set to `false` to hide them and drive calls from the [`menu`](./menu.md) instead. When hiding the controls, be sure to also remove `call` from `menu.auto_hide` so the menu stays visible allowing the call to be controlled. See [Driving calls from the menu](../examples.md?id=driving-calls-from-the-menu) for a complete example. | | `lock` | `true` | Whether to lock the rest of the card controls/actions while a call is in progress. Prevents an accidental tap, swipe or action mid-call. Set to `false` to allow interactions regardless of call state. | | `ringtone` | | The audible chime played while an inbound call (e.g. one started by [`view.triggers.actions.trigger: call`](./view.md?id=trigger-action-configuration)) is ringing. Stops as soon as the call is answered or ended. Manual calls never ring. See [`ringtone`](#ringtone). | -| `unanswered_timeout_seconds` | `60` | The number of seconds an inbound call may ring unanswered before it is automatically ended. The timer is cancelled the moment the call is answered. Set to `0` to disable the timeout. | +| `unanswered_timeout_seconds` | `60` | The number of seconds an inbound call may ring unanswered before it is automatically ended. The timer is canceled the moment the call is answered. Set to `0` to disable the timeout. | > [!NOTE] Browser autoplay restrictions may prevent the ringtone from playing > until the page has received a user gesture (e.g. a tap or click). When that diff --git a/docs/configuration/menu.md b/docs/configuration/menu.md index efb4bd9a..5a0073a6 100644 --- a/docs/configuration/menu.md +++ b/docs/configuration/menu.md @@ -64,7 +64,7 @@ menu: | `alignment` | `matching` | Whether this menu item should have an alignment that is `matching` the menu alignment or `opposing` the menu alignment. Can be used to create two separate groups of buttons on the menu. The `priority` option orders buttons within a given `alignment`. | | `enabled` | `true` for `call`, `camera_ui`, `cameras`, `display_mode`, `download`, `folders`, `fullscreen`, `gallery`, `info`, `iris`, `live`, `media_player`, `set_review`, `substreams` and `timeline`. `false` for `clips`, `expand`, `image`, `microphone`, `mute`, `pip`, `play`, `ptz_controls`, `ptz_home`, `recordings`, `reviews`, `screenshot` and `snapshots`. | Whether or not to show the button. | | `icon` | | An icon to overriding the default for that button, e.g. `mdi:camera-front`. See also [custom icons](../usage/custom-icons.md). | -| `inert` | `false` | If `true` the button is shown but rendered as inert (greyed out, non-interactive). Differs from `enabled: false`, which removes the button entirely. | +| `inert` | `false` | If `true` the button is shown but rendered as inert (grayed out, non-interactive). Differs from `enabled: false`, which removes the button entirely. | | `permanent` | `false` | If `false` the menu item is hidden when the menu has the `hidden` style and the menu is closed, otherwise it is shown (and sorted to the front). | | `priority` | `50` | The menu item priority. Higher priority items are ordered closer to the start of the menu alignment (i.e. a button with priority `70` will order further to the left than a button with priority `60`). Priority applies separately to `matching` and `opposing` groups (see `alignment` above). Minimum `0`, maximum `100`. | | `state_color` | `true` | Whether to colorize the button based on the state of a related entity (where applicable). | diff --git a/docs/configuration/overrides.md b/docs/configuration/overrides.md index 486ce426..f94f6413 100644 --- a/docs/configuration/overrides.md +++ b/docs/configuration/overrides.md @@ -11,7 +11,10 @@ overrides: ``` > [!WARNING] -> Whilst all configuration parameters are theoretically overridable, in some instances a configuration variable may only be consulted on startup or changing its value may negatively impact behavior -- override results may vary! +> While all configuration parameters are theoretically overridable, in some +> instances a configuration variable may only be consulted on startup or +> changing its value may negatively impact behavior -- override results may +> vary! > [!WARNING] > Avoid an override whose `conditions` depend on a value that the override itself diff --git a/docs/configuration/timeline-pan-mode.md b/docs/configuration/timeline-pan-mode.md index be7fbd86..af2ea30a 100644 --- a/docs/configuration/timeline-pan-mode.md +++ b/docs/configuration/timeline-pan-mode.md @@ -2,9 +2,9 @@ The behavior of the timeline during seeking/dragging can be controlled by means of the icon on the bottom-right of the timeline, or by using the `pan_mode` configuration variable for the relevant timeline controls (e.g. `live.controls.timeline.pan_mode`). -| Configuration name | UI Icon | Behavior | -| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `pan` | pan-horizontal | Dragging the timeline will pan only without selected or seeking any media. | -| `seek-in-camera` | camera-lock | Dragging the timeline will seek / select across all available media from the selected camera only, selecting the media item with the longest duration. | -| `seek-in-media` | play-box-lock | Dragging the timeline will seek within the selected media item only. | -| `seek` | filmstrip-box-multiple | Dragging the timeline will seek / select across all available media from all cameras, selecting the media item with the longest duration whilst favoring (but not limited to) the currently selected camera. | +| Configuration name | UI Icon | Behavior | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `pan` | pan-horizontal | Dragging the timeline will pan only without selected or seeking any media. | +| `seek-in-camera` | camera-lock | Dragging the timeline will seek / select across all available media from the selected camera only, selecting the media item with the longest duration. | +| `seek-in-media` | play-box-lock | Dragging the timeline will seek within the selected media item only. | +| `seek` | filmstrip-box-multiple | Dragging the timeline will seek / select across all available media from all cameras, selecting the media item with the longest duration while favoring (but not limited to) the currently selected camera. | diff --git a/docs/examples.md b/docs/examples.md index 676239e7..47519421 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -376,7 +376,7 @@ elements: The [`doorbell` profile](configuration/profiles.md?id=doorbell) turns a dashboard into a phone-like ringer when somebody presses the doorbell, by setting [`view.triggers.actions.trigger: call`](configuration/view.md?id=triggers) and auto-discovering [HA `event.*` entities](https://www.home-assistant.io/integrations/event/#device-class) with `device_class: doorbell` on the camera's device (Ring, UniFi Protect, Nest, DoorBird, Reolink, etc.). The intended deployment is a wall-mounted tablet sitting on the dashboard. -A doorbell press is instantaneous, so the card synthesises a ring window from [`view.triggers.event_hold_seconds`](configuration/view.md?id=triggers) (default `30`s) -- long enough for a typical phone-style answer window. `untrigger_delay_seconds` then lingers past that, same as for any stateful trigger. +A doorbell press is instantaneous, so the card synthesizes a ring window from [`view.triggers.event_hold_seconds`](configuration/view.md?id=triggers) (default `30`s) -- long enough for a typical phone-style answer window. `untrigger_delay_seconds` then lingers past that, same as for any stateful trigger. `triggers.motion`, `triggers.occupancy`, and `triggers.media_events` are off by default -- only the explicit doorbell press triggers the call, so casual motion won't make the card ring. @@ -506,7 +506,7 @@ automations: > [!WARNING] > This example is only relevant to those doorbells with a design flaw -> that prevents the doorbell being rung whilst a 2-way channel is enabled. This +> that prevents the doorbell being rung while a 2-way channel is enabled. This > means simply watching the stream, when you might _in future_ hold a 2-way > conversation on that stream, can disable the actual whole point of a doorbell -- > to ring! diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 3aaa65b1..2ace6f11 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -55,7 +55,7 @@ To resolve it: 1. Re-create each entry under it in the current format (see the relevant configuration documentation in the sidebar). An upgrade usually fails this way when a feature has been retired, or changed enough that the migration - needs human judgement. + needs human judgment. 1. Once you're happy with the result, delete the `__UPGRADE_FAILURE__` key. The notification clears once the `__UPGRADE_FAILURE__` key is gone. diff --git a/docs/usage/url-actions.md b/docs/usage/url-actions.md index b0e03fa2..de27f6f8 100644 --- a/docs/usage/url-actions.md +++ b/docs/usage/url-actions.md @@ -12,7 +12,7 @@ The Advanced Camera Card will execute these actions in the following circumstanc - On 'tab' change in a dashboard. - When a `navigate` [action](https://www.home-assistant.io/dashboards/actions/) is called on the dashboard (e.g. a button click requests navigation). -- When the user uses the `back` / `forward` browser buttons whilst viewing a +- When the user uses the `back` / `forward` browser buttons while viewing a dashboard. ## Instructions diff --git a/src/card-controller/actions/actions-manager.ts b/src/card-controller/actions/actions-manager.ts index 73148fd8..8fe0a289 100644 --- a/src/card-controller/actions/actions-manager.ts +++ b/src/card-controller/actions/actions-manager.ts @@ -96,7 +96,7 @@ export class ActionsManager implements ActionsExecutor { ev: Event | CustomEvent, ): Promise => { if (!('detail' in ev)) { - // The event may or may not be a CustomEvent object. For example, whilst + // The event may or may not be a CustomEvent object. For example, while // this card doesn't use custom-card-helpers, embedded elements may: // https://github.com/custom-cards/custom-card-helpers/blob/master/src/fire-event.ts#L70 return; diff --git a/src/card-controller/templates/types.ts b/src/card-controller/templates/types.ts index 654c34e6..fb4fa5aa 100644 --- a/src/card-controller/templates/types.ts +++ b/src/card-controller/templates/types.ts @@ -1,7 +1,7 @@ import type { AdvancedCameraCardConfig } from '../../config/schema/types'; // The card state exposed via the `acc` namespace AND as the -// `trigger.from_acc`/`to_acc` before/after snapshots (the card analogue of HA's +// `trigger.from_acc`/`to_acc` before/after snapshots (the card analog of HA's // full `trigger.from_state`/`to_state`). export interface TemplateAdvancedCameraCardState { camera?: string; diff --git a/src/card-controller/view/modifiers/substream.ts b/src/card-controller/view/modifiers/substream.ts index 5cfdccec..fbd2a97f 100644 --- a/src/card-controller/view/modifiers/substream.ts +++ b/src/card-controller/view/modifiers/substream.ts @@ -25,7 +25,7 @@ export class SubstreamViewModifier implements ViewModifier { return; } // A stream equal to the camera itself is semantically "no substream"; - // normalise it to a cleared override so the map doesn't carry self- + // normalize it to a cleared override so the map doesn't carry self- // referential entries. if (!this._options.stream || this._options.stream === cameraID) { view.context?.live?.overrides?.delete(cameraID); diff --git a/src/components-lib/editor/form-labels.ts b/src/components-lib/editor/form-labels.ts index 179e6497..75cd94e5 100644 --- a/src/components-lib/editor/form-labels.ts +++ b/src/components-lib/editor/form-labels.ts @@ -20,7 +20,7 @@ export const getLocalizationKeyForPath = (path: ConfigPath): string => * Compute the label for a form field. Intended for use as an `ha-form` * `computeLabel` callback. A field is named for the setting it edits, which for * a bound field is wherever that setting is stored rather than where the field - * sits in the form. Container nodes are labelled by their explicit title, never + * sits in the form. Container nodes are labeled by their explicit title, never * by configuration path (their headers already render the title). * @param form The form the field belongs to. * @param schema The field's schema. @@ -37,7 +37,7 @@ export const computeFormLabel = ( return schema.label; } if (!isFormFieldSchema(schema)) { - // Only an expandable has a title: a grid lays out fields that are labelled + // Only an expandable has a title: a grid lays out fields that are labeled // individually, and shows nothing of its own. return (schema.type === 'expandable' ? schema.title : null) ?? schema.name ?? ''; } diff --git a/src/components-lib/editor/mode.ts b/src/components-lib/editor/mode.ts index 34f034a9..dfe56e35 100644 --- a/src/components-lib/editor/mode.ts +++ b/src/components-lib/editor/mode.ts @@ -20,7 +20,7 @@ const getShownPaths = (forms: EditorForm[]): Set => // What the full editor shows and the simple editor does not. Configuration // outside this is either something the simple editor shows too, or something -// neither shows (`elements`, `debug`, anything the card does not recognise at +// neither shows (`elements`, `debug`, anything the card does not recognize at // all), which the full editor would be no better at showing. const getFullOnlyPaths = (): Set => { const simplePaths = getShownPaths([ diff --git a/src/components-lib/live/providers/go2rtc-experimental/sources/mse.ts b/src/components-lib/live/providers/go2rtc-experimental/sources/mse.ts index d6482a73..c14733cc 100644 --- a/src/components-lib/live/providers/go2rtc-experimental/sources/mse.ts +++ b/src/components-lib/live/providers/go2rtc-experimental/sources/mse.ts @@ -34,7 +34,7 @@ import { isWebKitUserAgent } from '../utils/user-agent'; // MSE Tuning // =========================================================================== -// These are judgement-based budgets (time, buffered seconds, staged bytes) +// These are judgment-based budgets (time, buffered seconds, staged bytes) // balancing latency and resilience, not derived values. The retained-buffer // window and the staged-bytes cap follow go2rtc's reference web client; the // negotiation timeout has no counterpart there and is added by this diff --git a/src/components-lib/media-dimensions-container-controller.ts b/src/components-lib/media-dimensions-container-controller.ts index 0da396ef..c251314b 100644 --- a/src/components-lib/media-dimensions-container-controller.ts +++ b/src/components-lib/media-dimensions-container-controller.ts @@ -89,7 +89,7 @@ export class MediaDimensionsContainerController implements ReactiveController { private _mediaLoadedHandler = (ev: CustomEvent): void => { const info = ev.detail.info; // Only resize if the media dimensions have changed (otherwise the loading - // image whilst waiting for the stream, will trigger aresize every second). + // image while waiting for the stream, will trigger aresize every second). if ( this._mediaDimensions?.width === info.width && this._mediaDimensions.height === info.height diff --git a/src/components/image-updating-player.ts b/src/components/image-updating-player.ts index 361943bf..2599c5ac 100644 --- a/src/components/image-updating-player.ts +++ b/src/components/image-updating-player.ts @@ -186,7 +186,7 @@ export class AdvancedCameraCardImageUpdatingPlayer livenessOptions: { // Frames are only due while the refresh timer runs. A snapshot with // refreshing switched off shows one picture forever, which is the - // configured behaviour and never a stall. + // configured behavior and never a stall. isFrameExpected: () => this._cachedValueController.hasTimer(), // Allow a whole refresh interval to pass, plus the standard window, so diff --git a/src/components/live/provider.ts b/src/components/live/provider.ts index b4579cbd..3b33c987 100644 --- a/src/components/live/provider.ts +++ b/src/components/live/provider.ts @@ -154,7 +154,7 @@ export class AdvancedCameraCardLiveProvider extends LitElement implements MediaP /** * Determine if a camera image should be shown in lieu of the real stream - * whilst loading. + * while loading. * @returns`true` if an image should be shown. */ private _shouldShowImageDuringLoading(): boolean { @@ -287,7 +287,7 @@ export class AdvancedCameraCardLiveProvider extends LitElement implements MediaP private _getNotification(failure: StreamFailure | null): TemplateResult | null { // If a card *re*-initializes (e.g. was already initialized and then there's // a use of the editor to change the config), cameras will re-initialize in - // place, which means they might be asked to render (here) whilst not yet + // place, which means they might be asked to render (here) while not yet // being initialized. This can cause spurious errors (e.g. lack of resolved // endpoints). Instead, simply never render uninitialized cameras. if (!this.camera?.isInitialized()) { diff --git a/src/condition-trigger/conditions/conditions/state.ts b/src/condition-trigger/conditions/conditions/state.ts index 23ee812c..6e1582e1 100644 --- a/src/condition-trigger/conditions/conditions/state.ts +++ b/src/condition-trigger/conditions/conditions/state.ts @@ -5,9 +5,10 @@ import type { ConditionsEvaluationResult, ConditionState } from '../types'; import type { ConditionEvaluator, ConditionOfType, EvaluatorContext } from './types'; // Home Assistant resolves an expected value that names an `input_*` helper to -// that helper's current state (its Lovelace state-condition behaviour), on both +// that helper's current state (its Lovelace state-condition behavior), on both // the state and the attribute path; only these helper domains are resolved. -// Regexp directly from: https://github.com/home-assistant/core/blob/dev/homeassistant/helpers/condition.py +// Regexp directly from: +// https://github.com/home-assistant/core/blob/dev/homeassistant/helpers/condition.py const INPUT_ENTITY_ID = /^input_(?:select|text|number|boolean|datetime)\.(?!.+__)(?!_)[\da-z_]+(? { // composite the user wrote empty is kept; only one the recursion emptied // is dropped. if (inner.length || !children.length) { - // `arrayify` has already normalised `children`, so rebuilding a + // `arrayify` has already normalized `children`, so rebuilding a // composite the recursion left alone would rewrite Home Assistant's // single-condition spelling (`or: `) into a list the user // never wrote. @@ -672,7 +672,7 @@ const getAutomationList = ( plural: string, singular: string, ): { key: string; items: unknown[] } => { - // Mirroring the schema's rename, the singular key is honoured only when the + // Mirroring the schema's rename, the singular key is honored only when the // plural is absent; an automation with neither is written under the plural. const key = singular in automation && !(plural in automation) ? singular : plural; return { key, items: arrayify(automation[key]) }; diff --git a/src/config/schema/common/preprocess-to-array.ts b/src/config/schema/common/preprocess-to-array.ts index c56a5f1c..ca28b5dc 100644 --- a/src/config/schema/common/preprocess-to-array.ts +++ b/src/config/schema/common/preprocess-to-array.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; import { arrayify } from '../../../utils/basic'; -// Normalise a single item to an array like Home Assistant's `cv.ensure_list` (a +// Normalize a single item to an array like Home Assistant's `cv.ensure_list` (a // key written with no value is a list of nothing). The schema output is always // the list, so the rest of the code only ever sees the canonical form. An // absent value is passed through so that an optional field stays absent rather diff --git a/src/ha/connection/subscription-health-monitor.ts b/src/ha/connection/subscription-health-monitor.ts index 0d7cb86c..64fc586c 100644 --- a/src/ha/connection/subscription-health-monitor.ts +++ b/src/ha/connection/subscription-health-monitor.ts @@ -10,7 +10,7 @@ export interface SubscriptionFailure { failureCount?: number; } -// Recoverable health of a set of keyed subscriptions. A named specialisation +// Recoverable health of a set of keyed subscriptions. A named specialization // for readability and the extension point for any subscription-specific health // surface later. export type SubscriptionHealthInterface = RecoverableHealthInterface< diff --git a/src/ha/event-match.ts b/src/ha/event-match.ts index 77e3bed9..7593ca38 100644 --- a/src/ha/event-match.ts +++ b/src/ha/event-match.ts @@ -88,7 +88,7 @@ const matchesSchemaValue = (expected: unknown, actual: unknown): boolean => { // HA-faithful match for the event `context` object: every defined filter field // must match the event's corresponding field by equality (scalar filter) or // list-membership (array filter). A null event-side field never satisfies an -// explicit filter, mirroring HA's behaviour. +// explicit filter, mirroring HA's behavior. // https://www.home-assistant.io/docs/automation/trigger/#event-trigger export const matchesEventContext = ( filter: HAEventContextFilter, diff --git a/src/scss/editor.scss b/src/scss/editor.scss index 9393fd2d..3872af7e 100644 --- a/src/scss/editor.scss +++ b/src/scss/editor.scss @@ -55,11 +55,11 @@ } // Each top-level section is an HA expansion panel. An open section draws its -// own outline, which would otherwise sit directly against the neighbouring +// own outline, which would otherwise sit directly against the neighboring // sections, so every section is spaced whether it is open or not: a gap that -// appeared only on opening would move the sections below as the panel grew. -// The margins of two adjacent sections collapse together, so the gap is the -// same wherever it falls. +// appeared only on opening would move the sections below as the panel grew. The +// margins of two adjacent sections collapse together, so the gap is the same +// wherever it falls. .section { display: block; diff --git a/src/scss/live-carousel.scss b/src/scss/live-carousel.scss index 5dee442f..534200f0 100644 --- a/src/scss/live-carousel.scss +++ b/src/scss/live-carousel.scss @@ -38,12 +38,12 @@ // Triggered and transmitting cameras are highlighted with a soft inset glow, // drawn by an overlay stacked above the camera feed. The overlays come before -// the carousel controls in source order, so they stack above the feed but -// below the controls; `pointer-events: none` keeps them inert. The glow is an +// the carousel controls in source order, so they stack above the feed but below +// the controls; `pointer-events: none` keeps them inert. The glow is an // interior effect, so it coexists with the grid selection border (see // media-grid.scss) without competing for the `border` property. // -// The two states differ by colour and rhythm: triggered is an amber glow that +// The two states differ by color and rhythm: triggered is an amber glow that // pulses fully out and back (a "something happened" beacon), transmitting is a // red glow that breathes gently without ever fully fading ("you are live"). // Transmitting wins: while it is active the trigger overlay is faded out. @@ -82,7 +82,7 @@ // Hidden by default; activation/deactivation is a plain opacity fade. Each // overlay carries its own static box-shadow (not scoped to the // `[triggered]`/`[transmitting]` selectors) so the glow stays painted in its - // own colour throughout the fade-out, after its animation has been removed. + // own color throughout the fade-out, after its animation has been removed. opacity: 0; transition: opacity 0.5s ease-in-out; } diff --git a/src/scss/thumbnail-feature-thumbnail.scss b/src/scss/thumbnail-feature-thumbnail.scss index a76faf7a..19374d69 100644 --- a/src/scss/thumbnail-feature-thumbnail.scss +++ b/src/scss/thumbnail-feature-thumbnail.scss @@ -26,8 +26,7 @@ img { border-radius: var(--advanced-camera-card-border-radius-final); // Not 'contain' as some thumbnails may vary in aspect-ratio slightly and - // should be clipped to fill the thumbnail div whilst maintaining - // aspect-ratio. + // should be clipped to fill the thumbnail div while maintaining aspect-ratio. object-fit: cover; } diff --git a/src/utils/task.ts b/src/utils/task.ts index 68a87942..224d67c8 100644 --- a/src/utils/task.ts +++ b/src/utils/task.ts @@ -10,7 +10,7 @@ import { errorToConsole } from './basic'; * @param host The host object. * @param task The Lit task. * @param completeFunc The function to call with the result. - * @param inProgressFunc The function to call whilst in progress. + * @param inProgressFunc The function to call while in progress. * @returns A template. */ export const renderTask = ( diff --git a/tests/browser/dom.ts b/tests/browser/dom.ts index 58aa1fd6..12babf5b 100644 --- a/tests/browser/dom.ts +++ b/tests/browser/dom.ts @@ -92,7 +92,7 @@ export const tabUntil = async ( /** * Click an element with a real pointer, which is the only kind that carries the - * browser's own behaviour: the press moves focus, and an element that stops the + * browser's own behavior: the press moves focus, and an element that stops the * press doing so leaves it where it was. */ export const clickElement = async (element: Element): Promise => diff --git a/tests/browser/fake-hass.ts b/tests/browser/fake-hass.ts index c2e8ee84..5210e9b8 100644 --- a/tests/browser/fake-hass.ts +++ b/tests/browser/fake-hass.ts @@ -92,12 +92,12 @@ const createRegistryEntry = (entityID: string, overrides?: Partial): Ent * A driveable stand-in for the `hass` object the card is handed by Home * Assistant. * - * Home Assistant updates immutably, and that is the behaviour reproduced here: - * a change hands consumers a new top-level object and a new `states` map - * holding a new state object for the entity that changed, while every other - * entity keeps the object it already had. Anything the card can observe about - * a real `hass` it must be able to observe about this one, so a divergence here - * is a bug in the fake rather than a shortcut worth taking. + * Home Assistant updates immutably, and that is the behavior reproduced here: a + * change hands consumers a new top-level object and a new `states` map holding + * a new state object for the entity that changed, while every other entity + * keeps the object it already had. Anything the card can observe about a real + * `hass` it must be able to observe about this one, so a divergence here is a + * bug in the fake rather than a shortcut worth taking. */ export class FakeHASS { private _hass: HomeAssistant; diff --git a/tests/browser/ha-element-stubs.ts b/tests/browser/ha-element-stubs.ts index c7bd656d..eed57468 100644 --- a/tests/browser/ha-element-stubs.ts +++ b/tests/browser/ha-element-stubs.ts @@ -40,8 +40,8 @@ class HAPlayerStandIn extends LitElement { } /** - * A stand-in that renders its children and nothing else. Behaviour is added - * only for elements the card is observed to depend on. + * A stand-in that renders its children and nothing else. Behavior is added only + * for elements the card is observed to depend on. */ class HAElementStub extends LitElement { static styles = css` diff --git a/tests/browser/mounted-card.ts b/tests/browser/mounted-card.ts index 8ccaa745..fadc32be 100644 --- a/tests/browser/mounted-card.ts +++ b/tests/browser/mounted-card.ts @@ -158,11 +158,11 @@ interface EventEntry { target: EventTarget | null; } -interface LabelledElement extends Element { +interface LabeledElement extends Element { label?: string; } -const hasLabel = (element: Element): element is LabelledElement => 'label' in element; +const hasLabel = (element: Element): element is LabeledElement => 'label' in element; /** * What a control calls itself to the user. The card titles the controls it diff --git a/tests/browser/style.ts b/tests/browser/style.ts index 9f5a4698..2d3a582d 100644 --- a/tests/browser/style.ts +++ b/tests/browser/style.ts @@ -36,7 +36,7 @@ const HOME_ASSISTANT_THEME = ` color: var(--primary-text-color); } - /* A dashboard sits the card on the background colour with room around it. */ + /* A dashboard sits the card on the background color with room around it. */ body { background: var(--primary-background-color); margin: 0; diff --git a/tests/browser/test-media.ts b/tests/browser/test-media.ts index f86d957c..2555718f 100644 --- a/tests/browser/test-media.ts +++ b/tests/browser/test-media.ts @@ -87,13 +87,13 @@ export const getTestMediaRequestCount = (url: string): number => { /** * Serves a fixture at `/test-media/`, behaving as the query asks: * - * token Which counter the request belongs to, so that a test's - * behaviour does not depend on what ran before it. - * responses The status to answer each request with, in order: `200` serves - * the file and anything else is sent as an empty error. - * repeat What to do once the `responses` list is exhausted: answer every - * request after it as the last one was, or never answer again - * (i.e. camera going quiet). + * token Which counter the request belongs to, so that a test's behavior + * does not depend on what ran before it. responses The status to + * answer each request with, in order: `200` serves the file and + * anything else is sent as an empty error. repeat What to do + * once the `responses` list is exhausted: answer every request + * after it as the last one was, or never answer again (i.e. camera + * going quiet). * * Answered from within the page rather than by a server, because a request the * page is still waiting on holds one of the handful of connections a browser diff --git a/tests/card-controller/call/manager.test.ts b/tests/card-controller/call/manager.test.ts index 4859ad02..6d23f732 100644 --- a/tests/card-controller/call/manager.test.ts +++ b/tests/card-controller/call/manager.test.ts @@ -1373,8 +1373,8 @@ describe('answer', () => { expect(getRingtone().stop).toHaveBeenCalled(); - // Timer was armed and should now be cancelled: advancing past the - // timeout must not end the (now-answered) call. + // Timer was armed and should now be canceled: advancing past the timeout + // must not end the (now-answered) call. vi.advanceTimersByTime(60_000); expect(manager.isActive()).toBe(true); } finally { diff --git a/tests/card-controller/call/tones/custom.test.ts b/tests/card-controller/call/tones/custom.test.ts index 75668589..213d8a4a 100644 --- a/tests/card-controller/call/tones/custom.test.ts +++ b/tests/card-controller/call/tones/custom.test.ts @@ -12,8 +12,8 @@ interface AudioMocks { } // Uses real jsdom HTMLAudioElement instances and only stubs the parts jsdom -// can't fulfil (`play()` / `pause()` -- no audio backend). Tests then exercise -// observable behaviour: registered listeners fire via `dispatchEvent`, property +// can't fulfill (`play()` / `pause()` -- no audio backend). Tests then exercise +// observable behavior: registered listeners fire via `dispatchEvent`, property // writes round-trip on the element, etc. // // Called once at module load. The `beforeEach`/`afterEach` calls inside this diff --git a/tests/card-controller/camera-triggers-manager.test.ts b/tests/card-controller/camera-triggers-manager.test.ts index 3c633369..7bace79c 100644 --- a/tests/card-controller/camera-triggers-manager.test.ts +++ b/tests/card-controller/camera-triggers-manager.test.ts @@ -538,7 +538,8 @@ describe('CameraTriggersManager', () => { vi.runOnlyPendingTimers(); await flushPromises(); - // Should still be triggered because the second 'new' event should have cancelled the first timer. + // Should still be triggered because the second 'new' event should have + // canceled the first timer. expect(manager.isTriggered()).toBeTruthy(); expect(api.getViewManager().setViewDefaultWithNewQuery).not.toHaveBeenCalled(); }); diff --git a/tests/card-controller/initialization/session-manager.test.ts b/tests/card-controller/initialization/session-manager.test.ts index 34a32efe..f75d2a86 100644 --- a/tests/card-controller/initialization/session-manager.test.ts +++ b/tests/card-controller/initialization/session-manager.test.ts @@ -245,7 +245,7 @@ describe('SessionManager', () => { }); }); - // The user-facing behaviour the machine exists for, driven through the real + // The user-facing behavior the machine exists for, driven through the real // schema, trigger factory and evaluator rather than hand-written state. describe('should drive the initialized trigger', () => { it('should fire once per session and not when a session ends', () => { diff --git a/tests/card-controller/issues/issue-manager.test.ts b/tests/card-controller/issues/issue-manager.test.ts index c88751c0..cf5166e7 100644 --- a/tests/card-controller/issues/issue-manager.test.ts +++ b/tests/card-controller/issues/issue-manager.test.ts @@ -873,7 +873,7 @@ describe('IssueManager', () => { // The attempt is now in flight: the problem is still unresolved // (needsRetry) but cannot be retried right now (canRetryNow). The running - // timer is cancelled and no further attempt fires, however long we wait. + // timer is canceled and no further attempt fires, however long we wait. canRetryNow.mockReturnValue(false); manager.evaluate(); vi.advanceTimersByTime(RETRY_EXPONENTIAL_MAX_SECONDS * 1000); diff --git a/tests/card-controller/issues/issues/media-unavailable.browser.test.ts b/tests/card-controller/issues/issues/media-unavailable.browser.test.ts index 89aeebe3..bda19426 100644 --- a/tests/card-controller/issues/issues/media-unavailable.browser.test.ts +++ b/tests/card-controller/issues/issues/media-unavailable.browser.test.ts @@ -488,7 +488,7 @@ describe('MediaUnavailableIssue', () => { await card.events.waitForFirst('advanced-camera-card:issue:trigger'); - // The status bar only summarises. Everything a user can do about the + // The status bar only summarizes. Everything a user can do about the // failure is behind it, which is the point of the issue report being // clickable. await card.clickControl(MEDIA_ISSUE_TITLE); diff --git a/tests/card-controller/style-manager.browser.test.ts b/tests/card-controller/style-manager.browser.test.ts index 785e9f84..f49bbdcc 100644 --- a/tests/card-controller/style-manager.browser.test.ts +++ b/tests/card-controller/style-manager.browser.test.ts @@ -7,9 +7,9 @@ import { createStillImageCardConfig, } from '../browser/test-utils'; -// A colour the dark theme sets and the card carries no other way. Reading it -// back proves the stylesheet reached the card rather than merely compiling. -// See src/scss/themes/dark.scss . +// A color the dark theme sets and the card carries no other way. Reading it +// back proves the stylesheet reached the card rather than merely compiling. See +// src/scss/themes/dark.scss . const DARK_PRIMARY_BACKGROUND = '#111111'; const mountThemed = async (themes: ThemeName[]) => diff --git a/tests/components-lib/editor/form-labels.test.ts b/tests/components-lib/editor/form-labels.test.ts index 984493fc..a7304de3 100644 --- a/tests/components-lib/editor/form-labels.test.ts +++ b/tests/components-lib/editor/form-labels.test.ts @@ -118,7 +118,7 @@ describe('computeFormLabel', () => { }); it('should return an empty label for a grid', () => { - // The fields a grid lays out are labelled individually; the grid itself + // The fields a grid lays out are labeled individually; the grid itself // shows nothing. expect(computeFormLabel(createForm([]), { type: 'grid', schema: [] })).toBe(''); }); diff --git a/tests/condition-trigger/triggers/triggers/numeric-state.test.ts b/tests/condition-trigger/triggers/triggers/numeric-state.test.ts index 16a3e02d..4c8ce21c 100644 --- a/tests/condition-trigger/triggers/triggers/numeric-state.test.ts +++ b/tests/condition-trigger/triggers/triggers/numeric-state.test.ts @@ -379,7 +379,7 @@ describe('NumericStateTrigger', () => { setHass(stateManager, { [SENSOR]: { state: '25' } }); vi.advanceTimersByTime(3000); - // Leaves the range before the hold elapses: cancelled. + // Leaves the range before the hold elapses: canceled. setHass(stateManager, { [SENSOR]: { state: '10' } }); vi.advanceTimersByTime(5000); expect(callback).not.toHaveBeenCalled(); diff --git a/tests/config/schema/common/preprocess-to-array.test.ts b/tests/config/schema/common/preprocess-to-array.test.ts index 3a190761..651dc8ba 100644 --- a/tests/config/schema/common/preprocess-to-array.test.ts +++ b/tests/config/schema/common/preprocess-to-array.test.ts @@ -14,7 +14,7 @@ describe('preprocessToArray', () => { }); }); - it('should normalise a single item to a list', () => { + it('should normalize a single item to a list', () => { expect(schema.parse({ items: { name: 'office' } })).toEqual({ items: [{ name: 'office' }], }); diff --git a/tests/config/types.test.ts b/tests/config/types.test.ts index e858ea0f..5267a021 100644 --- a/tests/config/types.test.ts +++ b/tests/config/types.test.ts @@ -1389,7 +1389,7 @@ describe('conditions should accept Home Assistant composite shorthand', () => { }); }); - it('should normalise a single shorthand condition to a list', () => { + it('should normalize a single shorthand condition to a list', () => { expect( conditionSchema.parse({ or: { condition: 'fullscreen', fullscreen: true } }), ).toMatchObject({ @@ -1760,7 +1760,7 @@ describe('should lazy evaluate schemas', () => { ).toBeFalsy(); }); - it('should normalise single if/then/else items to lists', () => { + it('should normalize single if/then/else items to lists', () => { const result = actionConfigSchema.parse({ if: { condition: 'state', entity_id: 'light.office', state: 'on' }, then: { @@ -1912,7 +1912,7 @@ describe('automations should require actions', () => { }); describe('automations should accept Home Assistant input shorthands', () => { - it('should normalise singular keys and single items to lists', () => { + it('should normalize singular keys and single items to lists', () => { const result = automationsSchema.parse([ { trigger: { trigger: 'state', entity_id: 'binary_sensor.door', to: 'on' }, diff --git a/tests/dist/dist.browser.test.ts b/tests/dist/dist.browser.test.ts index 394dcd6e..ce47a49c 100644 --- a/tests/dist/dist.browser.test.ts +++ b/tests/dist/dist.browser.test.ts @@ -227,7 +227,7 @@ describe('the built card', () => { // only through the accessors `@property` installs. Were the decorator // output wrong, writes would land on plain instance fields and none of this // would work. This verifies the build's treatment of decorators rather than - // the card's behaviour per se (already well covered in other tests). + // the card's behavior per se (already well covered in other tests). await mounted.events.waitForFirst('advanced-camera-card:media:loaded'); expect(isLiveMediaShowing(mounted.card)).toBe(true); diff --git a/vite.config.ts b/vite.config.ts index e3d4aebe..b85f7220 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -46,12 +46,13 @@ export default defineConfig(({ mode }) => { }, resolve: { - // Same as Vite's default, minus the trailing `jsnext:main` and `jsnext`: an - // early convention for naming an ES module build that `module` replaced. - // `moment` is the one dependency still shipping it, and honouring it hands - // out moment as an ES module, which `vis-timeline`'s CommonJS build cannot - // then use -- causing timeline views to throw an error. Requiring an ES - // module yields the namespace object rather than moment itself. + // Same as Vite's default, minus the trailing `jsnext:main` and `jsnext`: + // an early convention for naming an ES module build that `module` + // replaced. `moment` is the one dependency still shipping it, and + // honoring it hands out moment as an ES module, which `vis-timeline`'s + // CommonJS build cannot then use -- causing timeline views to throw an + // error. Requiring an ES module yields the namespace object rather than + // moment itself. mainFields: ['browser', 'module'], }, diff --git a/vitest.browser.config.ts b/vitest.browser.config.ts index 18d86221..144f4f7b 100644 --- a/vitest.browser.config.ts +++ b/vitest.browser.config.ts @@ -24,7 +24,7 @@ export default defineConfig({ resolve: { // Several dependencies declare their own Lit. Two copies in one page do not - // recognise each other's directives and template results, which surfaces as + // recognize each other's directives and template results, which surfaces as // "Multiple versions of Lit loaded" followed by render-time type errors. // The build gets one copy from its own resolver; the tests have to be told. dedupe: ['lit', 'lit-html', 'lit-element', '@lit/reactive-element'],