@umriss-ui/schedule 0.43.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -18,6 +18,34 @@ moves from here under the rule above.
18
18
 
19
19
  ---
20
20
 
21
+ ## 0.45.0 – A plan in the plant's time (Oct. 2026)
22
+
23
+ ### Added
24
+
25
+ - **The schedule follows the time zone named in core's formats** (ADR-0076): the day and fine bands, the snap raster of a drag or a key move, and today are the zone's, and the zone's name stands once above the lane headers and in the plot's description where the reader's own zone is another. `snapTime` takes the zone as an optional last argument.
26
+
27
+ ### Changed
28
+
29
+ - **On the day the clocks go back, the time axis follows the clock change** in the reader's zone as in a named one: a two-hour step stays on even hours, and a time inside the doubled hour carries its offset (`02:30 GMT+1`) in the band, the tooltip, the ghost and the summary. Today covers the whole 25-hour day.
30
+ - Migration: none needed; only a plan across a clock change looks different.
31
+ - **The peer ranges on core and charts move to `^0.45.0`.**
32
+ - Migration: install the 0.45 versions of `@umriss-ui/core` and `@umriss-ui/charts` beside it.
33
+
34
+ ## 0.44.0 – Malformed data says so, and the handle goes (Oct. 2026)
35
+
36
+ ### Added
37
+
38
+ - **Malformed data warns once per cause in development:** a span that does not end after it starts, an item on an undeclared lane, an unknown task or dependency end, an id that stands twice. The checks run only in development.
39
+
40
+ ### Changed
41
+
42
+ - **`ScheduleHandle` and the handle ref are removed;** 0.43.0 deprecated them. A `Schedule` ref is typed `HTMLDivElement`, and `positionAt`, `clientPointOf` and `visibleDomain` are on `useSchedule`'s return.
43
+ - Migration: replace `ref.current.positionAt(x, y)` with `positionAt(x, y)` from `const { positionAt } = useSchedule()`, and the same for `clientPointOf` and `visibleDomain`; type a ref as `HTMLDivElement`.
44
+ - **`ariaLabel` on `Schedule` is removed;** 0.43.0 renamed it `aria-label`.
45
+ - Migration: write `aria-label` (TypeScript flags every use of `ariaLabel`).
46
+ - **The peer ranges on core and charts move to `^0.44.0`.**
47
+ - Migration: install the 0.44 versions of `@umriss-ui/core` and `@umriss-ui/charts` beside it.
48
+
21
49
  ## 0.43.0 – A schedule that fills its frame, and takes a finger (Oct. 2026)
22
50
 
23
51
  ### Added
package/README.md CHANGED
@@ -60,6 +60,8 @@ export function Plan() {
60
60
  }
