@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 +36 -2
- package/README.md +10 -7
- package/dist/index.d.ts +26 -23
- package/dist/schedule.css +1 -1
- package/dist/schedule.js +1325 -1307
- package/docs/llms-full.md +520 -96
- package/package.json +9 -8
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.
|
|
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
|
|
22
|
-
|
|
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
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
303
|
-
the drop
|
|
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
|
-
|
|
326
|
-
|
|
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
|
|
334
|
-
|
|
335
|
-
|
|
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,
|
|
408
|
-
|
|
409
|
-
|
|
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
|
|
414
|
-
or to hand another schedule
|
|
415
|
-
|
|
416
|
-
|
|
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:
|
|
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{.
|
|
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}}}
|