@umriss-ui/schedule 0.7.1 → 0.35.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
@@ -1,20 +1,54 @@
1
1
  # Changes to `@umriss-ui/schedule`
2
2
 
3
3
  This document describes what changes for **callers** of the package: exports,
4
- props, behaviour. What was worked on in the repository stands in the
5
- repository's journal (`docs/journal.md`) and in the specs under `.scratch/`.
4
+ props, behaviour.
6
5
 
7
6
  **The numbers.** The middle digit rises when something is added; the last one
8
7
  when something is repaired. As long as the first digit is `0`, no number
9
8
  promises compatibility — which is why whatever changes existing behaviour stands
10
9
  under a heading "Changed" of its own, no matter which digit rose.
11
10
 
11
+ From 0.34.0 all five packages share one number: they are released together, and a package without a change of its own still gets a heading for it.
12
+
12
13
  **Release candidates.** The package started as a release candidate under the
13
14
  tag `next`. With `0.1.0` it is released: the tag is gone, and the interface
14
15
  moves from here under the rule above.
15
16
 
16
17
  ---
17
18
 
19
+ ## 0.35.0 – React 19 is the floor, and a hover that leaves the plan alone (Oct. 2026)
20
+
21
+ Needs `@umriss-ui/core` and `@umriss-ui/charts` 0.35; the peer ranges are
22
+ `^0.35.0`.
23
+
24
+ ### Changed
25
+
26
+ - **React 19 is required.** The peers `react` and `react-dom` are `>=19`; `0.34.0` is the last version that serves React 18.
27
+
28
+ - **`ref` is a prop of the schedule.** `ScheduleProps` declares it as `Ref<ScheduleHandle>`, and the component is no `forwardRef` object any more. The handle arrives as it did.
29
+
30
+ - **The package ships ES2022 syntax.** An application that serves older browsers transpiles it itself.
31
+
32
+ ### Otherwise
33
+
34
+ - **A hover redraws what the hover shows.** A pointer moving along a bar published the whole plan again and drew both canvases on every event; it now publishes the tooltip and the cursor and draws the overlay alone. At 5,000 subtasks the frame of a hover ends after 17 ms where it took 24 ms - the figure of a plan of 200.
35
+
36
+ - **A pan or a zoom lays the plan out once per frame**, however many events the frame holds, and a dependency wholly outside the view is not stroked.
37
+
38
+ ---
39
+
40
+ ## 0.34.0 – A view is set, not handed back (Oct. 2026)
41
+
42
+ From this version all five packages carry one number and are released
43
+ together. Needs `@umriss-ui/core` and `@umriss-ui/charts` 0.34; the peer ranges
44
+ are `^0.34.0`.
45
+
46
+ ### Changed
47
+
48
+ - **`initialView` is read once, and `setView` is new.** A different `initialView` on a later render is now ignored, as React ignores a changed `defaultValue`; it used to be applied whenever its content differed from the last one handed in. To go to a view later, call the new `setView(view)` that `useSchedule` returns: it applies a whole view, and what the view leaves out goes back to its default. `setView` is not reported through `onViewChange`, which reports what the planner did, so two schedules kept in step by `onViewChange: (v) => other.setView(v)` in both directions do not answer each other. A caller that kept the reported view in state and handed it back as `initialView` writes `setView` instead: restoring a kept view is `setView(kept)`, and the state that mirrors the schedule's view becomes `view` from the hook.
49
+
50
+ ---
51
+
18
52
  ## 0.7.1 – Core 0.33.0, charts 0.16.0 (Oct. 2026)
19
53
 
20
54
  Needs `@umriss-ui/core` 0.33 and `@umriss-ui/charts` 0.16; the peer ranges move to `^0.33.0` and `^0.16.0`.
package/README.md CHANGED
@@ -18,8 +18,11 @@ pnpm add @umriss-ui/schedule @umriss-ui/core @umriss-ui/charts
18
18
  Both `@umriss-ui/core` and `@umriss-ui/charts` are **peer dependencies**
19
19
  (ADR-0022): the schedule takes its styling regime, provider, formats and
20
20
  wording from core, and its time arithmetic — the affine scale, the time steps,