61
61
  ```
62
62
 
63
+ Malformed data - a subtask that does not end after it starts, an item on a lane no `Lane` declares, a dependency naming no subtask, an id that stands twice - warns in development, once per cause, and is left out in production. An application with imported data checks it where it imports it.
64
+
63
65
  ## Editing is controlled
64
66
 
65
67
  The schedule draws the data it is given and changes none of it (ADR-0023). A
@@ -183,11 +185,21 @@ pointer's tooltip names it by label (or id) and time; the keys walk to it in
183
185
  time order among the work of its lane, and the live region reads its lane,
184
186
  label and time.
185
187
 
188
+ ## The plant's time zone
189
+
190
+ The schedule follows the `timeZone` of core's formats (`<LanguageProvider formats={{ timeZone: "Europe/Berlin" }}>`);
191
+ it takes no prop of its own. The fine band reads the zone's hours, the day band holds the zone's days, "today"
192
+ is the zone's, and the now line, an instant, does not move. A `snap` raster is laid on the zone's time: eight
193
+ hours offset by six snap to 06:00, 14:00 and 22:00 there on both sides of a clock change (`snapTime(time,
194
+ raster, timeZone?)` takes the zone as its last argument). A time inside the hour a clock change doubles carries
195
+ its offset (`02:30 GMT+1`), in the band, the tooltip, the ghost and the summary. Where the reader's zone is
196
+ another, the zone's name stands once above the lane headers and in the plot's description (core's
197
+ `useTimeZoneLabel`); without a named zone, nothing changes.
198
+
186
199
  ## Not yet
187
200
 
188
201
  What the schedule does not do today, and waits for a caller who needs it (what
189
- it never does stands in ADR-0032): umriss shows the reader's time, and a
190
- plant's zone is not yet offered (ADR-0060).
202
+ it never does stands in ADR-0032).
191
203
 
192
204
  * **Stacked overlap** — overlapping subtasks packed into sub-lanes on request;
193
205
  today an overlap is always drawn offset, as the finding it is.
package/dist/index.d.ts CHANGED
@@ -2,7 +2,6 @@ import { CalendarInput } from '@umriss-ui/charts';
2
2
  import { HTMLAttributes } from 'react';
3
3
  import { ReactNode } from 'react';
4
4
  import { Ref } from 'react';
5
- import { RefObject } from 'react';
6
5
 
7
6
  /** The subtask as the intent asks for it. An intent for another subtask leaves
8
7
  it as it is. */
@@ -346,25 +345,6 @@ export declare interface ResolvedAppearance {
346
345
  bounded number of pushes instead of running on. */
347
346
  export declare function ripple(subtasks: readonly Subtask[], dependencies: readonly Dependency[], intent: Intent): MoveIntent[];
348
347
 
349
- /** What a schedule offers a caller imperatively: the arithmetic between a
350
- point on the screen and a time on a lane. Everything else is props.
351
- @deprecated since 0.43 - use the functions on `useSchedule`'s return. */
352
- export declare interface ScheduleHandle {
353
- /** The time and the lane at a client point, or null outside the plot. */
354
- positionAt: (clientX: number, clientY: number) => {
355
- time: number;
356
- lane: string | null;
357
- } | null;
358
- /** The client point of a time - on the middle of a lane where one is named -
359
- or null while the schedule is not on screen. */
360
- clientPointOf: (time: number, lane?: string) => {
361
- x: number;
362
- y: number;
363
- } | null;
364
- /** The visible span, as two wall-clock instants. */
365
- visibleDomain: () => readonly [number, number];
366
- }
367
-
368
348
  /** What a pointer is on. */
369
349
  export declare type ScheduleHit = {
370
350
  readonly kind: "subtask";
@@ -416,10 +396,8 @@ export declare interface ScheduleOptions {
416
396
  }
417
397
 
418
398
  declare interface ScheduleOwnProps extends Omit<HTMLAttributes<HTMLDivElement>, "children" | "aria-label"> {
419
- /** Receives the root element. A ref to the deprecated `ScheduleHandle` still
420
- works for one more minor release: the element carries its three
421
- functions. */
422
- ref?: Ref<HTMLDivElement> | RefObject<ScheduleHandle | null> | undefined;
399
+ /** Receives the root element. */
400
+ ref?: Ref<HTMLDivElement> | undefined;
423
401
  /** Height in CSS pixels, both bands included, fixed. Left out, the schedule
424
402
  fills its frame - a stretched grid cell, a card the grid stretches, a
425
403
  container of definite height - and never goes below 400 px, which is also
@@ -593,17 +571,10 @@ export declare interface ScheduleParts {
593
571
  reads itself. `ref`, `className`, `style` and the rest reach the root; the
594
572
  name (`aria-label`, `aria-labelledby`) reaches the figure root and the plot,
595
573
  and a `aria-describedby` of yours is joined to the plot's summary. */
596
- export declare type ScheduleProps = ScheduleOwnProps & ({
574
+ export declare type ScheduleProps = ScheduleOwnProps & {
597
575
  /** What the schedule shows, for a screen reader: "Plan of week 38". */
598
576
  "aria-label": string;
599
- /** @deprecated since 0.43 - use `aria-label`. */
600
- ariaLabel?: string;
601
- } | {
602
- "aria-label"?: undefined;
603
- /** What the schedule shows, for a screen reader.
604
- @deprecated since 0.43 - use `aria-label`. */
605
- ariaLabel: string;
606
- });
577
+ };
607
578
 
608
579
  /** What a tooltip is about: the hovered subtask or dependency, with what the
609
580
  schedule knows about it. */
@@ -671,10 +642,10 @@ export declare interface SnapRaster {
671
642
  readonly offset: number;
672
643
  }
673
644
 
674
- /** `time` onto the nearest line of the raster in local time - a step alone
675
- starts at local midnight. A step of zero or less is no raster: the time
676
- stays as it is. */
677
- export declare function snapTime(time: number, raster: number | SnapRaster): number;
645
+ /** `time` onto the nearest line of the raster in the zone's time, the reader's
646
+ unless one is named - a step alone starts at the zone's midnight. A step of
647
+ zero or less is no raster: the time stays as it is. */
648
+ export declare function snapTime(time: number, raster: number | SnapRaster, timeZone?: string): number;
678
649
 
679
650
  /** Stretch the main time at one or both of its edges. */
680
651
  export declare interface StretchIntent {
package/dist/schedule.css CHANGED
@@ -1 +1 @@
1
- @layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{._text_18806_22{font-family:var(--u-font-sans);font-size:var(--u-text-md);line-height:var(--u-leading-normal);color:var(--u-color-text);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}@media(pointer:fine){._dense_18806_38{--u-control-height-sm: var(--u-control-height-xs)}}._ink_18806_49{--u-color-text: var(--u-color-bg);--u-color-text-secondary: color-mix(in srgb, var(--u-color-bg) 75%, transparent);--u-color-text-muted: color-mix(in srgb, var(--u-color-bg) 60%, transparent)}._extent_18806_75{--_chars: 20;--_extra: 0;--_tracking: 0px;--_chrome: 0px;min-inline-size:0;max-inline-size:100%;contain:inline-size;contain-intrinsic-inline-size:calc((var(--_chars) + var(--_extra)) * (1ch + var(--_tracking)) + var(--_chrome))}._field_18806_90{caret-color:var(--u-color-accent)}._scroll_18806_96{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_18806_96::-webkit-scrollbar{width:10px;height:10px}._scroll_18806_96::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--u-color-text) 22%,transparent);border-radius:var(--u-radius-full);border:3px solid transparent;background-clip:content-box}._scroll_18806_96::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_18806_125:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_18806_90._field_18806_90,._fieldRoot_18806_145._fieldRoot_18806_145{font-size:16px}}._field_18806_90:-webkit-autofill,._field_18806_90:-webkit-autofill:hover,._field_18806_90:-webkit-autofill:focus{-webkit-box-shadow:inset 0 0 0 1000px var(--u-color-surface),0 0 0 1px var(--u-edge-color-strong);-webkit-text-fill-color:var(--u-color-text);caret-color:var(--u-color-accent)}}@layer umriss.components{._root_mm9nj_4,._root_mm9nj_4:before,._root_mm9nj_4:after{box-sizing:border-box}._corner_mm9nj_19,._corner_mm9nj_19:before,._corner_mm9nj_19:after{box-sizing:border-box}._dayBand_mm9nj_23,._dayBand_mm9nj_23:before,._dayBand_mm9nj_23:after{box-sizing:border-box}._tickBand_mm9nj_24,._tickBand_mm9nj_24:before,._tickBand_mm9nj_24:after{box-sizing:border-box}._day_mm9nj_23,._day_mm9nj_23:before,._day_mm9nj_23:after{box-sizing:border-box}._dayLabel_mm9nj_50,._dayLabel_mm9nj_50:before,._dayLabel_mm9nj_50:after{box-sizing:border-box}._tick_mm9nj_24,._tick_mm9nj_24:before,._tick_mm9nj_24:after{box-sizing:border-box}._tickLabel_mm9nj_71,._tickLabel_mm9nj_71:before,._tickLabel_mm9nj_71:after{box-sizing:border-box}._headers_mm9nj_81,._headers_mm9nj_81:before,._headers_mm9nj_81:after{box-sizing:border-box}._header_mm9nj_81,._header_mm9nj_81:before,._header_mm9nj_81:after{box-sizing:border-box}._headerLabel_mm9nj_100,._headerLabel_mm9nj_100:before,._headerLabel_mm9nj_100:after{box-sizing:border-box}._headerCount_mm9nj_136,._headerCount_mm9nj_136:before,._headerCount_mm9nj_136:after{box-sizing:border-box}._chevron_mm9nj_145,._chevron_mm9nj_145:before,._chevron_mm9nj_145:after{box-sizing:border-box}._plot_mm9nj_223,._plot_mm9nj_223:before,._plot_mm9nj_223:after{box-sizing:border-box}._focusRing_mm9nj_237,._focusRing_mm9nj_237:before,._focusRing_mm9nj_237:after{box-sizing:border-box}._layer_mm9nj_255,._layer_mm9nj_255:before,._layer_mm9nj_255:after{box-sizing:border-box}._grip_mm9nj_282,._grip_mm9nj_282:before,._grip_mm9nj_282:after{box-sizing:border-box}._ghostLabel_mm9nj_292,._ghostLabel_mm9nj_292:before,._ghostLabel_mm9nj_292:after{box-sizing:border-box}._finding_mm9nj_305,._finding_mm9nj_305:before,._finding_mm9nj_305:after{box-sizing:border-box}._refusal_mm9nj_313,._refusal_mm9nj_313:before,._refusal_mm9nj_313:after{box-sizing:border-box}._tooltip_mm9nj_317,._tooltip_mm9nj_317:before,._tooltip_mm9nj_317:after{box-sizing:border-box}._tooltipHead_mm9nj_336,._tooltipHead_mm9nj_336:before,._tooltipHead_mm9nj_336:after{box-sizing:border-box}._tooltipTimes_mm9nj_341,._tooltipTimes_mm9nj_341:before,._tooltipTimes_mm9nj_341:after{box-sizing:border-box}._now_mm9nj_350,._now_mm9nj_350:before,._now_mm9nj_350:after{box-sizing:border-box}._barLabel_mm9nj_364,._barLabel_mm9nj_364:before,._barLabel_mm9nj_364:after{box-sizing:border-box}._barLabelText_mm9nj_377,._barLabelText_mm9nj_377:before,._barLabelText_mm9nj_377:after{box-sizing:border-box}._root_mm9nj_4{display:grid;grid-template-rows:28px minmax(0,1fr) 28px;width:100%;font-size:var(--u-text-sm);background:var(--u-color-surface);outline:1px solid transparent;box-shadow:var(--u-edge);border-radius:var(--u-radius-md);corner-shape:squircle;overflow:hidden;font-variant-numeric:tabular-nums;user-select:none}._corner_mm9nj_19{background:var(--u-color-surface)}._dayBand_mm9nj_23,._tickBand_mm9nj_24{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_mm9nj_23{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_mm9nj_24{border-top:1px solid var(--u-hairline-strong)}._day_mm9nj_23{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_mm9nj_50{position:absolute;z-index:1;left:var(--u-space-1);padding:0 var(--u-space-1);background:var(--u-color-surface);top:50%;transform:translateY(-50%);white-space:nowrap;color:var(--u-color-text);font-weight:var(--u-weight-medium)}._tick_mm9nj_24{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_mm9nj_71{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_mm9nj_81{contain:size;position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_mm9nj_81{display:flex;align-items:center;gap:var(--u-space-2);padding-right:var(--u-space-3);border-bottom:1px solid var(--u-hairline);overflow:hidden;white-space:nowrap}._headerLabel_mm9nj_100{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_mm9nj_81[data-row=lane],._header_mm9nj_81[data-row=miniature]{container:lane-header / size}@container lane-header (height >= 2.5rem){._headerLabel_mm9nj_100:not(:has(*)){display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;white-space:normal;text-wrap:balance}}._header_mm9nj_81[data-row=groupHead],._header_mm9nj_81[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_mm9nj_136{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_mm9nj_145{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;border-radius:var(--u-radius-xs);corner-shape:squircle;background:transparent;color:var(--u-color-text-secondary);cursor:pointer;transition:background-color var(--u-transition),color var(--u-transition)}._chevron_mm9nj_145:hover{background:var(--u-color-surface-sunken);color:var(--u-color-text)}._chevron_mm9nj_145:active{background:var(--u-color-surface-pressed)}._chevron_mm9nj_145:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._chevron_mm9nj_145 svg{box-sizing:border-box}._chevron_mm9nj_145 svg{transition:transform var(--u-transition-path)}._chevron_mm9nj_145 svg[data-open]{box-sizing:border-box}._chevron_mm9nj_145 svg[data-open]{transform:rotate(90deg)}@media(pointer:coarse){._chevron_mm9nj_145{position:relative}._chevron_mm9nj_145:after{content:"";position:absolute;inset:-4px}._header_mm9nj_81[data-row=groupHead]{overflow:clip;overflow-clip-margin:2px}}@media(prefers-reduced-motion:reduce){._chevron_mm9nj_145 svg{transition:none}}._header_mm9nj_81[data-refused]{color:var(--u-color-text-muted)}._plot_mm9nj_223{contain:size;position:relative;overflow:hidden;touch-action:none;-webkit-touch-callout:none;user-select:none}._plot_mm9nj_223:focus{outline:none}._focusRing_mm9nj_237{position:absolute;inset:2px;border-radius:var(--u-radius-md);corner-shape:squircle;pointer-events:none}._plot_mm9nj_223:focus-visible>._focusRing_mm9nj_237{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._layer_mm9nj_255{position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none}._plot_mm9nj_223[data-stale]{pointer-events:none}._plot_mm9nj_223[data-stale]>:not(._focusRing_mm9nj_237){opacity:.5;transition:opacity var(--u-transition, .12s cubic-bezier(.22, 1, .36, 1)) var(--u-delay-stale, .2s)}@media(prefers-reduced-motion:reduce){._plot_mm9nj_223[data-stale]>:not(._focusRing_mm9nj_237){transition-duration:0s}}._grip_mm9nj_282{position:absolute;width:9px;margin-left:-4px;border-radius:var(--u-radius-xs);corner-shape:squircle;background:var(--u-color-surface);box-shadow:inset 0 0 0 1.5px var(--u-color-text);cursor:ew-resize}._ghostLabel_mm9nj_292{position:absolute;display:inline-flex;gap:var(--u-space-2);padding:1px var(--u-space-2);border-radius:var(--u-radius-sm);corner-shape:squircle;background:var(--u-color-text);color:var(--u-color-surface);font-size:var(--u-text-xs);white-space:nowrap;pointer-events:none}._finding_mm9nj_305{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_mm9nj_313{font-weight:var(--u-weight-semibold)}._tooltip_mm9nj_317{position:absolute;z-index:1;display:flex;flex-direction:column;gap:1px;max-width:260px;padding:var(--u-space-2) var(--u-space-3);border-radius:var(--u-radius-sm);corner-shape:squircle;background:var(--u-color-surface);outline:1px solid transparent;box-shadow:var(--u-shadow-overlay);color:var(--u-color-text-secondary);font-size:var(--u-text-xs);line-height:var(--u-leading-tight);pointer-events:none;white-space:nowrap}._tooltipHead_mm9nj_336{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_mm9nj_341{color:var(--u-color-text)}._tooltip_mm9nj_317 ._finding_mm9nj_305{color:var(--u-color-danger-text)}._now_mm9nj_350{position:absolute;top:0;width:0;height:0;margin-left:-4px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid var(--u-color-accent)}._barLabel_mm9nj_364{position:absolute;display:flex;align-items:center;padding:0 var(--u-space-1);overflow:hidden;font-size:var(--u-text-xs);line-height:var(--u-leading-tight);pointer-events:none}._barLabelText_mm9nj_377{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_mm9nj_364[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_mm9nj_364[data-on=light]{color:var(--u-color-text)}@media(forced-colors:active){._grip_mm9nj_282{outline:2px solid CanvasText;outline-offset:-2px}._ghostLabel_mm9nj_292{outline:1px solid CanvasText}}}
1
+ @layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{._text_18806_22{font-family:var(--u-font-sans);font-size:var(--u-text-md);line-height:var(--u-leading-normal);color:var(--u-color-text);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}@media(pointer:fine){._dense_18806_38{--u-control-height-sm: var(--u-control-height-xs)}}._ink_18806_49{--u-color-text: var(--u-color-bg);--u-color-text-secondary: color-mix(in srgb, var(--u-color-bg) 75%, transparent);--u-color-text-muted: color-mix(in srgb, var(--u-color-bg) 60%, transparent)}._extent_18806_75{--_chars: 20;--_extra: 0;--_tracking: 0px;--_chrome: 0px;min-inline-size:0;max-inline-size:100%;contain:inline-size;contain-intrinsic-inline-size:calc((var(--_chars) + var(--_extra)) * (1ch + var(--_tracking)) + var(--_chrome))}._field_18806_90{caret-color:var(--u-color-accent)}._scroll_18806_96{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_18806_96::-webkit-scrollbar{width:10px;height:10px}._scroll_18806_96::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--u-color-text) 22%,transparent);border-radius:var(--u-radius-full);border:3px solid transparent;background-clip:content-box}._scroll_18806_96::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_18806_125:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_18806_90._field_18806_90,._fieldRoot_18806_145._fieldRoot_18806_145{font-size:16px}}._field_18806_90:-webkit-autofill,._field_18806_90:-webkit-autofill:hover,._field_18806_90:-webkit-autofill:focus{-webkit-box-shadow:inset 0 0 0 1000px var(--u-color-surface),0 0 0 1px var(--u-edge-color-strong);-webkit-text-fill-color:var(--u-color-text);caret-color:var(--u-color-accent)}}@layer umriss.components{._root_q0w8s_4,._root_q0w8s_4:before,._root_q0w8s_4:after{box-sizing:border-box}._corner_q0w8s_19,._corner_q0w8s_19:before,._corner_q0w8s_19:after{box-sizing:border-box}._zoneLabel_q0w8s_24,._zoneLabel_q0w8s_24:before,._zoneLabel_q0w8s_24:after{box-sizing:border-box}._dayBand_q0w8s_40,._dayBand_q0w8s_40:before,._dayBand_q0w8s_40:after{box-sizing:border-box}._tickBand_q0w8s_41,._tickBand_q0w8s_41:before,._tickBand_q0w8s_41:after{box-sizing:border-box}._day_q0w8s_40,._day_q0w8s_40:before,._day_q0w8s_40:after{box-sizing:border-box}._dayLabel_q0w8s_67,._dayLabel_q0w8s_67:before,._dayLabel_q0w8s_67:after{box-sizing:border-box}._tick_q0w8s_41,._tick_q0w8s_41:before,._tick_q0w8s_41:after{box-sizing:border-box}._tickLabel_q0w8s_88,._tickLabel_q0w8s_88:before,._tickLabel_q0w8s_88:after{box-sizing:border-box}._headers_q0w8s_98,._headers_q0w8s_98:before,._headers_q0w8s_98:after{box-sizing:border-box}._header_q0w8s_98,._header_q0w8s_98:before,._header_q0w8s_98:after{box-sizing:border-box}._headerLabel_q0w8s_117,._headerLabel_q0w8s_117:before,._headerLabel_q0w8s_117:after{box-sizing:border-box}._headerCount_q0w8s_153,._headerCount_q0w8s_153:before,._headerCount_q0w8s_153:after{box-sizing:border-box}._chevron_q0w8s_162,._chevron_q0w8s_162:before,._chevron_q0w8s_162:after{box-sizing:border-box}._plot_q0w8s_240,._plot_q0w8s_240:before,._plot_q0w8s_240:after{box-sizing:border-box}._focusRing_q0w8s_254,._focusRing_q0w8s_254:before,._focusRing_q0w8s_254:after{box-sizing:border-box}._layer_q0w8s_272,._layer_q0w8s_272:before,._layer_q0w8s_272:after{box-sizing:border-box}._grip_q0w8s_299,._grip_q0w8s_299:before,._grip_q0w8s_299:after{box-sizing:border-box}._ghostLabel_q0w8s_309,._ghostLabel_q0w8s_309:before,._ghostLabel_q0w8s_309:after{box-sizing:border-box}._finding_q0w8s_322,._finding_q0w8s_322:before,._finding_q0w8s_322:after{box-sizing:border-box}._refusal_q0w8s_330,._refusal_q0w8s_330:before,._refusal_q0w8s_330:after{box-sizing:border-box}._tooltip_q0w8s_334,._tooltip_q0w8s_334:before,._tooltip_q0w8s_334:after{box-sizing:border-box}._tooltipHead_q0w8s_353,._tooltipHead_q0w8s_353:before,._tooltipHead_q0w8s_353:after{box-sizing:border-box}._tooltipTimes_q0w8s_358,._tooltipTimes_q0w8s_358:before,._tooltipTimes_q0w8s_358:after{box-sizing:border-box}._now_q0w8s_367,._now_q0w8s_367:before,._now_q0w8s_367:after{box-sizing:border-box}._barLabel_q0w8s_381,._barLabel_q0w8s_381:before,._barLabel_q0w8s_381:after{box-sizing:border-box}._barLabelText_q0w8s_394,._barLabelText_q0w8s_394:before,._barLabelText_q0w8s_394:after{box-sizing:border-box}._root_q0w8s_4{display:grid;grid-template-rows:28px minmax(0,1fr) 28px;width:100%;font-size:var(--u-text-sm);background:var(--u-color-surface);outline:1px solid transparent;box-shadow:var(--u-edge);border-radius:var(--u-radius-md);corner-shape:squircle;overflow:hidden;font-variant-numeric:tabular-nums;user-select:none}._corner_q0w8s_19{background:var(--u-color-surface)}._corner_q0w8s_19:has(._zoneLabel_q0w8s_24){display:flex;align-items:center}._zoneLabel_q0w8s_24{display:block;min-width:0;padding:0 var(--u-space-2);overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs);text-overflow:ellipsis;white-space:nowrap}._dayBand_q0w8s_40,._tickBand_q0w8s_41{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_q0w8s_40{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_q0w8s_41{border-top:1px solid var(--u-hairline-strong)}._day_q0w8s_40{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_q0w8s_67{position:absolute;z-index:1;left:var(--u-space-1);padding:0 var(--u-space-1);background:var(--u-color-surface);top:50%;transform:translateY(-50%);white-space:nowrap;color:var(--u-color-text);font-weight:var(--u-weight-medium)}._tick_q0w8s_41{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_q0w8s_88{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_q0w8s_98{contain:size;position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_q0w8s_98{display:flex;align-items:center;gap:var(--u-space-2);padding-right:var(--u-space-3);border-bottom:1px solid var(--u-hairline);overflow:hidden;white-space:nowrap}._headerLabel_q0w8s_117{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_q0w8s_98[data-row=lane],._header_q0w8s_98[data-row=miniature]{container:lane-header / size}@container lane-header (height >= 2.5rem){._headerLabel_q0w8s_117:not(:has(*)){display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;white-space:normal;text-wrap:balance}}._header_q0w8s_98[data-row=groupHead],._header_q0w8s_98[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_q0w8s_153{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_q0w8s_162{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;padding:0;border:none;border-radius:var(--u-radius-xs);corner-shape:squircle;background:transparent;color:var(--u-color-text-secondary);cursor:pointer;transition:background-color var(--u-transition),color var(--u-transition)}._chevron_q0w8s_162:hover{background:var(--u-color-surface-sunken);color:var(--u-color-text)}._chevron_q0w8s_162:active{background:var(--u-color-surface-pressed)}._chevron_q0w8s_162:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._chevron_q0w8s_162 svg{box-sizing:border-box}._chevron_q0w8s_162 svg{transition:transform var(--u-transition-path)}._chevron_q0w8s_162 svg[data-open]{box-sizing:border-box}._chevron_q0w8s_162 svg[data-open]{transform:rotate(90deg)}@media(pointer:coarse){._chevron_q0w8s_162{position:relative}._chevron_q0w8s_162:after{content:"";position:absolute;inset:-4px}._header_q0w8s_98[data-row=groupHead]{overflow:clip;overflow-clip-margin:2px}}@media(prefers-reduced-motion:reduce){._chevron_q0w8s_162 svg{transition:none}}._header_q0w8s_98[data-refused]{color:var(--u-color-text-muted)}._plot_q0w8s_240{contain:size;position:relative;overflow:hidden;touch-action:none;-webkit-touch-callout:none;user-select:none}._plot_q0w8s_240:focus{outline:none}._focusRing_q0w8s_254{position:absolute;inset:2px;border-radius:var(--u-radius-md);corner-shape:squircle;pointer-events:none}._plot_q0w8s_240:focus-visible>._focusRing_q0w8s_254{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._layer_q0w8s_272{position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none}._plot_q0w8s_240[data-stale]{pointer-events:none}._plot_q0w8s_240[data-stale]>:not(._focusRing_q0w8s_254){opacity:.5;transition:opacity var(--u-transition, .12s cubic-bezier(.22, 1, .36, 1)) var(--u-delay-stale, .2s)}@media(prefers-reduced-motion:reduce){._plot_q0w8s_240[data-stale]>:not(._focusRing_q0w8s_254){transition-duration:0s}}._grip_q0w8s_299{position:absolute;width:9px;margin-left:-4px;border-radius:var(--u-radius-xs);corner-shape:squircle;background:var(--u-color-surface);box-shadow:inset 0 0 0 1.5px var(--u-color-text);cursor:ew-resize}._ghostLabel_q0w8s_309{position:absolute;display:inline-flex;gap:var(--u-space-2);padding:1px var(--u-space-2);border-radius:var(--u-radius-sm);corner-shape:squircle;background:var(--u-color-text);color:var(--u-color-surface);font-size:var(--u-text-xs);white-space:nowrap;pointer-events:none}._finding_q0w8s_322{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_q0w8s_330{font-weight:var(--u-weight-semibold)}._tooltip_q0w8s_334{position:absolute;z-index:1;display:flex;flex-direction:column;gap:1px;max-width:260px;padding:var(--u-space-2) var(--u-space-3);border-radius:var(--u-radius-sm);corner-shape:squircle;background:var(--u-color-surface);outline:1px solid transparent;box-shadow:var(--u-shadow-overlay);color:var(--u-color-text-secondary);font-size:var(--u-text-xs);line-height:var(--u-leading-tight);pointer-events:none;white-space:nowrap}._tooltipHead_q0w8s_353{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_q0w8s_358{color:var(--u-color-text)}._tooltip_q0w8s_334 ._finding_q0w8s_322{color:var(--u-color-danger-text)}._now_q0w8s_367{position:absolute;top:0;width:0;height:0;margin-left:-4px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid var(--u-color-accent)}._barLabel_q0w8s_381{position:absolute;display:flex;align-items:center;padding:0 var(--u-space-1);overflow:hidden;font-size:var(--u-text-xs);line-height:var(--u-leading-tight);pointer-events:none}._barLabelText_q0w8s_394{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_q0w8s_381[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_q0w8s_381[data-on=light]{color:var(--u-color-text)}@media(forced-colors:active){._grip_q0w8s_299{outline:2px solid CanvasText;outline-offset:-2px}._ghostLabel_q0w8s_309{outline:1px solid CanvasText}}}