@umriss-ui/schedule 0.3.4 → 0.3.6

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
@@ -15,6 +15,24 @@ moves from here under the rule above.
15
15
 
16
16
  ---
17
17
 
18
+ ## 0.3.6 – Core 0.15.0 (Sep. 2026)
19
+
20
+ Needs `@umriss-ui/core` 0.15; the peer range moves to `^0.15.0`. Nothing else changes for a caller.
21
+
22
+ ---
23
+
24
+ ## 0.3.5 – Found by search (Sep. 2026)
25
+
26
+ ### Fixed
27
+
28
+ - **The package's description and keywords say what it is in the words a
29
+ search uses**, and the demo it links to addresses every page by a path
30
+ (`…/schedule/<page>/`) instead of a hash, with the page's text readable before
31
+ the demo starts. Old `#/<page>` links still land. Nothing in the package's
32
+ code changed.
33
+
34
+ ---
35
+
18
36
  ## 0.3.4 – Core 0.14.0 (Sep. 2026)
19
37
 
20
38
  Needs `@umriss-ui/core` 0.14; the peer range moves to `^0.14.0`. Nothing else changes for a caller.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @umriss-ui/schedule
2
2
 
3
- Work planned over time: **subtasks** on **lanes** — people, vehicles, rooms or
3
+ A React Gantt-style schedule for data-dense applications — work planned over time: **subtasks** on **lanes** — people, vehicles, rooms or
4
4
  machines. One task runs across several lanes in a fixed order, each stop has a
5
5
  main time with a lead-in before it and a lead-out after it, between the stops
6
6
  lie **dependencies** with lags of their own, and a lane can be **blocked** for