21
- the working calendar, the canvas colour resolution — from charts. React 18 or
22
- 19 as a peer as well; the unit tests run against 18.3 and 19 in CI.
21
+ the working calendar, the canvas colour resolution — from charts. React 19 or
22
+ newer as a peer as well.
23
+
24
+ The package ships ES2022 syntax; an application that serves older browsers
25
+ transpiles it itself.
23
26
 
24
27
  Every entry begins with `"use client"`, the directive a framework
25
28
  with Server Components reads to treat a module as client code. No test runs
@@ -140,11 +143,11 @@ time and a lane and back.
140
143
  ## The view
141
144
 
142
145
  The schedule holds its own view (ADR-0047): the span in view and the folded
143
- groups. `useSchedule({ initialView, onViewChange })` takes a start and reports
144
- every change, always the whole view; a view handed in that differs from the
145
- last one applies at once, so two schedules keep in step by handing each other
146
- what they report. Without a span the schedule shows the extent of its subtasks.
147
- `view`, `setDomain`, `toggleGroup`, `foldAll` and `unfoldAll` stand on what the
146
+ groups. `useSchedule({ initialView, onViewChange })` takes a start, read once, and
147
+ reports what the planner does, always the whole view; two schedules keep in
148
+ step by sending each other what they report through `setView`, which is not
149
+ reported in turn. Without a span the schedule shows the extent of its subtasks.
150
+ `view`, `setView`, `setDomain`, `toggleGroup`, `foldAll` and `unfoldAll` stand on what the
148
151
  hook hands back.
149
152
 
150
153
  ## Blocked time
package/dist/index.d.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  import { CalendarInput } from '@umriss-ui/charts';
2
2
  import { CSSProperties } from 'react';
3
- import { ForwardRefExoticComponent } from 'react';
4
3
  import { ReactNode } from 'react';
5
- import { RefAttributes } from 'react';
4
+ import { Ref } 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. */
@@ -277,7 +276,7 @@ export declare interface Overlap {
277
276
  export declare function overlaps(subtasks: readonly Subtask[]): Overlap[];
278
277
 
279
278
  /** Put work on the plan that was not on it: the answer to a drag from outside
280
- the schedule (schedule-refinement 07). It carries no subtask id - there is
279
+ the schedule. It carries no subtask id - there is
281
280
  no subtask yet; the caller creates one, with its own identity, from
282
281
  `subtaskFromPlace`. */
283
282
  export declare interface PlaceIntent {
@@ -298,9 +297,9 @@ export declare interface PlaceIntent {
298
297
  readonly leadOut?: number;
299
298
  }
300
299
 
301
- /** What the application says it is dragging in, while it drags it
302
- (schedule-refinement 07): the browser hands over the dragged data only on
303
- the drop, so the ghost before the drop can only come from the caller. */
300
+ /** What the application says it is dragging in, while it drags it: the
301
+ browser hands over the dragged data only on the drop, so the ghost before
302
+ the drop can only come from the caller. */
304
303
  export declare interface PlacingItem {
305
304
  /** The caller's key for the dragged item; it comes back in the intent. */
306
305
  readonly item: string;
@@ -322,17 +321,15 @@ export declare function resolveAppearance(appearance: readonly SubtaskAppearance
322
321
 
323
322
  /** What the drawing needs to know, with the contradiction already settled.
324
323
 
325
- The four names are the ones this module was born with, and they are kept so
326
- that a caller's code does not change because a picture did. Two of them are
327
- now named after a drawing they no longer use, and the channel each one
328
- really owns stands beside it. */
324
+ Two of the field names (`dashed`, `hatched`) are older than the drawing;
325
+ the channel each one owns stands beside it. */
329
326
  export declare interface ResolvedAppearance {
330
327
  /** `provisional`: the FILL - none at all, so the surface shows through, with
331
328
  a dashed outline in the task colour. Planned, not released. */
332
329
  readonly dashed: boolean;
333
- /** `fixed`: the ENDS - a cap at each end of the main time. Not a hatch any
334
- more; a hatch now says "not available" of a refused lane, and the name is
335
- kept only so that this type did not change with the picture. */
330
+ /** `fixed`: the ENDS - a cap at each end of the main time. Not a hatch: a
331
+ hatch says "not available" of a refused lane. The field keeps the name
332
+ `hatched`. */
336
333
  readonly hatched: boolean;
337
334
  /** `muted`: the SATURATION - the task colour mixed half into the surface,
338
335
  opaque and at full height. Another team's, another crew's. */
@@ -404,16 +401,15 @@ export declare interface ScheduleInteraction {
404
401
  /** What `useSchedule` takes: the view to start from and the handler that
405
402
  hears every change of it. */
406
403
  export declare interface ScheduleOptions {
407
- /** The view to start from, and to go to whenever one differing in content
408
- from the last is handed in - the same view again changes nothing, and
409
- what it leaves out is reset; one the schedule reported itself, handed
410
- back late, is its own state coming back and not gone to. The schedule
404
+ /** The view to start from, read once when the hook first runs; a different
405
+ value on a later render is ignored, as React ignores a changed
406
+ `defaultValue`. To go to a view later, call `setView`. The schedule
411
407
  remembers none: where a view is kept is the application's decision. */
412
408
  initialView?: ScheduleView;
413
- /** Every change of the view, once, always the whole view - the one to keep,
414
- or to hand another schedule as its `initialView`. A pan or zoom is
415
- reported at most once per frame. Not called for the view the schedule
416
- starts with. */
409
+ /** Every change the planner makes, once, always the whole view - the one to
410
+ keep, or to hand another schedule's `setView`. A pan or zoom is reported
411
+ at most once per frame. Not called for the view the schedule starts
412
+ with, nor for one `setView` applies. */
417
413
  onViewChange?: (view: ScheduleView) => void;
418
414
  }
419
415
 
@@ -421,7 +417,7 @@ export declare interface ScheduleOptions {
421
417
  it, its view and the setters that change it. */
422
418
  export declare interface ScheduleParts {
423
419
  /** The schedule. One per `useSchedule`: a second schedule is a second call. */
424
- Schedule: ForwardRefExoticComponent<ScheduleProps & RefAttributes<ScheduleHandle>>;
420
+ Schedule: (props: ScheduleProps) => ReactNode;
425
421
  Lane: typeof Lane;
426
422
  LaneGroup: typeof LaneGroup;
427
423
  Subtasks: typeof Subtasks;
@@ -430,6 +426,11 @@ export declare interface ScheduleParts {
430
426
  Milestones: typeof Milestones;
431
427
  /** How the planner is looking at the plan: the span and the folded groups. */
432
428
  view: ScheduleView;
429
+ /** Goes to a whole view; what it leaves out is shown whole again. Not
430
+ reported through `onViewChange`: two schedules kept in step by
431
+ `onViewChange: (v) => other.setView(v)` in both directions do not answer
432
+ each other. A view with the content already shown changes nothing. */
433
+ setView: (view: ScheduleView) => void;
433
434
  /** Puts a span of two wall-clock instants in view; `null` shows the
434
435
  subtasks' extent. */
435
436
  setDomain: (span: readonly [number, number] | null) => void;
@@ -443,6 +444,8 @@ export declare interface ScheduleParts {
443
444
 
444
445
  /** The props of `Schedule`. */
445
446
  export declare interface ScheduleProps {
447
+ /** Receives the `ScheduleHandle` - not an element. */
448
+ ref?: Ref<ScheduleHandle>;
446
449
  /** What the schedule shows, for a screen reader: "Plan of week 38". */
447
450
  ariaLabel: string;
448
451
  /** Height in CSS pixels, both bands included. The width is the host's.
@@ -692,7 +695,7 @@ export declare interface Task {
692
695
 
693
696
  /** Declares a schedule: hands back `Schedule` and the parts declared inside it
694
697
  - `Lane`, `LaneGroup`, `Subtasks`, `Dependencies`, `BlockedTimes`, `Milestones` -, its
695
- `view` and the setters `setDomain`, `toggleGroup`, `foldAll` and
698
+ `view` and the setters `setView`, `setDomain`, `toggleGroup`, `foldAll` and
696
699
  `unfoldAll`. A ref on `Schedule` still gives the `ScheduleHandle`. */
697
700
  export declare function useSchedule(options?: ScheduleOptions): ScheduleParts;
698
701
 
package/dist/schedule.css CHANGED
@@ -1 +1 @@
1
- @layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{._text_1krlf_23{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_1krlf_39{--u-control-height-sm: var(--u-control-height-xs)}}._ink_1krlf_50{--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_1krlf_76{--_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_1krlf_91{caret-color:var(--u-color-accent)}._scroll_1krlf_97{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_1krlf_97::-webkit-scrollbar{width:10px;height:10px}._scroll_1krlf_97::-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_1krlf_97::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_1krlf_126:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_1krlf_91._field_1krlf_91,._fieldRoot_1krlf_146._fieldRoot_1krlf_146{font-size:16px}}._field_1krlf_91:-webkit-autofill,._field_1krlf_91:-webkit-autofill:hover,._field_1krlf_91:-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_1892z_4,._root_1892z_4:before,._root_1892z_4:after{box-sizing:border-box}._corner_1892z_19,._corner_1892z_19:before,._corner_1892z_19:after{box-sizing:border-box}._dayBand_1892z_23,._dayBand_1892z_23:before,._dayBand_1892z_23:after{box-sizing:border-box}._tickBand_1892z_24,._tickBand_1892z_24:before,._tickBand_1892z_24:after{box-sizing:border-box}._day_1892z_23,._day_1892z_23:before,._day_1892z_23:after{box-sizing:border-box}._dayLabel_1892z_50,._dayLabel_1892z_50:before,._dayLabel_1892z_50:after{box-sizing:border-box}._tick_1892z_24,._tick_1892z_24:before,._tick_1892z_24:after{box-sizing:border-box}._tickLabel_1892z_71,._tickLabel_1892z_71:before,._tickLabel_1892z_71:after{box-sizing:border-box}._headers_1892z_79,._headers_1892z_79:before,._headers_1892z_79:after{box-sizing:border-box}._header_1892z_79,._header_1892z_79:before,._header_1892z_79:after{box-sizing:border-box}._headerLabel_1892z_97,._headerLabel_1892z_97:before,._headerLabel_1892z_97:after{box-sizing:border-box}._headerCount_1892z_134,._headerCount_1892z_134:before,._headerCount_1892z_134:after{box-sizing:border-box}._chevron_1892z_143,._chevron_1892z_143:before,._chevron_1892z_143:after{box-sizing:border-box}._plot_1892z_201,._plot_1892z_201:before,._plot_1892z_201:after{box-sizing:border-box}._focusRing_1892z_208,._focusRing_1892z_208:before,._focusRing_1892z_208:after{box-sizing:border-box}._layer_1892z_226,._layer_1892z_226:before,._layer_1892z_226:after{box-sizing:border-box}._grip_1892z_235,._grip_1892z_235:before,._grip_1892z_235:after{box-sizing:border-box}._ghostLabel_1892z_245,._ghostLabel_1892z_245:before,._ghostLabel_1892z_245:after{box-sizing:border-box}._finding_1892z_258,._finding_1892z_258:before,._finding_1892z_258:after{box-sizing:border-box}._refusal_1892z_266,._refusal_1892z_266:before,._refusal_1892z_266:after{box-sizing:border-box}._tooltip_1892z_270,._tooltip_1892z_270:before,._tooltip_1892z_270:after{box-sizing:border-box}._tooltipHead_1892z_289,._tooltipHead_1892z_289:before,._tooltipHead_1892z_289:after{box-sizing:border-box}._tooltipTimes_1892z_294,._tooltipTimes_1892z_294:before,._tooltipTimes_1892z_294:after{box-sizing:border-box}._now_1892z_303,._now_1892z_303:before,._now_1892z_303:after{box-sizing:border-box}._barLabel_1892z_317,._barLabel_1892z_317:before,._barLabel_1892z_317:after{box-sizing:border-box}._barLabelText_1892z_330,._barLabelText_1892z_330:before,._barLabelText_1892z_330:after{box-sizing:border-box}._root_1892z_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;-webkit-user-select:none;user-select:none}._corner_1892z_19{background:var(--u-color-surface)}._dayBand_1892z_23,._tickBand_1892z_24{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_1892z_23{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_1892z_24{border-top:1px solid var(--u-hairline-strong)}._day_1892z_23{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_1892z_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_1892z_24{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_1892z_71{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_1892z_79{position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_1892z_79{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_1892z_97{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_1892z_79[data-row=lane],._header_1892z_79[data-row=miniature]{container:lane-header / size}@container lane-header (height >= 2.5rem){._headerLabel_1892z_97:not(:has(*)){display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;white-space:normal;text-wrap:balance}}._header_1892z_79[data-row=groupHead],._header_1892z_79[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_1892z_134{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_1892z_143{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_1892z_143:hover{background:var(--u-color-surface-sunken);color:var(--u-color-text)}._chevron_1892z_143:active{background:var(--u-color-surface-pressed)}._chevron_1892z_143:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._chevron_1892z_143 svg{box-sizing:border-box}._chevron_1892z_143 svg{transition:transform var(--u-transition-path)}._chevron_1892z_143 svg[data-open]{box-sizing:border-box}._chevron_1892z_143 svg[data-open]{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){._chevron_1892z_143 svg{transition:none}}._header_1892z_79[data-refused]{color:var(--u-color-text-muted)}._plot_1892z_201{position:relative;overflow:hidden;touch-action:none}._plot_1892z_201:focus{outline:none}._focusRing_1892z_208{position:absolute;top:2px;right:2px;bottom:2px;left:2px;border-radius:var(--u-radius-md);corner-shape:squircle;pointer-events:none}._plot_1892z_201:focus-visible>._focusRing_1892z_208{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._layer_1892z_226{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block;pointer-events:none}._grip_1892z_235{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_1892z_245{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_1892z_258{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_1892z_266{font-weight:var(--u-weight-semibold)}._tooltip_1892z_270{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_1892z_289{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_1892z_294{color:var(--u-color-text)}._tooltip_1892z_270 ._finding_1892z_258{color:var(--u-color-danger-text)}._now_1892z_303{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_1892z_317{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_1892z_330{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_1892z_317[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_1892z_317[data-on=light]{color:var(--u-color-text)}@media(forced-colors:active){._grip_1892z_235{outline:2px solid CanvasText;outline-offset:-2px}._ghostLabel_1892z_245{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_1g7hg_4,._root_1g7hg_4:before,._root_1g7hg_4:after{box-sizing:border-box}._corner_1g7hg_19,._corner_1g7hg_19:before,._corner_1g7hg_19:after{box-sizing:border-box}._dayBand_1g7hg_23,._dayBand_1g7hg_23:before,._dayBand_1g7hg_23:after{box-sizing:border-box}._tickBand_1g7hg_24,._tickBand_1g7hg_24:before,._tickBand_1g7hg_24:after{box-sizing:border-box}._day_1g7hg_23,._day_1g7hg_23:before,._day_1g7hg_23:after{box-sizing:border-box}._dayLabel_1g7hg_50,._dayLabel_1g7hg_50:before,._dayLabel_1g7hg_50:after{box-sizing:border-box}._tick_1g7hg_24,._tick_1g7hg_24:before,._tick_1g7hg_24:after{box-sizing:border-box}._tickLabel_1g7hg_71,._tickLabel_1g7hg_71:before,._tickLabel_1g7hg_71:after{box-sizing:border-box}._headers_1g7hg_79,._headers_1g7hg_79:before,._headers_1g7hg_79:after{box-sizing:border-box}._header_1g7hg_79,._header_1g7hg_79:before,._header_1g7hg_79:after{box-sizing:border-box}._headerLabel_1g7hg_97,._headerLabel_1g7hg_97:before,._headerLabel_1g7hg_97:after{box-sizing:border-box}._headerCount_1g7hg_133,._headerCount_1g7hg_133:before,._headerCount_1g7hg_133:after{box-sizing:border-box}._chevron_1g7hg_142,._chevron_1g7hg_142:before,._chevron_1g7hg_142:after{box-sizing:border-box}._plot_1g7hg_197,._plot_1g7hg_197:before,._plot_1g7hg_197:after{box-sizing:border-box}._focusRing_1g7hg_204,._focusRing_1g7hg_204:before,._focusRing_1g7hg_204:after{box-sizing:border-box}._layer_1g7hg_222,._layer_1g7hg_222:before,._layer_1g7hg_222:after{box-sizing:border-box}._grip_1g7hg_231,._grip_1g7hg_231:before,._grip_1g7hg_231:after{box-sizing:border-box}._ghostLabel_1g7hg_241,._ghostLabel_1g7hg_241:before,._ghostLabel_1g7hg_241:after{box-sizing:border-box}._finding_1g7hg_254,._finding_1g7hg_254:before,._finding_1g7hg_254:after{box-sizing:border-box}._refusal_1g7hg_262,._refusal_1g7hg_262:before,._refusal_1g7hg_262:after{box-sizing:border-box}._tooltip_1g7hg_266,._tooltip_1g7hg_266:before,._tooltip_1g7hg_266:after{box-sizing:border-box}._tooltipHead_1g7hg_285,._tooltipHead_1g7hg_285:before,._tooltipHead_1g7hg_285:after{box-sizing:border-box}._tooltipTimes_1g7hg_290,._tooltipTimes_1g7hg_290:before,._tooltipTimes_1g7hg_290:after{box-sizing:border-box}._now_1g7hg_299,._now_1g7hg_299:before,._now_1g7hg_299:after{box-sizing:border-box}._barLabel_1g7hg_313,._barLabel_1g7hg_313:before,._barLabel_1g7hg_313:after{box-sizing:border-box}._barLabelText_1g7hg_326,._barLabelText_1g7hg_326:before,._barLabelText_1g7hg_326:after{box-sizing:border-box}._root_1g7hg_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_1g7hg_19{background:var(--u-color-surface)}._dayBand_1g7hg_23,._tickBand_1g7hg_24{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_1g7hg_23{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_1g7hg_24{border-top:1px solid var(--u-hairline-strong)}._day_1g7hg_23{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_1g7hg_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_1g7hg_24{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_1g7hg_71{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_1g7hg_79{position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_1g7hg_79{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_1g7hg_97{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_1g7hg_79[data-row=lane],._header_1g7hg_79[data-row=miniature]{container:lane-header / size}@container lane-header (height >= 2.5rem){._headerLabel_1g7hg_97:not(:has(*)){display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;white-space:normal;text-wrap:balance}}._header_1g7hg_79[data-row=groupHead],._header_1g7hg_79[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_1g7hg_133{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_1g7hg_142{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_1g7hg_142:hover{background:var(--u-color-surface-sunken);color:var(--u-color-text)}._chevron_1g7hg_142:active{background:var(--u-color-surface-pressed)}._chevron_1g7hg_142:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._chevron_1g7hg_142 svg{box-sizing:border-box}._chevron_1g7hg_142 svg{transition:transform var(--u-transition-path)}._chevron_1g7hg_142 svg[data-open]{box-sizing:border-box}._chevron_1g7hg_142 svg[data-open]{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){._chevron_1g7hg_142 svg{transition:none}}._header_1g7hg_79[data-refused]{color:var(--u-color-text-muted)}._plot_1g7hg_197{position:relative;overflow:hidden;touch-action:none}._plot_1g7hg_197:focus{outline:none}._focusRing_1g7hg_204{position:absolute;inset:2px;border-radius:var(--u-radius-md);corner-shape:squircle;pointer-events:none}._plot_1g7hg_197:focus-visible>._focusRing_1g7hg_204{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._layer_1g7hg_222{position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none}._grip_1g7hg_231{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_1g7hg_241{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_1g7hg_254{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_1g7hg_262{font-weight:var(--u-weight-semibold)}._tooltip_1g7hg_266{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_1g7hg_285{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_1g7hg_290{color:var(--u-color-text)}._tooltip_1g7hg_266 ._finding_1g7hg_254{color:var(--u-color-danger-text)}._now_1g7hg_299{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_1g7hg_313{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_1g7hg_326{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_1g7hg_313[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_1g7hg_313[data-on=light]{color:var(--u-color-text)}@media(forced-colors:active){._grip_1g7hg_231{outline:2px solid CanvasText;outline-offset:-2px}._ghostLabel_1g7hg_241{outline:1px solid CanvasText}}}