package/dist/schedule.css CHANGED
@@ -1 +1 @@
1
- @layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{._text_k1tvc_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}._field_k1tvc_34{caret-color:var(--u-color-accent)}._scroll_k1tvc_40{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_k1tvc_40::-webkit-scrollbar{width:10px;height:10px}._scroll_k1tvc_40::-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_k1tvc_40::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_k1tvc_69:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_k1tvc_34._field_k1tvc_34{font-size:16px}}._field_k1tvc_34:-webkit-autofill,._field_k1tvc_34:-webkit-autofill:hover,._field_k1tvc_34:-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.tokens,umriss.base,umriss.components;@layer umriss.components{._root_19uyg_4,._root_19uyg_4:before,._root_19uyg_4:after{box-sizing:border-box}._corner_19uyg_19,._corner_19uyg_19:before,._corner_19uyg_19:after{box-sizing:border-box}._dayBand_19uyg_23,._dayBand_19uyg_23:before,._dayBand_19uyg_23:after{box-sizing:border-box}._tickBand_19uyg_24,._tickBand_19uyg_24:before,._tickBand_19uyg_24:after{box-sizing:border-box}._day_19uyg_23,._day_19uyg_23:before,._day_19uyg_23:after{box-sizing:border-box}._dayLabel_19uyg_47,._dayLabel_19uyg_47:before,._dayLabel_19uyg_47:after{box-sizing:border-box}._tick_19uyg_24,._tick_19uyg_24:before,._tick_19uyg_24:after{box-sizing:border-box}._tickLabel_19uyg_65,._tickLabel_19uyg_65:before,._tickLabel_19uyg_65:after{box-sizing:border-box}._headers_19uyg_73,._headers_19uyg_73:before,._headers_19uyg_73:after{box-sizing:border-box}._header_19uyg_73,._header_19uyg_73:before,._header_19uyg_73:after{box-sizing:border-box}._headerLabel_19uyg_91,._headerLabel_19uyg_91:before,._headerLabel_19uyg_91:after{box-sizing:border-box}._headerCount_19uyg_104,._headerCount_19uyg_104:before,._headerCount_19uyg_104:after{box-sizing:border-box}._chevron_19uyg_113,._chevron_19uyg_113:before,._chevron_19uyg_113:after{box-sizing:border-box}._plot_19uyg_171,._plot_19uyg_171:before,._plot_19uyg_171:after{box-sizing:border-box}._focusRing_19uyg_178,._focusRing_19uyg_178:before,._focusRing_19uyg_178:after{box-sizing:border-box}._layer_19uyg_196,._layer_19uyg_196:before,._layer_19uyg_196:after{box-sizing:border-box}._grip_19uyg_205,._grip_19uyg_205:before,._grip_19uyg_205:after{box-sizing:border-box}._ghostLabel_19uyg_215,._ghostLabel_19uyg_215:before,._ghostLabel_19uyg_215:after{box-sizing:border-box}._finding_19uyg_228,._finding_19uyg_228:before,._finding_19uyg_228:after{box-sizing:border-box}._refusal_19uyg_236,._refusal_19uyg_236:before,._refusal_19uyg_236:after{box-sizing:border-box}._tooltip_19uyg_240,._tooltip_19uyg_240:before,._tooltip_19uyg_240:after{box-sizing:border-box}._tooltipHead_19uyg_259,._tooltipHead_19uyg_259:before,._tooltipHead_19uyg_259:after{box-sizing:border-box}._tooltipTimes_19uyg_264,._tooltipTimes_19uyg_264:before,._tooltipTimes_19uyg_264:after{box-sizing:border-box}._now_19uyg_273,._now_19uyg_273:before,._now_19uyg_273:after{box-sizing:border-box}._barLabel_19uyg_287,._barLabel_19uyg_287:before,._barLabel_19uyg_287:after{box-sizing:border-box}._barLabelText_19uyg_300,._barLabelText_19uyg_300:before,._barLabelText_19uyg_300:after{box-sizing:border-box}._root_19uyg_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_19uyg_19{background:var(--u-color-surface)}._dayBand_19uyg_23,._tickBand_19uyg_24{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_19uyg_23{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_19uyg_24{border-top:1px solid var(--u-hairline-strong)}._day_19uyg_23{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_19uyg_47{position:absolute;left:var(--u-space-2);top:50%;transform:translateY(-50%);white-space:nowrap;color:var(--u-color-text);font-weight:var(--u-weight-medium)}._tick_19uyg_24{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_19uyg_65{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_19uyg_73{position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_19uyg_73{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_19uyg_91{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_19uyg_73[data-row=groupHead],._header_19uyg_73[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_19uyg_104{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_19uyg_113{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_19uyg_113:hover{background:var(--u-color-surface-sunken);color:var(--u-color-text)}._chevron_19uyg_113:active{background:var(--u-color-surface-pressed)}._chevron_19uyg_113:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._chevron_19uyg_113 svg{box-sizing:border-box}._chevron_19uyg_113 svg{transition:transform var(--u-transition-path)}._chevron_19uyg_113 svg[data-open]{box-sizing:border-box}._chevron_19uyg_113 svg[data-open]{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){._chevron_19uyg_113 svg{transition:none}}._header_19uyg_73[data-refused]{color:var(--u-color-text-muted)}._plot_19uyg_171{position:relative;overflow:hidden;touch-action:none}._plot_19uyg_171:focus{outline:none}._focusRing_19uyg_178{position:absolute;top:2px;right:2px;bottom:2px;left:2px;border-radius:var(--u-radius-md);corner-shape:squircle;pointer-events:none}._plot_19uyg_171:focus-visible>._focusRing_19uyg_178{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._layer_19uyg_196{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block;pointer-events:none}._grip_19uyg_205{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_19uyg_215{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_19uyg_228{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_19uyg_236{font-weight:var(--u-weight-semibold)}._tooltip_19uyg_240{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_19uyg_259{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_19uyg_264{color:var(--u-color-text)}._tooltip_19uyg_240 ._finding_19uyg_228{color:var(--u-color-danger-text)}._now_19uyg_273{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_19uyg_287{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_19uyg_300{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_19uyg_287[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_19uyg_287[data-on=light]{color:var(--u-color-text)}@media(forced-colors:active){._grip_19uyg_205{outline:2px solid CanvasText;outline-offset:-2px}._ghostLabel_19uyg_215{outline:1px solid CanvasText}}}
1
+ @layer umriss.tokens,umriss.base,umriss.components;@layer umriss.base{._text_ocaqi_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_ocaqi_39{--u-control-height-sm: var(--u-control-height-xs)}}._field_ocaqi_46{caret-color:var(--u-color-accent)}._scroll_ocaqi_52{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--u-color-text) 25%,transparent) transparent}._scroll_ocaqi_52::-webkit-scrollbar{width:10px;height:10px}._scroll_ocaqi_52::-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_ocaqi_52::-webkit-scrollbar-track{background:transparent}}@layer umriss.components{._ring_ocaqi_81:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}@media(pointer:coarse){._field_ocaqi_46._field_ocaqi_46{font-size:16px}}._field_ocaqi_46:-webkit-autofill,._field_ocaqi_46:-webkit-autofill:hover,._field_ocaqi_46:-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.tokens,umriss.base,umriss.components;@layer umriss.components{._root_19uyg_4,._root_19uyg_4:before,._root_19uyg_4:after{box-sizing:border-box}._corner_19uyg_19,._corner_19uyg_19:before,._corner_19uyg_19:after{box-sizing:border-box}._dayBand_19uyg_23,._dayBand_19uyg_23:before,._dayBand_19uyg_23:after{box-sizing:border-box}._tickBand_19uyg_24,._tickBand_19uyg_24:before,._tickBand_19uyg_24:after{box-sizing:border-box}._day_19uyg_23,._day_19uyg_23:before,._day_19uyg_23:after{box-sizing:border-box}._dayLabel_19uyg_47,._dayLabel_19uyg_47:before,._dayLabel_19uyg_47:after{box-sizing:border-box}._tick_19uyg_24,._tick_19uyg_24:before,._tick_19uyg_24:after{box-sizing:border-box}._tickLabel_19uyg_65,._tickLabel_19uyg_65:before,._tickLabel_19uyg_65:after{box-sizing:border-box}._headers_19uyg_73,._headers_19uyg_73:before,._headers_19uyg_73:after{box-sizing:border-box}._header_19uyg_73,._header_19uyg_73:before,._header_19uyg_73:after{box-sizing:border-box}._headerLabel_19uyg_91,._headerLabel_19uyg_91:before,._headerLabel_19uyg_91:after{box-sizing:border-box}._headerCount_19uyg_104,._headerCount_19uyg_104:before,._headerCount_19uyg_104:after{box-sizing:border-box}._chevron_19uyg_113,._chevron_19uyg_113:before,._chevron_19uyg_113:after{box-sizing:border-box}._plot_19uyg_171,._plot_19uyg_171:before,._plot_19uyg_171:after{box-sizing:border-box}._focusRing_19uyg_178,._focusRing_19uyg_178:before,._focusRing_19uyg_178:after{box-sizing:border-box}._layer_19uyg_196,._layer_19uyg_196:before,._layer_19uyg_196:after{box-sizing:border-box}._grip_19uyg_205,._grip_19uyg_205:before,._grip_19uyg_205:after{box-sizing:border-box}._ghostLabel_19uyg_215,._ghostLabel_19uyg_215:before,._ghostLabel_19uyg_215:after{box-sizing:border-box}._finding_19uyg_228,._finding_19uyg_228:before,._finding_19uyg_228:after{box-sizing:border-box}._refusal_19uyg_236,._refusal_19uyg_236:before,._refusal_19uyg_236:after{box-sizing:border-box}._tooltip_19uyg_240,._tooltip_19uyg_240:before,._tooltip_19uyg_240:after{box-sizing:border-box}._tooltipHead_19uyg_259,._tooltipHead_19uyg_259:before,._tooltipHead_19uyg_259:after{box-sizing:border-box}._tooltipTimes_19uyg_264,._tooltipTimes_19uyg_264:before,._tooltipTimes_19uyg_264:after{box-sizing:border-box}._now_19uyg_273,._now_19uyg_273:before,._now_19uyg_273:after{box-sizing:border-box}._barLabel_19uyg_287,._barLabel_19uyg_287:before,._barLabel_19uyg_287:after{box-sizing:border-box}._barLabelText_19uyg_300,._barLabelText_19uyg_300:before,._barLabelText_19uyg_300:after{box-sizing:border-box}._root_19uyg_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_19uyg_19{background:var(--u-color-surface)}._dayBand_19uyg_23,._tickBand_19uyg_24{position:relative;overflow:hidden;color:var(--u-color-text-muted);font-size:var(--u-text-xs)}._dayBand_19uyg_23{border-bottom:1px solid var(--u-hairline-strong)}._tickBand_19uyg_24{border-top:1px solid var(--u-hairline-strong)}._day_19uyg_23{position:absolute;top:0;bottom:0;border-left:1px solid var(--u-hairline-strong);overflow:hidden}._dayLabel_19uyg_47{position:absolute;left:var(--u-space-2);top:50%;transform:translateY(-50%);white-space:nowrap;color:var(--u-color-text);font-weight:var(--u-weight-medium)}._tick_19uyg_24{position:absolute;top:0;bottom:0;width:1px;background:var(--u-hairline)}._tickLabel_19uyg_65{position:absolute;top:50%;left:0;transform:translate(-50%,-50%);white-space:nowrap}._headers_19uyg_73{position:relative;overflow:hidden;border-right:1px solid var(--u-hairline-strong)}._header_19uyg_73{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_19uyg_91{min-width:0;overflow:hidden;text-overflow:ellipsis}._header_19uyg_73[data-row=groupHead],._header_19uyg_73[data-row=miniature]{font-weight:var(--u-weight-medium)}._headerCount_19uyg_104{flex:none;color:var(--u-color-text-muted);font-size:var(--u-text-xs);font-variant-numeric:tabular-nums}._chevron_19uyg_113{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_19uyg_113:hover{background:var(--u-color-surface-sunken);color:var(--u-color-text)}._chevron_19uyg_113:active{background:var(--u-color-surface-pressed)}._chevron_19uyg_113:focus-visible{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._chevron_19uyg_113 svg{box-sizing:border-box}._chevron_19uyg_113 svg{transition:transform var(--u-transition-path)}._chevron_19uyg_113 svg[data-open]{box-sizing:border-box}._chevron_19uyg_113 svg[data-open]{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){._chevron_19uyg_113 svg{transition:none}}._header_19uyg_73[data-refused]{color:var(--u-color-text-muted)}._plot_19uyg_171{position:relative;overflow:hidden;touch-action:none}._plot_19uyg_171:focus{outline:none}._focusRing_19uyg_178{position:absolute;top:2px;right:2px;bottom:2px;left:2px;border-radius:var(--u-radius-md);corner-shape:squircle;pointer-events:none}._plot_19uyg_171:focus-visible>._focusRing_19uyg_178{outline:2px solid transparent;box-shadow:var(--u-focus-ring)}._layer_19uyg_196{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block;pointer-events:none}._grip_19uyg_205{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_19uyg_215{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_19uyg_228{font-weight:var(--u-weight-semibold);color:var(--u-color-danger-subtle)}._refusal_19uyg_236{font-weight:var(--u-weight-semibold)}._tooltip_19uyg_240{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_19uyg_259{color:var(--u-color-text);font-weight:var(--u-weight-semibold)}._tooltipTimes_19uyg_264{color:var(--u-color-text)}._tooltip_19uyg_240 ._finding_19uyg_228{color:var(--u-color-danger-text)}._now_19uyg_273{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_19uyg_287{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_19uyg_300{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}._barLabel_19uyg_287[data-on=dark]{color:var(--u-color-on-accent)}._barLabel_19uyg_287[data-on=light]{color:var(--u-color-text)}@media(forced-colors:active){._grip_19uyg_205{outline:2px solid CanvasText;outline-offset:-2px}._ghostLabel_19uyg_215{outline:1px solid CanvasText}}}
package/dist/schedule.js CHANGED
@@ -4,7 +4,7 @@ var rs = (o, t, e) => t in o ? is(o, t, { enumerable: !0, configurable: !0, writ
4
4
  var f = (o, t, e) => rs(o, typeof t != "symbol" ? t + "" : t, e);
5
5
  import { jsxs as Y, Fragment as At, jsx as k } from "react/jsx-runtime";
6
6
  import { useContext as _e, createContext as De, useRef as x, useEffect as H, forwardRef as as, useState as ut, useId as ls, useLayoutEffect as Ct, useImperativeHandle as ds, useSyncExternalStore as hs, useMemo as X } from "react";
7
- import { toWorkingTimeClamped as K, resolveColours as us, removedIntervals as cs, localOffset as Fe, MINUTE as W, calendarFrom as q, toWallClock as z, DAY as rt, timeStep as fs, workingTimeTicks as ps, HOUR as Rt, LinearScale as ms, subscribeTheme as gs } from "@umriss-ui/charts";
7
+ import { toWorkingTimeClamped as K, resolveColours as us, removedIntervals as cs, localOffset as Fe, MINUTE as W, calendarFrom as j, toWallClock as z, DAY as rt, timeStep as fs, workingTimeTicks as ps, HOUR as Rt, LinearScale as ms, subscribeTheme as gs } from "@umriss-ui/charts";
8
8
  import { useFormats as Bt, useWording as pt, AngleGlyph as ks, VisuallyHidden as le } from "@umriss-ui/core";
9
9
  const Oe = De(null), Ee = De(null);
10
10
  function Re() {
@@ -489,7 +489,7 @@ function ke(o, t, e) {
489
489
  function $s(o, t) {
490
490
  const { data: e, view: n } = t, s = n.viewport();
491
491
  Ys(o, t, s);
492
- for (const i of e.blocked) qs(o, t, s, i);
492
+ for (const i of e.blocked) js(o, t, s, i);
493
493
  Ks(o, t);
494
494
  for (const i of e.layers) {
495
495
  if (i.kind === "blocked") continue;
@@ -501,7 +501,7 @@ function $s(o, t) {
501
501
  }
502
502
  for (const i of e.overlaps) Et(o, t, s, i);
503
503
  for (const i of e.inBlocked) Et(o, t, s, i);
504
- js(o, t, s), Qs(o, t);
504
+ qs(o, t, s), Qs(o, t);
505
505
  }
506
506
  function Gs(o, t) {
507
507
  const { view: e, hover: n } = t, s = e.viewport();
@@ -674,7 +674,7 @@ function Ft(o, t, e, n, s) {
674
674
  ])
675
675
  o.beginPath(), o.arc(u, p, l ? 3 : 2.5, 0, Math.PI * 2), o.fill();
676
676
  }
677
- function js(o, t, e) {
677
+ function qs(o, t, e) {
678
678
  const { data: n } = t;
679
679
  if (n.violatedById.size !== 0)
680
680
  for (const s of n.violatedById.values()) {
@@ -695,7 +695,7 @@ function Ot(o, t, e, n, s, i) {
695
695
  }
696
696
  o.strokeStyle = t.colours.alarm, o.lineWidth = i, o.setLineDash([4, 3]), o.beginPath(), o.moveTo(e, s + i / 2), o.lineTo(n, s + i / 2), o.stroke(), o.setLineDash([]);
697
697
  }
698
- function qs(o, t, e, n) {
698
+ function js(o, t, e, n) {
699
699
  const s = lt(e, n.lane);
700
700
  if (s === null || s.top + s.height < 0 || s.top > t.view.height) return;
701
701
  const i = Math.max(0, E(e, n.from)), r = Math.min(t.view.width, E(e, n.to));
@@ -1229,14 +1229,14 @@ class rn {
1229
1229
  a start this way, and a key by one step of the raster - one arithmetic,
1230
1230
  so a key proposes exactly what a drag of that length would. */
1231
1231
  shifted(t, e, n) {
1232
- const s = q(this.host.view.options.calendar), i = K(t, s) + e, r = s.intervals.length === 0 ? i : z(Math.max(0, Math.min(s.total, i)), s);
1232
+ const s = j(this.host.view.options.calendar), i = K(t, s) + e, r = s.intervals.length === 0 ? i : z(Math.max(0, Math.min(s.total, i)), s);
1233
1233
  return this.snapInside(r, n);
1234
1234
  }
1235
1235
  /** Snapped - and, where the raster lands in time the calendar removes, moved
1236
1236
  on to the seam, where time counts again. An intent never asks for a time
1237
1237
  nobody works. */
1238
1238
  snapInside(t, e) {
1239
- const n = sn(t, e), s = q(this.host.view.options.calendar);
1239
+ const n = sn(t, e), s = j(this.host.view.options.calendar);
1240
1240
  return s.intervals.length === 0 ? n : z(K(n, s), s);
1241
1241
  }
1242
1242
  intentsOf(t, e, n) {
@@ -1521,7 +1521,7 @@ function yn(o, t) {
1521
1521
  return [o[0] + t, o[1] + t];
1522
1522
  }
1523
1523
  function ze(o, t) {
1524
- const e = q(t);
1524
+ const e = j(t);
1525
1525
  if (e.intervals.length === 0) return [o[0], o[1]];
1526
1526
  const n = (s) => Math.max(0, Math.min(e.total, s));
1527
1527
  return [z(n(o[0]), e), z(n(o[1]), e)];
@@ -1565,7 +1565,7 @@ class vn {
1565
1565
  if (this.options = t, e !== null)
1566
1566
  this.domain = [K(e[0], t.calendar), K(e[1], t.calendar)];
1567
1567
  else if (n) {
1568
- const i = q(s), r = (a) => {
1568
+ const i = j(s), r = (a) => {
1569
1569
  const l = i.intervals.length === 0 ? a : Math.max(0, Math.min(i.total, a));
1570
1570
  return K(z(l, i), t.calendar) + (a - l);
1571
1571
  };
@@ -1652,7 +1652,7 @@ class vn {
1652
1652
  }
1653
1653
  /** The wall-clock time at a plot x; within the calendar's extent. */
1654
1654
  timeAt(t) {
1655
- const e = this.viewport().scale.fromPx(t), n = q(this.options.calendar);
1655
+ const e = this.viewport().scale.fromPx(t), n = j(this.options.calendar);
1656
1656
  return n.intervals.length === 0 ? e : z(Math.max(0, Math.min(n.total, e)), n);
1657
1657
  }
1658
1658
  /** The lane at a y, strips included: what the pointer is ON.
@@ -1952,7 +1952,7 @@ class wn {
1952
1952
  }
1953
1953
  /** The visible span, as two wall-clock instants. */
1954
1954
  visibleDomain() {
1955
- const t = q(this.view.options.calendar), e = (n) => t.intervals.length === 0 ? n : z(Math.max(0, Math.min(t.total, n)), t);
1955
+ const t = j(this.view.options.calendar), e = (n) => t.intervals.length === 0 ? n : z(Math.max(0, Math.min(t.total, n)), t);
1956
1956
  return [e(this.view.domain[0]), e(this.view.domain[1])];
1957
1957
  }
1958
1958
  /** Reported once per frame, however many wheel steps a planner turns - and
@@ -2010,7 +2010,7 @@ class wn {
2010
2010
  $s(n, i), Gs(s, i);
2011
2011
  }
2012
2012
  }
2013
- const bn = "_root_19uyg_4 _text_k1tvc_23", Mn = "_corner_19uyg_19", Tn = "_dayBand_19uyg_23", In = "_tickBand_19uyg_24", Cn = "_day_19uyg_23", Sn = "_dayLabel_19uyg_47", Ln = "_tick_19uyg_24", An = "_tickLabel_19uyg_65", _n = "_headers_19uyg_73", Dn = "_header_19uyg_73", Fn = "_headerLabel_19uyg_91", On = "_headerCount_19uyg_104", En = "_chevron_19uyg_113", Rn = "_plot_19uyg_171", Bn = "_focusRing_19uyg_178", Pn = "_layer_19uyg_196", Nn = "_grip_19uyg_205", $n = "_ghostLabel_19uyg_215", Gn = "_finding_19uyg_228", xn = "_refusal_19uyg_236", Hn = "_tooltip_19uyg_240", Yn = "_tooltipHead_19uyg_259", Kn = "_tooltipTimes_19uyg_264", Un = "_now_19uyg_273", Xn = "_barLabel_19uyg_287", Wn = "_barLabelText_19uyg_300", w = {
2013
+ const bn = "_root_19uyg_4 _text_ocaqi_23", Mn = "_corner_19uyg_19", Tn = "_dayBand_19uyg_23", In = "_tickBand_19uyg_24", Cn = "_day_19uyg_23", Sn = "_dayLabel_19uyg_47", Ln = "_tick_19uyg_24", An = "_tickLabel_19uyg_65", _n = "_headers_19uyg_73", Dn = "_header_19uyg_73", Fn = "_headerLabel_19uyg_91", On = "_headerCount_19uyg_104", En = "_chevron_19uyg_113", Rn = "_plot_19uyg_171", Bn = "_focusRing_19uyg_178", Pn = "_layer_19uyg_196", Nn = "_grip_19uyg_205", $n = "_ghostLabel_19uyg_215", Gn = "_finding_19uyg_228", xn = "_refusal_19uyg_236", Hn = "_tooltip_19uyg_240", Yn = "_tooltipHead_19uyg_259", Kn = "_tooltipTimes_19uyg_264", Un = "_now_19uyg_273", Xn = "_barLabel_19uyg_287", Wn = "_barLabelText_19uyg_300", w = {
2014
2014
  root: bn,
2015
2015
  corner: Mn,
2016
2016
  dayBand: Tn,
@@ -2092,7 +2092,7 @@ function Vn({ target: o }) {
2092
2092
  h !== void 0 && /* @__PURE__ */ k("span", { className: w.finding, children: e.scheduleViolatedBy(s(h.shortBy)) })
2093
2093
  ] });
2094
2094
  }
2095
- const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(function(t, e) {
2095
+ const qn = [], Le = { min: Rt, max: 28 * rt }, jn = [], Ae = 20, io = as(function(t, e) {
2096
2096
  var re;
2097
2097
  const {
2098
2098
  ariaLabel: n,
@@ -2100,10 +2100,10 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
2100
2100
  height: i = 400,
2101
2101
  laneHeight: r = ft,
2102
2102
  headerWidth: a = 160,
2103
- calendar: l = qn,
2103
+ calendar: l = jn,
2104
2104
  zoomLimits: h,
2105
2105
  snap: d = "ticks",
2106
- intents: u = jn,
2106
+ intents: u = qn,
2107
2107
  onIntent: p,
2108
2108
  canMoveTo: m,
2109
2109
  onInteraction: y,
@@ -2121,9 +2121,9 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
2121
2121
  tooltip: V,
2122
2122
  now: tt,
2123
2123
  className: Ut,
2124
- style: je,
2125
- children: qe
2126
- } = t, [v] = ut(() => new wn()), gt = ls(), Xt = `${gt}-summary`, Wt = x(null), zt = x(null), Vt = x(null), jt = x(null), $ = Bt(), R = pt(), [kt, yt] = s, qt = (h == null ? void 0 : h.min) ?? Le.min, Zt = (h == null ? void 0 : h.max) ?? Le.max, Jt = x(null), Qt = typeof d == "object" ? d.step : null, te = typeof d == "object" ? d.offset : null, ee = typeof d == "object" ? null : d, [Ze, Je] = ut(() => Date.now());
2124
+ style: qe,
2125
+ children: je
2126
+ } = t, [v] = ut(() => new wn()), gt = ls(), Xt = `${gt}-summary`, Wt = x(null), zt = x(null), Vt = x(null), qt = x(null), $ = Bt(), R = pt(), [kt, yt] = s, jt = (h == null ? void 0 : h.min) ?? Le.min, Zt = (h == null ? void 0 : h.max) ?? Le.max, Jt = x(null), Qt = typeof d == "object" ? d.step : null, te = typeof d == "object" ? d.offset : null, ee = typeof d == "object" ? null : d, [Ze, Je] = ut(() => Date.now());
2127
2127
  H(() => {
2128
2128
  if (tt !== !0) return;
2129
2129
  const c = setInterval(() => Je(Date.now()), W);
@@ -2135,10 +2135,10 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
2135
2135
  Jt.current = c;
2136
2136
  const _ = ee ?? { step: Qt ?? 0, offset: te ?? 0 };
2137
2137
  v.setOptions(
2138
- { laneHeight: r, calendar: l, zoomLimits: { min: qt, max: Zt }, snap: _, intents: u, now: se, route: D, attach: N, ends: Q },
2138
+ { laneHeight: r, calendar: l, zoomLimits: { min: jt, max: Zt }, snap: _, intents: u, now: se, route: D, attach: N, ends: Q },
2139
2139
  M ? [kt, yt] : null
2140
2140
  );
2141
- }, [v, kt, yt, r, l, qt, Zt, ee, Qt, te, u, se, D, N, Q]), H(() => {
2141
+ }, [v, kt, yt, r, l, jt, Zt, ee, Qt, te, u, se, D, N, Q]), H(() => {
2142
2142
  v.setHandlers({ onIntent: p, canMoveTo: m, onInteraction: y, onSelectedTaskChange: L, onCollapsedGroupsChange: I, onDomainChange: S });
2143
2143
  }, [v, p, m, y, L, I, S]);
2144
2144
  const Qe = x(g);
@@ -2160,7 +2160,7 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
2160
2160
  }, [v, C]), H(() => {
2161
2161
  v.setPlacing(F ?? null);
2162
2162
  }, [v, F]), H(() => {
2163
- const c = Wt.current, M = zt.current, _ = Vt.current, G = jt.current;
2163
+ const c = Wt.current, M = zt.current, _ = Vt.current, G = qt.current;
2164
2164
  if (!c || !M || !_ || !G) return;
2165
2165
  v.bind(c, M, _, G);
2166
2166
  const O = M.getBoundingClientRect();
@@ -2183,7 +2183,7 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
2183
2183
  const T = hs(v.subscribe, v.getSnapshot, v.getServerSnapshot), ts = (c, M) => {
2184
2184
  const _ = new Date(c);
2185
2185
  return M >= 200 ? $.dateLong(_) : M >= 84 ? $.date(_) : M >= 44 ? $.dateShort(_) : "";
2186
- }, b = T.ghost, j = T.spoken, vt = T.summary, ne = (c) => `${$.dateShort(new Date(c))} ${$.time(new Date(c), !1)}`, wt = (c) => `${gt}-row-${encodeURIComponent(c.key)}`, es = X(() => {
2186
+ }, b = T.ghost, q = T.spoken, vt = T.summary, ne = (c) => `${$.dateShort(new Date(c))} ${$.time(new Date(c), !1)}`, wt = (c) => `${gt}-row-${encodeURIComponent(c.key)}`, es = X(() => {
2187
2187
  const c = /* @__PURE__ */ new Map();
2188
2188
  for (const M of T.headers)
2189
2189
  for (const _ of M.within)
@@ -2221,7 +2221,7 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
2221
2221
  role: "figure",
2222
2222
  "aria-label": n,
2223
2223
  className: Ut ? `${w.root} ${Ut}` : w.root,
2224
- style: { height: `${i}px`, gridTemplateColumns: `min(${a}px, 40%) minmax(0, 1fr)`, ...je },
2224
+ style: { height: `${i}px`, gridTemplateColumns: `min(${a}px, 40%) minmax(0, 1fr)`, ...qe },
2225
2225
  children: [
2226
2226
  /* @__PURE__ */ k("div", { className: w.corner }),
2227
2227
  /* @__PURE__ */ k("div", { className: w.dayBand, "aria-hidden": "true", "data-schedule-days": "", "data-schedule-clip": "day band", children: T.days.map((c) => {
@@ -2291,7 +2291,7 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
2291
2291
  },
2292
2292
  children: [
2293
2293
  /* @__PURE__ */ k("canvas", { ref: Vt, className: w.layer, "aria-hidden": "true" }),
2294
- /* @__PURE__ */ k("canvas", { ref: jt, className: w.layer, "aria-hidden": "true" }),
2294
+ /* @__PURE__ */ k("canvas", { ref: qt, className: w.layer, "aria-hidden": "true" }),
2295
2295
  T.grips.map((c) => /* @__PURE__ */ k(
2296
2296
  "span",
2297
2297
  {
@@ -2365,19 +2365,19 @@ const jn = [], Le = { min: Rt, max: 28 * rt }, qn = [], Ae = 20, io = as(functio
2365
2365
  T.now !== null && /* @__PURE__ */ k("span", { className: w.now, "data-now": "", "data-schedule-overlay": "now mark", style: { left: `${T.now}px` } }),
2366
2366
  T.ticks.map((c) => /* @__PURE__ */ k("span", { className: w.tick, style: { left: `${c.x}px` }, children: c.x >= Ae && c.x <= T.width - Ae && /* @__PURE__ */ k("span", { className: w.tickLabel, "data-schedule-overlay": "time label", children: T.step >= rt ? $.dateShort(new Date(c.wallClock)) : $.time(new Date(c.wallClock), !1) }) }, c.wallClock))
2367
2367
  ] }),
2368
- /* @__PURE__ */ k(le, { "aria-live": "polite", children: j !== null && /* @__PURE__ */ k(
2368
+ /* @__PURE__ */ k(le, { "aria-live": "polite", children: q !== null && /* @__PURE__ */ k(
2369
2369
  zn,
2370
2370
  {
2371
- target: j.target,
2372
- lane: j.lane === null ? null : ((re = v.data.lanes.find((c) => c.id === j.lane)) == null ? void 0 : re.label) ?? j.lane
2371
+ target: q.target,
2372
+ lane: q.lane === null ? null : ((re = v.data.lanes.find((c) => c.id === q.lane)) == null ? void 0 : re.label) ?? q.lane
2373
2373
  },
2374
- j.count
2374
+ q.count
2375
2375
  ) }),
2376
2376
  /* @__PURE__ */ k(le, { id: Xt, children: `${R.scheduleSummary({ ...vt, from: ne(vt.from), to: ne(vt.to) })} ${R.scheduleKeyHelp}` })
2377
2377
  ]
2378
2378
  }
2379
2379
  ),
2380
- qe
2380
+ je
2381
2381
  ] });
2382
2382
  });
2383
2383
  function Zn(o) {
package/docs/llms-full.md CHANGED
@@ -1,6 +1,6 @@
1
- # @umriss-ui/schedule 0.3.4
1
+ # @umriss-ui/schedule 0.3.6
2
2
 
3
- > The umriss schedule for data-dense applications - work on lanes over time, with dependencies, blocked time, findings and controlled editing.
3
+ > React Gantt-style schedule for data-dense applications - work on lanes over time, with dependencies, blocked time, findings and controlled editing.
4
4
 
5
5
  Install with `pnpm add @umriss-ui/schedule`. This text is generated from the package's demo (https://romanhaendler.github.io/umriss-ui/schedule/): every page with its import line, its examples - the source exactly as it runs, with the package name where the demo imports its own source - its props tables generated from the code, and what it deliberately does not do. The pages index stands in https://romanhaendler.github.io/umriss-ui/schedule/llms.txt.
6
6
 
@@ -560,7 +560,7 @@ Install the schedule with its two peers and hand it plain data: lanes, tasks, su
560
560
  import { Schedule, Lane, Subtasks, Dependencies } from "@umriss-ui/schedule";
561
561
  ```
562
562
 
563
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/installation
563
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/installation/
564
564
 
565
565
  Install it with its peers: `pnpm add @umriss-ui/schedule @umriss-ui/core @umriss-ui/charts`, with React 18 or 19. The stylesheets load themselves - each package's script imports its own, so there is nothing to import by hand; `@umriss-ui/schedule/styles.css` stays exported for setups that link stylesheets themselves.
566
566
 
@@ -614,7 +614,7 @@ Work on lanes over time, with a day band above and time ticks that follow the zo
614
614
  import { Schedule, Lane, Subtasks, Dependencies } from "@umriss-ui/schedule";
615
615
  ```
616
616
 
617
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/schedule
617
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/schedule/
618
618
 
619
619
  Lanes stand in the order they are declared; a subtask on a lane that is not declared is not drawn. Declare `Dependencies` before `Subtasks` and its lines run beneath the bars.
620
620
 
@@ -815,7 +815,7 @@ One row per person, vehicle or room, named by its header and kept in the order i
815
815
  import { Lane } from "@umriss-ui/schedule";
816
816
  ```
817
817
 
818
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/lane
818
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/lane/
819
819
 
820
820
  A lane is declared by its id, the one subtasks name, and a label. The label is content, not a string: a name with a plate number, a status beside it. It is real text, read by a screen reader, and it stays at the left edge while the plot pans.
821
821
 
@@ -942,7 +942,7 @@ Teams, depots or regions over the lanes, to any depth, folded into one row when
942
942
  import { LaneGroup, Lane } from "@umriss-ui/schedule";
943
943
  ```
944
944
 
945
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/lane-groups
945
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/lane-groups/
946
946
 
947
947
  A group is structure, never a lane: nothing sits on it, no finding is reported for it and no intent names it (ADR-0025). The lanes keep the order they were declared in, whatever group they are in.
948
948
 
@@ -1211,7 +1211,7 @@ The bars: a main time with an optional lead-in before it and lead-out after it,
1211
1211
  import { Subtasks } from "@umriss-ui/schedule";
1212
1212
  ```
1213
1213
 
1214
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/subtasks
1214
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/subtasks/
1215
1215
 
1216
1216
  Lead-in and lead-out are durations beside the main time, not times of their own: moving the subtask takes them along. They are drawn faint in the task's colour, so preparation reads as belonging to the work and as not being it, and they occupy the lane as the main time does.
1217
1217
 
@@ -1355,7 +1355,7 @@ A line of text inside each bar: cut off where the bar is too narrow, left out wh
1355
1355
  import { Schedule } from "@umriss-ui/schedule";
1356
1356
  ```
1357
1357
 
1358
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/bar-labels
1358
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/bar-labels/
1359
1359
 
1360
1360
  The text lies on the main time, not on the lead-in. Its colour follows the bar: light text on a dark bar, dark text on a pale one, measured by contrast in either theme.
1361
1361
 
@@ -1421,7 +1421,7 @@ What a bar says besides its colour: provisional, fixed, muted, running on past t
1421
1421
  import { Subtasks, resolveAppearance } from "@umriss-ui/schedule";
1422
1422
  ```
1423
1423
 
1424
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/appearances
1424
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/appearances/
1425
1425
 
1426
1426
  `"provisional"` owns the fill (none at all), `"fixed"` the ends (a cap inside each), `"muted"` the saturation, `"open"` a fade at the edge of the view, and `progress` a rail inside the main time. The faint, outlined fill belongs to a lead-in and a lead-out and to nothing else.
1427
1427
 
@@ -1664,7 +1664,7 @@ Two subtasks claiming one lane at the same time (also called a double booking or
1664
1664
  import { Subtasks } from "@umriss-ui/schedule";
1665
1665
  ```
1666
1666
 
1667
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/overlap
1667
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/overlap/
1668
1668
 
1669
1669
  The later bar is offset a few pixels and edged, and the shared time is marked across the lane. Lead-in and lead-out occupy the lane too, so a lead-out meeting the next lead-in is an overlap. The offset stops at three levels and never leaks into the lane below.
1670
1670
 
@@ -1785,7 +1785,7 @@ Lines from one subtask's end to the next one's start within a task, with the lag
1785
1785
  import { Dependencies } from "@umriss-ui/schedule";
1786
1786
  ```
1787
1787
 
1788
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/dependencies
1788
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/dependencies/
1789
1789
 
1790
1790
  `leaves` and `arrives` say what a dependency connects - the main time, or the outer edge of the lead-out and the lead-in - and so decide whether it is violated. `attach`, `ends` and `route` only change how the line is drawn.
1791
1791
 
@@ -2066,7 +2066,7 @@ The shape of a dependency's line: a curve that leaves and arrives forwards, a st
2066
2066
  import { Dependencies } from "@umriss-ui/schedule";
2067
2067
  ```
2068
2068
 
2069
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/routes
2069
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/routes/
2070
2070
 
2071
2071
  #### Examples
2072
2072
 
@@ -2239,7 +2239,7 @@ A day band that names the days and a time band whose ticks follow the zoom, from
2239
2239
  import { Schedule } from "@umriss-ui/schedule";
2240
2240
  ```
2241
2241
 
2242
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/time-axis
2242
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/time-axis/
2243
2243
 
2244
2244
  The calendar is a list of intervals in which time counts, nothing more; deriving it from opening hours and holidays is the application's business. A dotted line marks each seam, and a drag that would end in removed time stops at the seam where time counts again.
2245
2245
 
@@ -2375,7 +2375,7 @@ Leave, maintenance and other time a lane is not available: hatched behind the wo
2375
2375
  import { BlockedTimes, findings } from "@umriss-ui/schedule";
2376
2376
  ```
2377
2377
 
2378
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/blocked-time
2378
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/blocked-time/
2379
2379
 
2380
2380
  Blocked time is data beside the work: one list, each interval naming its lane, as a leave table or a maintenance plan holds it. `findings` takes the same list as its third argument.
2381
2381
 
@@ -2591,7 +2591,7 @@ A line across the lanes at the present moment, so that whatever should have happ
2591
2591
  import { Schedule } from "@umriss-ui/schedule";
2592
2592
  ```
2593
2593
 
2594
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/now-line
2594
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/now-line/
2595
2595
 
2596
2596
  #### Examples
2597
2597
 
@@ -2683,7 +2683,7 @@ Moving through a plan with the gestures of any scrolling surface: drag, wheel, C
2683
2683
  import { Schedule } from "@umriss-ui/schedule";
2684
2684
  ```
2685
2685
 
2686
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/pan-and-zoom
2686
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/pan-and-zoom/
2687
2687
 
2688
2688
  Dragging the background pans through time and through the lanes. The wheel scrolls the lanes and hands the scroll back to the page at their end; Shift with the wheel pans through time; Ctrl or ⌘ with the wheel, or a pinch, zooms around the pointer.
2689
2689
 
@@ -2752,7 +2752,7 @@ A click on a bar selects its whole task on every lane, so a planner sees every p
2752
2752
  import { Schedule } from "@umriss-ui/schedule";
2753
2753
  ```
2754
2754
 
2755
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/selection
2755
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/selection/
2756
2756
 
2757
2757
  The schedule keeps the selection itself unless you pass `selectedTask`; then your state holds it and every change is reported. The report also names the subtask that was clicked, the one the editing grips belong to.
2758
2758
 
@@ -2908,7 +2908,7 @@ Reports what the pointer does on the plan - hover, click, right-click - with wha
2908
2908
  import { Schedule } from "@umriss-ui/schedule";
2909
2909
  ```
2910
2910
 
2911
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/interactions
2911
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/interactions/
2912
2912
 
2913
2913
  A hit names a subtask together with the part of it (lead-in, main time, lead-out), a dependency, a lane, or nothing.
2914
2914
 
@@ -3084,7 +3084,7 @@ Names what the pointer rests on - a subtask with its times and findings, a depen
3084
3084
  import { Schedule } from "@umriss-ui/schedule";
3085
3085
  ```
3086
3086
 
3087
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/tooltip
3087
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/tooltip/
3088
3088
 
3089
3089
  Its words come from the wording of @umriss-ui/core and its numbers from its formats, so a provider switches it with everything else. It steps aside while a drag is in flight and is placed where it has room.
3090
3090
 
@@ -3308,7 +3308,7 @@ Keeps two schedules on the same hours: pan or zoom one and the other follows (al
3308
3308
  import { Schedule } from "@umriss-ui/schedule";
3309
3309
  ```
3310
3310
 
3311
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/linked-schedules
3311
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/linked-schedules/
3312
3312
 
3313
3313
  `onDomainChange` reports the visible span after a pan or zoom, at most once per frame. A span handed in as `initialDomain` is not reported back, so two schedules never feed each other.
3314
3314
 
@@ -3470,7 +3470,7 @@ Converts between a point on the screen and a time on a lane, so marks of your ow
3470
3470
  import { Schedule } from "@umriss-ui/schedule";
3471
3471
  ```
3472
3472
 
3473
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/handle
3473
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/handle/
3474
3474
 
3475
3475
  The handle holds three functions and nothing else: `clientPointOf(time, lane?)`, `positionAt(clientX, clientY)` and `visibleDomain()`. Everything else the schedule does is props.
3476
3476
 
@@ -3579,7 +3579,7 @@ Drag a bar to a new time or onto another lane (also called drag-and-drop resched
3579
3579
  import { Schedule, applyIntent } from "@umriss-ui/schedule";
3580
3580
  ```
3581
3581
 
3582
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/move-and-lane
3582
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/move-and-lane/
3583
3583
 
3584
3584
  Each name in `intents` enables one gesture. Without `intents` the schedule is read-only, and pressing a bar pans the plot.
3585
3585
 
@@ -3786,7 +3786,7 @@ Change how long work takes, or how long its preparation and its wrap-up take, by
3786
3786
  import { Schedule, applyIntent } from "@umriss-ui/schedule";
3787
3787
  ```
3788
3788
 
3789
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/stretch
3789
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/stretch/
3790
3790
 
3791
3791
  `stretch` enables the two edges of the main time. `leadIn` and `leadOut` add a grip at the outer edge of each; the grips show on the selected subtask only, so click a bar first.
3792
3792
 
@@ -3889,7 +3889,7 @@ Makes a drag land on a raster - the axis' own step, a fixed duration, or a patte
3889
3889
  import { Schedule, snapTime } from "@umriss-ui/schedule";
3890
3890
  ```
3891
3891
 
3892
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/snapping
3892
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/snapping/
3893
3893
 
3894
3894
  Without `snap` a drag lands on the fine band's step, which follows the zoom. A number is a step in milliseconds; `{ step, offset }` counts from local midnight; `false` places to the minute.
3895
3895
 
@@ -4045,7 +4045,7 @@ Drag work that is not on the plan yet - from a backlog or a list of unassigned j
4045
4045
  import { Schedule, subtaskFromPlace } from "@umriss-ui/schedule";
4046
4046
  ```
4047
4047
 
4048
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/placing
4048
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/placing/
4049
4049
 
4050
4050
  The browser hands over dragged data only on the drop, so declare what is being dragged in `placing` on your `dragstart` and clear it on `dragend`. The schedule then shows the ghost at the snapped time, with the findings the drop would create.
4051
4051
 
@@ -4168,7 +4168,7 @@ Marks the lanes and times a piece of work may not go to as soon as a drag begins
4168
4168
  import { Schedule, BlockedTimes } from "@umriss-ui/schedule";
4169
4169
  ```
4170
4170
 
4171
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/where-it-may-go
4171
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/where-it-may-go/
4172
4172
 
4173
4173
  `canMoveTo(subtask, lane)` is asked once per lane when a drag takes hold, and again at the drop. Refused lanes are drawn back and hatched; over one, the ghost stays on the last lane allowed, tied to the pointer by a line.
4174
4174
 
@@ -4406,7 +4406,7 @@ Works out which later work has to move when one piece moves: every successor who
4406
4406
  import { ripple, shiftTask, applyIntent } from "@umriss-ui/schedule";
4407
4407
  ```
4408
4408
 
4409
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/ripple
4409
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/ripple/
4410
4410
 
4411
4411
  `ripple(subtasks, dependencies, intent)` returns move intents down the whole chain, in the order they were pushed. A successor keeps its length and is never pulled earlier: room that opens up is the planner's.
4412
4412
 
@@ -4612,7 +4612,7 @@ Lists what is wrong with a plan - double bookings on a lane, dependencies that d
4612
4612
  import { findings, overlaps, violatedDependencies, inBlockedTime } from "@umriss-ui/schedule";
4613
4613
  ```
4614
4614
 
4615
- Demo page: https://romanhaendler.github.io/umriss-ui/schedule/#/findings
4615
+ Demo page: https://romanhaendler.github.io/umriss-ui/schedule/findings/
4616
4616
 
4617
4617
  `findings(subtasks, dependencies, blocked)` returns all three kinds; `overlaps`, `violatedDependencies` and `inBlockedTime` return one each. They are pure functions: run them wherever the data changes, with or without a schedule on screen.
4618
4618
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@umriss-ui/schedule",
3
- "version": "0.3.4",
4
- "description": "The umriss schedule for data-dense applications - work on lanes over time, with dependencies, blocked time, findings and controlled editing.",
3
+ "version": "0.3.6",
4
+ "description": "React Gantt-style schedule for data-dense applications - work on lanes over time, with dependencies, blocked time, findings and controlled editing.",
5
5
  "license": "MIT",
6
6
  "author": "Roman Händler",
7
7
  "homepage": "https://romanhaendler.github.io/umriss-ui/schedule/",
@@ -15,11 +15,16 @@
15
15
  },
16
16
  "keywords": [
17
17
  "react",
18
- "components",
19
- "ui",
20
- "umriss",
18
+ "gantt",
19
+ "gantt-chart",
20
+ "scheduler",
21
21
  "schedule",
22
- "canvas"
22
+ "timeline",
23
+ "planning",
24
+ "resource-planning",
25
+ "canvas",
26
+ "typescript",
27
+ "umriss"
23
28
  ],
24
29
  "type": "module",
25
30
  "files": [
@@ -45,8 +50,8 @@
45
50
  "peerDependencies": {
46
51
  "react": ">=18",
47
52
  "react-dom": ">=18",
48
- "@umriss-ui/core": "^0.14.0",
49
- "@umriss-ui/charts": "^0.8.0"
53
+ "@umriss-ui/charts": "^0.8.1",
54
+ "@umriss-ui/core": "^0.15.0"
50
55
  },
51
56
  "devDependencies": {
52
57
  "@fontsource/geist-mono": "^5.3.0",
@@ -60,8 +65,8 @@
60
65
  "typescript": "^5.6.3",
61
66
  "vite": "^6.0.0",
62
67
  "vite-plugin-dts": "^4.3.0",
63
- "@umriss-ui/charts": "0.8.0",
64
- "@umriss-ui/core": "0.14.0",
68
+ "@umriss-ui/charts": "0.8.1",
69
+ "@umriss-ui/core": "0.15.0",
65
70
  "@umriss-ui/demo": "0.0.0"
66
71
  },
67
72
  "scripts": {