@protomaze/time 1.4.3
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/README.md +1 -0
- package/TimeSliderDemo.d.ts +1 -0
- package/TimeSliderDemo.js +1 -0
- package/common/CaptureConsole.d.ts +5 -0
- package/common/CaptureConsole.js +1 -0
- package/common/Clamper.d.ts +6 -0
- package/common/Clamper.js +1 -0
- package/common/Disposables.d.ts +7 -0
- package/common/Disposables.js +1 -0
- package/common/Easing.d.ts +1 -0
- package/common/Easing.js +1 -0
- package/common/Expand.d.ts +3 -0
- package/common/Expand.js +1 -0
- package/common/GlslTools.d.ts +4 -0
- package/common/GlslTools.js +1 -0
- package/common/TimeTools.d.ts +42 -0
- package/common/TimeTools.js +1 -0
- package/data/CompositeTimeSliderModel.d.ts +13 -0
- package/data/CompositeTimeSliderModel.js +1 -0
- package/data/IntervalLaneManager.d.ts +24 -0
- package/data/IntervalLaneManager.js +1 -0
- package/data/TimeSliderBush.d.ts +23 -0
- package/data/TimeSliderBush.js +1 -0
- package/data/TimeSliderElement.d.ts +21 -0
- package/data/TimeSliderElement.js +1 -0
- package/data/TimeSliderIntervalsModel.d.ts +6 -0
- package/data/TimeSliderIntervalsModel.js +1 -0
- package/data/TimeSliderLanesModel.d.ts +11 -0
- package/data/TimeSliderLanesModel.js +1 -0
- package/data/TimeSliderModel.d.ts +45 -0
- package/data/TimeSliderModel.js +1 -0
- package/data/TimeSliderPointsModel.d.ts +6 -0
- package/data/TimeSliderPointsModel.js +1 -0
- package/data/TimeSliderRange.d.ts +30 -0
- package/data/TimeSliderRange.js +1 -0
- package/data/histogram/TimeSliderDynamicHistogram.d.ts +21 -0
- package/data/histogram/TimeSliderDynamicHistogram.js +1 -0
- package/data/histogram/TimeSliderFixedHistogram.d.ts +52 -0
- package/data/histogram/TimeSliderFixedHistogram.js +1 -0
- package/data/histogram/TimeSliderHistogram.d.ts +68 -0
- package/data/histogram/TimeSliderHistogram.js +1 -0
- package/data/histogram/TimeSliderSplittingFixedHistogram.d.ts +45 -0
- package/data/histogram/TimeSliderSplittingFixedHistogram.js +1 -0
- package/demo/Common.d.ts +21 -0
- package/demo/Common.js +1 -0
- package/demo/Metrics.d.ts +2 -0
- package/demo/Metrics.js +1 -0
- package/demo/Nasdaq.d.ts +3 -0
- package/demo/Nasdaq.js +1 -0
- package/demo/Quakes.d.ts +3 -0
- package/demo/Quakes.js +1 -0
- package/demo/QuakesFilters.d.ts +3 -0
- package/demo/QuakesFilters.js +1 -0
- package/demo/Random.d.ts +49 -0
- package/demo/Random.js +1 -0
- package/demo/Test.d.ts +5 -0
- package/demo/Test.js +1 -0
- package/demo/Wars.d.ts +2 -0
- package/demo/Wars.js +1 -0
- package/engine/HorizontalPinchZoom.d.ts +3 -0
- package/engine/HorizontalPinchZoom.js +1 -0
- package/engine/PinchZoom.d.ts +17 -0
- package/engine/PinchZoom.js +1 -0
- package/engine/TimeSlider.d.ts +225 -0
- package/engine/TimeSlider.js +1 -0
- package/engine/TimeSliderEngine.d.ts +42 -0
- package/engine/TimeSliderEngine.js +1 -0
- package/event/TypedEventEmitter.d.ts +13 -0
- package/event/TypedEventEmitter.js +1 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/layer/TimeSliderHistogramLayer.d.ts +27 -0
- package/layer/TimeSliderHistogramLayer.js +1 -0
- package/layer/TimeSliderHistogramLayerOld.d.ts +20 -0
- package/layer/TimeSliderHistogramLayerOld.js +1 -0
- package/layer/TimeSliderIntervalsLayer.d.ts +7 -0
- package/layer/TimeSliderIntervalsLayer.js +1 -0
- package/layer/TimeSliderLayer.d.ts +66 -0
- package/layer/TimeSliderLayer.js +1 -0
- package/layer/TimeSliderLayerLoader.d.ts +8 -0
- package/layer/TimeSliderLayerLoader.js +1 -0
- package/layer/TimeSliderPointsLayer.d.ts +7 -0
- package/layer/TimeSliderPointsLayer.js +1 -0
- package/package.json +58 -0
- package/react/ColoredSlider.d.ts +58 -0
- package/react/ColoredSlider.js +1 -0
- package/react/ColoredSliderExtendsInput.d.ts +31 -0
- package/react/ColoredSliderExtendsInput.js +1 -0
- package/react/DateLabelWithPicker.d.ts +6 -0
- package/react/DateLabelWithPicker.js +1 -0
- package/react/DateRangeLabelWithPicker.d.ts +7 -0
- package/react/DateRangeLabelWithPicker.js +1 -0
- package/react/DeepMemoHook.d.ts +1 -0
- package/react/DeepMemoHook.js +1 -0
- package/react/FullscreenButton.d.ts +1 -0
- package/react/FullscreenButton.js +1 -0
- package/react/MaterialIconButton.d.ts +7 -0
- package/react/MaterialIconButton.js +1 -0
- package/react/MaterialTextButton.d.ts +8 -0
- package/react/MaterialTextButton.js +1 -0
- package/react/PinchZoomHook.d.ts +10 -0
- package/react/PinchZoomHook.js +1 -0
- package/react/PointerClick.d.ts +1 -0
- package/react/PointerClick.js +1 -0
- package/react/ReactTimeSlider.d.ts +52 -0
- package/react/ReactTimeSlider.js +1 -0
- package/react/TimeLabelWithPicker.d.ts +8 -0
- package/react/TimeLabelWithPicker.js +1 -0
- package/react/YearScroller.d.ts +13 -0
- package/react/YearScroller.js +1 -0
- package/style/TimeSliderColors.d.ts +6 -0
- package/style/TimeSliderColors.js +1 -0
- package/style/TimeSliderHistogramStyle.d.ts +3 -0
- package/style/TimeSliderHistogramStyle.js +1 -0
- package/style/TimeSliderIntervalsStyle.d.ts +13 -0
- package/style/TimeSliderIntervalsStyle.js +1 -0
- package/style/TimeSliderLabeler.d.ts +2 -0
- package/style/TimeSliderLabeler.js +1 -0
- package/style/TimeSliderPointsStyle.d.ts +38 -0
- package/style/TimeSliderPointsStyle.js +1 -0
- package/style/TimeSliderStyle.d.ts +1 -0
- package/style/TimeSliderStyle.js +1 -0
- package/style/TimeSliderStyler.d.ts +3 -0
- package/style/TimeSliderStyler.js +1 -0
- package/three/Three3DTimeSliderEngine.d.ts +27 -0
- package/three/Three3DTimeSliderEngine.js +1 -0
- package/three/ThreeTimeSlider.d.ts +4 -0
- package/three/ThreeTimeSlider.js +1 -0
- package/three/ThreeTimeSliderEngine.d.ts +20 -0
- package/three/ThreeTimeSliderEngine.js +1 -0
- package/three/layer/GrowingBufferGeometry.d.ts +26 -0
- package/three/layer/GrowingBufferGeometry.js +1 -0
- package/three/layer/GrowingInstanceMatrix.d.ts +43 -0
- package/three/layer/GrowingInstanceMatrix.js +1 -0
- package/three/layer/Three3DIntervalsTimeLayerLoader.d.ts +11 -0
- package/three/layer/Three3DIntervalsTimeLayerLoader.js +1 -0
- package/three/layer/Three3DPointsTimeLayerLoader.d.ts +10 -0
- package/three/layer/Three3DPointsTimeLayerLoader.js +1 -0
- package/three/layer/ThreeIntervalsTimeLayerLoader.d.ts +10 -0
- package/three/layer/ThreeIntervalsTimeLayerLoader.js +1 -0
- package/three/layer/ThreePointsTimeLayerLoader.d.ts +9 -0
- package/three/layer/ThreePointsTimeLayerLoader.js +1 -0
- package/three/layer/ThreeTimeLayerLoader.d.ts +10 -0
- package/three/layer/ThreeTimeLayerLoader.js +1 -0
- package/three/react/ReactThreeTimeSlider.d.ts +2 -0
- package/three/react/ReactThreeTimeSlider.js +1 -0
- package/ticks/TimeSliderConstants.d.ts +15 -0
- package/ticks/TimeSliderConstants.js +1 -0
- package/ticks/TimeTicksBar.d.ts +46 -0
- package/ticks/TimeTicksBar.js +1 -0
- package/ticks/YAxisTicks.d.ts +31 -0
- package/ticks/YAxisTicks.js +1 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { TimeSliderHistogram, TimeSliderHistogramAttributes, TimeSliderHistogramClassifier, TimeSliderHistogramOptions } from "../data/histogram/TimeSliderHistogram";
|
|
2
|
+
import { TimeSliderInterval } from "../data/TimeSliderElement";
|
|
3
|
+
import { TimeSliderModel } from "../data/TimeSliderModel";
|
|
4
|
+
import { TimeSliderHistogramStyle } from "../style/TimeSliderHistogramStyle";
|
|
5
|
+
import { TimeSliderIntervalsLayer } from "./TimeSliderIntervalsLayer";
|
|
6
|
+
import { TimeSliderLayerOptions } from "./TimeSliderLayer";
|
|
7
|
+
export type TimeSliderHistogramLayerOldOptions<M extends TimeSliderModel = TimeSliderModel> = TimeSliderLayerOptions<TimeSliderInterval<TimeSliderHistogramAttributes>, TimeSliderHistogramStyle> & {
|
|
8
|
+
classifier?: TimeSliderHistogramClassifier<M>;
|
|
9
|
+
classificationIsColor?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare class TimeSliderHistogramLayerOld<M extends TimeSliderModel = TimeSliderModel> extends TimeSliderIntervalsLayer<TimeSliderInterval<TimeSliderHistogramAttributes>, TimeSliderHistogramStyle> {
|
|
12
|
+
private content;
|
|
13
|
+
private d;
|
|
14
|
+
histogram: TimeSliderHistogram;
|
|
15
|
+
constructor(content: M, options?: TimeSliderHistogramLayerOldOptions<M>);
|
|
16
|
+
createHistogram(options?: TimeSliderHistogramOptions<M>): TimeSliderHistogram;
|
|
17
|
+
get fixedBoxes(): boolean;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
getDefaultStyle(): TimeSliderHistogramStyle;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Disposables as t}from"../common/Disposables";import{TimeSliderDynamicHistogram as e}from"../data/histogram/TimeSliderDynamicHistogram";import{TimeSliderFixedHistogram as s}from"../data/histogram/TimeSliderFixedHistogram";import{TimeSliderIntervalsModel as i}from"../data/TimeSliderIntervalsModel";import{TimeSliderIntervalsLayer as r}from"./TimeSliderIntervalsLayer";export class TimeSliderHistogramLayerOld extends r{constructor(e,s){super(new i,s),this.content=e,this.d=new t;const r=this.createHistogram({classifier:s?.classifier,...s?.style});this.histogram=r,s?.classifier&&!s.labeler&&(s.classificationIsColor?this.labeler=t=>Math.abs(t.v[0]-t.v[1])+"":this.labeler=t=>{const e=Math.abs(t.v[0]-t.v[1]);return t.attributes?.classification+": "+e}),s?.classificationIsColor&&(this.styler=t=>{const e=t.attributes?.classification;return e?{fill:{color:e},border:{color:e}}:void 0}),this.d.add(this.on("loaded",t=>{t?r.start(this.timeSlider):r.stop()})),this.d.add(this.on("invalidateAll",()=>{r.average=!0===this.style.average,r.weighted=!0===this.style.weighted,r.inverted=!0===this.style.inverted,this.style.mode&&(r.mode=this.style.mode),r.classifier=this.style.classifier,this.style.classOrder&&(r.classOrder=this.style.classOrder)}))}createHistogram(t){return this.fixedBoxes?new s(this.model,this.content,t):new e(this.model,this.content,t)}get fixedBoxes(){return void 0!==this.style.mode?.fixed||void 0!==this.style.mode?.fixedUnit}dispose(){this.model.clear(),this.d.dispose()}getDefaultStyle(){return{}}}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TimeSliderInterval } from "../data/TimeSliderElement";
|
|
2
|
+
import { TimeSliderIntervalsStyle } from "../style/TimeSliderIntervalsStyle";
|
|
3
|
+
import { TimeSliderLayer, TimeSliderLayerOptions } from "./TimeSliderLayer";
|
|
4
|
+
export type TimeSliderIntervalsLayerOptions = TimeSliderLayerOptions<TimeSliderInterval, TimeSliderIntervalsStyle>;
|
|
5
|
+
export declare class TimeSliderIntervalsLayer<E extends TimeSliderInterval = TimeSliderInterval, S extends TimeSliderIntervalsStyle = TimeSliderIntervalsStyle> extends TimeSliderLayer<E, S> {
|
|
6
|
+
getDefaultStyle(): S;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{TimeSliderLayer as e}from"./TimeSliderLayer";export class TimeSliderIntervalsLayer extends e{getDefaultStyle(){return{}}}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { TimeSliderElement } from "../data/TimeSliderElement";
|
|
2
|
+
import { TimeSliderModel } from "../data/TimeSliderModel";
|
|
3
|
+
import { TimeSlider } from "../engine/TimeSlider";
|
|
4
|
+
import { TypedEventEmitter } from "../event/TypedEventEmitter";
|
|
5
|
+
import { TimeSliderLabeler } from "../style/TimeSliderLabeler";
|
|
6
|
+
import { TimeSliderStyle } from "../style/TimeSliderStyle";
|
|
7
|
+
import { TimeSliderStyler } from "../style/TimeSliderStyler";
|
|
8
|
+
import { YAxisSettings } from "../ticks/YAxisTicks";
|
|
9
|
+
export type TimeSliderModelElement<M extends TimeSliderModel> = M extends TimeSliderModel<infer E> ? E : never;
|
|
10
|
+
export type TimeSliderLayerOptions<E extends TimeSliderElement, S extends TimeSliderStyle> = {
|
|
11
|
+
id?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
min?: number;
|
|
14
|
+
max?: number;
|
|
15
|
+
visible?: boolean;
|
|
16
|
+
style?: S;
|
|
17
|
+
styler?: TimeSliderStyler<E, S>;
|
|
18
|
+
labeler?: TimeSliderLabeler<E>;
|
|
19
|
+
yAxis?: YAxisSettings;
|
|
20
|
+
};
|
|
21
|
+
export declare abstract class TimeSliderLayer<E extends TimeSliderElement = TimeSliderElement, S extends TimeSliderStyle = TimeSliderStyle> extends TypedEventEmitter<{
|
|
22
|
+
selection: E[];
|
|
23
|
+
name: string;
|
|
24
|
+
min: number;
|
|
25
|
+
max: number;
|
|
26
|
+
visible: boolean;
|
|
27
|
+
loaded?: boolean;
|
|
28
|
+
invalidate: string;
|
|
29
|
+
invalidateAll: void;
|
|
30
|
+
}> {
|
|
31
|
+
model: TimeSliderModel<E>;
|
|
32
|
+
id: string;
|
|
33
|
+
private _min;
|
|
34
|
+
private _max;
|
|
35
|
+
private _name;
|
|
36
|
+
private _visible;
|
|
37
|
+
private _loaded;
|
|
38
|
+
private _timeSlider?;
|
|
39
|
+
private _styler?;
|
|
40
|
+
style: S;
|
|
41
|
+
labeler?: TimeSliderLabeler<E>;
|
|
42
|
+
yAxis: YAxisSettings;
|
|
43
|
+
constructor(model: TimeSliderModel<E>, options?: TimeSliderLayerOptions<E, S>);
|
|
44
|
+
get yAxisGroup(): string;
|
|
45
|
+
get styler(): TimeSliderStyler<E, S> | undefined;
|
|
46
|
+
set styler(newStyler: TimeSliderStyler<E, S> | undefined);
|
|
47
|
+
abstract getDefaultStyle(): S;
|
|
48
|
+
invalidate(elementOrId: string | {
|
|
49
|
+
id: string;
|
|
50
|
+
}): void;
|
|
51
|
+
invalidateAll(): void;
|
|
52
|
+
select(elements: E[]): void;
|
|
53
|
+
get min(): number;
|
|
54
|
+
set min(newMin: number);
|
|
55
|
+
get max(): number;
|
|
56
|
+
set max(newMax: number);
|
|
57
|
+
get timeSlider(): TimeSlider | undefined;
|
|
58
|
+
set timeSlider(timeSlider: TimeSlider | undefined);
|
|
59
|
+
get name(): string;
|
|
60
|
+
set name(newName: string);
|
|
61
|
+
get visible(): boolean;
|
|
62
|
+
set visible(isit: boolean);
|
|
63
|
+
get loaded(): boolean;
|
|
64
|
+
set loaded(isit: boolean);
|
|
65
|
+
private shouldModelLoad;
|
|
66
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{v4 as i}from"uuid";import{TypedEventEmitter as t}from"../event/TypedEventEmitter";export class TimeSliderLayer extends t{constructor(t,e){super(),this.model=t,this._visible=!0,this._loaded=!1,this.id=e?.id||i(),this.style=e?.style||this.getDefaultStyle(),this._styler=e?.styler,this.labeler=e?.labeler,this.yAxis=e?.yAxis||{},this._name=e?.name||t.name||"Unknown",this._min=e?.min||0,this._max=e?.max||1,this._visible="boolean"!=typeof e?.visible||e.visible}get yAxisGroup(){return this.yAxis.group||this.id}get styler(){return this._styler}set styler(i){this._styler=i,this.invalidateAll()}invalidate(i){const t="string"==typeof i?i:i.id;this.emit("invalidate",t)}invalidateAll(){this.emit("invalidateAll")}select(i){this.emit("selection",i)}get min(){return this._min}set min(i){i!==this._min&&(this._min=i,this.emit("min",i))}get max(){return this._max}set max(i){i!==this._max&&(this._max=i,this.emit("max",i))}get timeSlider(){return this._timeSlider}set timeSlider(i){this._timeSlider=i}get name(){return this._name}set name(i){i!==this._name&&(this._name=i,this.emit("name",i))}get visible(){return this._visible}set visible(i){i!==this._visible&&(this._visible=i,this.emit("visible",i),this.shouldModelLoad())}get loaded(){return this._loaded}set loaded(i){i!==this._loaded&&(this._loaded=i,this.shouldModelLoad(),this.emit("loaded",i))}shouldModelLoad(){const i=this.loaded&&this.visible;this.model.loaded(this.id,i)}}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TimeSlider } from "../engine/TimeSlider";
|
|
2
|
+
import { TimeSliderEngine, TimeSliderEngineClass, TimeSliderEngineScene } from "../engine/TimeSliderEngine";
|
|
3
|
+
import { TimeSliderLayer } from "./TimeSliderLayer";
|
|
4
|
+
export interface TimeSliderLayerLoader<T extends TimeSliderEngine<any>> {
|
|
5
|
+
engineClass: TimeSliderEngineClass<T>;
|
|
6
|
+
canLoad(layer: TimeSliderLayer): boolean;
|
|
7
|
+
load(layer: TimeSliderLayer, scene: TimeSliderEngineScene<T>, engine: T, timeSlider: TimeSlider): () => void;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TimeSliderPoint } from "../data/TimeSliderElement";
|
|
2
|
+
import { TimeSliderPointsStyle } from "../style/TimeSliderPointsStyle";
|
|
3
|
+
import { TimeSliderLayer, TimeSliderLayerOptions } from "./TimeSliderLayer";
|
|
4
|
+
export type TimeSliderPointsLayerOptions = TimeSliderLayerOptions<TimeSliderPoint, TimeSliderPointsStyle>;
|
|
5
|
+
export declare class TimeSliderPointsLayer extends TimeSliderLayer<TimeSliderPoint, TimeSliderPointsStyle> {
|
|
6
|
+
getDefaultStyle(): TimeSliderPointsStyle;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{TimeSliderLayer as e}from"./TimeSliderLayer";export class TimeSliderPointsLayer extends e{getDefaultStyle(){return{}}}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@protomaze/time",
|
|
3
|
+
"version": "1.4.3",
|
|
4
|
+
"description": "Protomaze Time sliders",
|
|
5
|
+
"main": "index.ts",
|
|
6
|
+
"types": "index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"**/*.js",
|
|
9
|
+
"**/*.d.ts"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"dev": "webpack serve --mode development",
|
|
13
|
+
"compile": "tsc && node dev/copy_files.js && node dev/minify_files.js",
|
|
14
|
+
"pub": "npm version patch --no-git-tag-version && rimraf build && npm run compile && cd build && npm --registry http://localhost:4873/ publish",
|
|
15
|
+
"deploy": "rimraf build && npm run compile && cd build && npm publish --access public",
|
|
16
|
+
"build": "webpack --mode production && npm run deploy",
|
|
17
|
+
"release": "npm version patch --no-git-tag-version && npm run build",
|
|
18
|
+
"release:minor": "npm version minor --no-git-tag-version && npm run build",
|
|
19
|
+
"release:major": "npm version major --no-git-tag-version && npm run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"webpack",
|
|
23
|
+
"typescript"
|
|
24
|
+
],
|
|
25
|
+
"author": "Tom Crauwels",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"rbush": "^4.0.1",
|
|
28
|
+
"three": "0.178.0",
|
|
29
|
+
"uuid": "^14.0.1"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"react": "18.2.0",
|
|
33
|
+
"react-dom": "18.2.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/rbush": "4.0.0",
|
|
37
|
+
"@types/react": "18.0.34",
|
|
38
|
+
"@types/react-dom": "18.0.11",
|
|
39
|
+
"@types/three": "0.178.0",
|
|
40
|
+
"copy-webpack-plugin": "^14.0.0",
|
|
41
|
+
"css-loader": "^6.2.0",
|
|
42
|
+
"file-loader": "6.2.0",
|
|
43
|
+
"html-webpack-plugin": "^5.3.2",
|
|
44
|
+
"react": "18.2.0",
|
|
45
|
+
"react-dom": "18.2.0",
|
|
46
|
+
"style-loader": "^3.2.1",
|
|
47
|
+
"terser": "^5.43.1",
|
|
48
|
+
"ts-loader": "^9.6.2",
|
|
49
|
+
"typescript": "^6.0.3",
|
|
50
|
+
"url-loader": "^4.1.1",
|
|
51
|
+
"webpack": "^5.64.4",
|
|
52
|
+
"webpack-cli": "^6.0.1",
|
|
53
|
+
"webpack-dev-server": "^5.2.2"
|
|
54
|
+
},
|
|
55
|
+
"overrides": {
|
|
56
|
+
"@types/scheduler": "< 0.23.0"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type AvailableListener = (available: number | null) => void;
|
|
3
|
+
export type HoverListener = (hover: number | null) => void;
|
|
4
|
+
export type ValueListener = (value: number) => void;
|
|
5
|
+
export type ColoredSliderProps = {
|
|
6
|
+
matchWidth?: boolean;
|
|
7
|
+
railWidth?: number;
|
|
8
|
+
hoverWidth?: number;
|
|
9
|
+
handleColor?: string;
|
|
10
|
+
progressColor?: string;
|
|
11
|
+
railColor?: string;
|
|
12
|
+
hoverColor?: string;
|
|
13
|
+
availableColor?: string;
|
|
14
|
+
available?: number | null;
|
|
15
|
+
onAvailable?: AvailableListener;
|
|
16
|
+
hover?: number | null;
|
|
17
|
+
onHover?: HoverListener;
|
|
18
|
+
value?: number;
|
|
19
|
+
onValue?: ValueListener;
|
|
20
|
+
min?: number;
|
|
21
|
+
max?: number;
|
|
22
|
+
} & React.InputHTMLAttributes<HTMLDivElement>;
|
|
23
|
+
export interface ColoredSliderElement extends HTMLDivElement {
|
|
24
|
+
matchWidth: boolean;
|
|
25
|
+
railWidth: number;
|
|
26
|
+
hoverWidth: number;
|
|
27
|
+
handleColor: string;
|
|
28
|
+
progressColor: string;
|
|
29
|
+
railColor: string;
|
|
30
|
+
hoverColor: string;
|
|
31
|
+
availableColor: string;
|
|
32
|
+
value: number;
|
|
33
|
+
onValue: (listener: ValueListener) => () => void;
|
|
34
|
+
available: number | null;
|
|
35
|
+
onAvailable: (listener: AvailableListener) => () => void;
|
|
36
|
+
hover: number | null;
|
|
37
|
+
onHover: (listener: AvailableListener) => () => void;
|
|
38
|
+
min: number;
|
|
39
|
+
max: number;
|
|
40
|
+
}
|
|
41
|
+
export declare const ColoredSlider: React.ForwardRefExoticComponent<{
|
|
42
|
+
matchWidth?: boolean;
|
|
43
|
+
railWidth?: number;
|
|
44
|
+
hoverWidth?: number;
|
|
45
|
+
handleColor?: string;
|
|
46
|
+
progressColor?: string;
|
|
47
|
+
railColor?: string;
|
|
48
|
+
hoverColor?: string;
|
|
49
|
+
availableColor?: string;
|
|
50
|
+
available?: number | null;
|
|
51
|
+
onAvailable?: AvailableListener;
|
|
52
|
+
hover?: number | null;
|
|
53
|
+
onHover?: HoverListener;
|
|
54
|
+
value?: number;
|
|
55
|
+
onValue?: ValueListener;
|
|
56
|
+
min?: number;
|
|
57
|
+
max?: number;
|
|
58
|
+
} & React.InputHTMLAttributes<HTMLDivElement> & React.RefAttributes<ColoredSliderElement>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{forwardRef as t,useCallback as n,useEffect as r,useImperativeHandle as o,useRef as i,useState as l}from"react";import{v4 as u}from"uuid";const a={pointerEvents:"none",position:"absolute",zIndex:99999,borderRadius:"4px",left:0,top:"50%",transform:"translateY(-50%)"};export const ColoredSlider=t(({handleColor:t,progressColor:c,railColor:d,hoverColor:h,availableColor:s,matchWidth:p,value:v,onValue:m,available:f,onAvailable:x,hover:g,onHover:w,railWidth:b,hoverWidth:y,min:C,max:M,...E},P)=>{const z=i(null),R=i(null),L=i(null),W=i(null),B=i(null),I=i(null),[k,D]=(i(E.id||u()),l(t||"#f44")),[S,A]=l(c||"#f44"),[U,X]=l(d||"#888"),[H,V]=l(h||"#f448 "),[$,O]=l(s||"#df08"),[Y,j]=l(b||4),[q,F]=l(y||8),[G,J]=l(p||!1),[K,N]=l(C||0),[Q,T]=l(M||100),[Z,_]=l(v||50),[ee,te]=l(!1),[ne,re]=l(!1),[oe,ie]=l(null),[le,ue]=l(f||null),ae=i(new Set),ce=i(new Set),de=i(new Set),he=i(K),se=i(Q),pe=i(!1);r(()=>{pe.current=ee},[ee]),r(()=>{he.current=K},[K]),r(()=>{se.current=Q},[Q]),r(()=>{void 0!==v&&ae.current.forEach(e=>e(v)),"number"==typeof v&&_(v)},[v]),r(()=>{"number"==typeof C&&N(C)},[C]),r(()=>{"number"==typeof M&&T(M)},[M]),r(()=>{void 0!==f&&ce.current.forEach(e=>e(f)),"number"==typeof f&&ue(f)},[f]),r(()=>{if(le&&z.current&&I.current){const e=z.current.getBoundingClientRect(),t=(le-K)/(Q-K);let n;p?(n=Math.max(0,Math.min(t,1)),I.current.style.width=`${Math.min(e.width,n*e.width+2)}px`):(n=Math.max(0,Math.min(t,1)),I.current.style.width=1===n?n*(e.width-16)+16+"px":n*(e.width-16)+8+"px")}ce.current.forEach(e=>e(le)),"function"==typeof x&&x(le)},[le,K,Q,ne]),r(()=>{if(oe){if(B.current&&z.current){const e=z.current.getBoundingClientRect(),t=Math.max(0,Math.min(oe,1));B.current.style.width=G?`${Math.min(e.width,t*e.width+2)}px`:oe>=1?t*(e.width-16)+16+"px":t*(e.width-16)+8+"px"}}else B.current&&(B.current.style.width="0px");de.current.forEach(e=>e(oe)),"function"==typeof w&&w(oe)},[oe,G]),o(P,()=>({...z.current,onValue:e=>(ae.current.add(e),()=>{ae.current.delete(e)}),get value(){return Z},set value(e){"function"==typeof m&&m(e),_(e)},get max(){return Q},set max(e){T(e)},get min(){return K},set min(e){N(e)},get matchWidth(){return G},set matchWidth(e){J(e)},get railWidth(){return Y},set railWidth(e){j(e)},get hoverWidth(){return q},set hoverWidth(e){F(e)},get hover(){return oe},set hover(e){ie(e)},onHover:e=>(de.current.add(e),()=>{de.current.delete(e)}),get available(){return le},set available(e){ue(e)},onAvailable:e=>(ce.current.add(e),()=>{ce.current.delete(e)}),get handleColor(){return k},set handleColor(e){D(e)},get progressColor(){return S},set progressColor(e){A(e)},get railColor(){return U},set railColor(e){X(e)},get hoverColor(){return H},set hoverColor(e){V(e)},get availableColor(){return $},set availableColor(e){O(e)}}),[]);const ve=n(e=>{if(z.current){const t=z.current.getBoundingClientRect();let n;if(p){const r=(e.clientX-t.left)/t.width,o=8/t.width;n=Math.max(o,Math.min(r,1-o))}else{const t=z.current.getBoundingClientRect(),r=(e.clientX-t.left-8)/(t.width-16);n=Math.max(0,Math.min(r,1))}const r=se.current-he.current,o=he.current+n*r;_(o),ae.current.forEach(e=>e(o)),"function"==typeof m&&m(o)}},[p]);r(()=>{if(z.current&&W.current&&R.current){const e=z.current.getBoundingClientRect(),t=(Z-K)/(Q-K);if(p){const n=8/e.width,r=Math.max(n,Math.min(t,1-n));W.current.style.width=r*e.width+"px",R.current.style.left=r*e.width+"px"}else{const n=Math.max(0,Math.min(t,1));W.current.style.width=n*(e.width-16)+8+"px",R.current.style.left=n*(e.width-16)+8+"px"}}},[K,Q,Z,ne]),r(()=>{const e=()=>{re(e=>!e)},t=new ResizeObserver(e);return z.current&&t.observe(z.current),window.addEventListener("resize",e),()=>{t.disconnect(),window.removeEventListener("resize",e)}},[]),r(()=>{if(ee){const e=e=>{e.preventDefault(),ve(e)},t=e=>{te(!1)};return document.addEventListener("pointermove",e),document.addEventListener("pointerup",t),()=>{document.removeEventListener("pointermove",e),document.removeEventListener("pointerup",t)}}},[ee,p]);const me=n(e=>{E.onPointerDown?.(e),e.preventDefault(),te(!0)},[E.onPointerDown]),fe=n(e=>{E.onPointerUp?.(e),ve(e)},[E.onPointerUp]),xe=n(e=>{E.onPointerMove?.(e);const t=e.target.getBoundingClientRect(),n=(e.clientX-t.left)/t.width;ie(Math.max(0,Math.min(1,n)))},[E.onPointerMove]),ge=n(e=>{E.onPointerLeave?.(e),ie(null)},[E.onPointerLeave]);return e.createElement("div",{...E,ref:z,onPointerDown:me,onPointerUp:fe,onPointerMove:E.onPointerMove&&xe,onPointerLeave:ge,style:{cursor:"pointer",padding:"8px 0",height:"8px",boxSizing:"content-box",touchAction:"none",...E.style}},e.createElement("div",{ref:L,style:{...a,width:"100%",height:(null===oe?Y:q)+"px",zIndex:99999,background:U,borderRadius:"4px"}}),e.createElement("div",{ref:I,style:{...a,height:(null===oe?Y:q)+"px",zIndex:999999,background:$}}),e.createElement("div",{ref:B,style:{...a,height:(null===oe?Y:q)+"px",zIndex:9999999,background:H}}),e.createElement("div",{ref:W,style:{...a,height:(null===oe?Y:q)+"px",zIndex:99999999,background:S}}),e.createElement("div",{ref:R,style:{pointerEvents:"none",position:"absolute",height:"16px",width:"16px",zIndex:999999999,background:k,transform:"translate(-8px, -4px)",borderRadius:"50%"}}))});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type AvailableListener = (available: number | null) => void;
|
|
3
|
+
export type HoverListener = (hover: number | null) => void;
|
|
4
|
+
export interface ColoredSliderInputElement extends HTMLInputElement {
|
|
5
|
+
matchWidth: boolean;
|
|
6
|
+
railWidth: number;
|
|
7
|
+
hoverWidth: number;
|
|
8
|
+
handleColor: string;
|
|
9
|
+
progressColor: string;
|
|
10
|
+
railColor: string;
|
|
11
|
+
hoverColor: string;
|
|
12
|
+
availableColor: string;
|
|
13
|
+
available: number | null;
|
|
14
|
+
onAvailable: (listener: AvailableListener) => () => void;
|
|
15
|
+
hover: number | null;
|
|
16
|
+
onHover: (listener: AvailableListener) => () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare const ColoredSliderExtendsInput: React.ForwardRefExoticComponent<{
|
|
19
|
+
matchWidth?: boolean;
|
|
20
|
+
railWidth?: number;
|
|
21
|
+
hoverWidth?: number;
|
|
22
|
+
handleColor?: string;
|
|
23
|
+
progressColor?: string;
|
|
24
|
+
railColor?: string;
|
|
25
|
+
hoverColor?: string;
|
|
26
|
+
availableColor?: string;
|
|
27
|
+
available?: number | null;
|
|
28
|
+
onAvailable?: AvailableListener;
|
|
29
|
+
hover?: number | null;
|
|
30
|
+
onHover?: HoverListener;
|
|
31
|
+
} & React.InputHTMLAttributes<HTMLInputElement> & React.RefAttributes<ColoredSliderInputElement>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{forwardRef as t,useEffect as n,useImperativeHandle as r,useRef as o,useState as l}from"react";import{v4 as i}from"uuid";const u={touchAction:"none",pointerEvents:"none",position:"absolute",zIndex:99999,borderRadius:"4px 0px 0px 4px"};export const ColoredSliderExtendsInput=t(({handleColor:t,progressColor:a,railColor:c,hoverColor:d,availableColor:p,matchWidth:s,available:h,onAvailable:x,hover:g,onHover:b,railWidth:m,hoverWidth:f,min:v,max:y,...w},k)=>{const C=o(null),E=o(null),$=o(null),R=o(null),z=o(null),W=o(null),M=o(w.id||i()),[I,A]=l(t||"#f44"),[B,F]=l(a||"#f44"),[L,H]=l(c||"#aaa8"),[S,X]=l(d||"#aaa8"),[N,O]=l(p||"#aaa8"),[j,q]=l(m||4),[D,G]=l(f||8),[J,K]=l(s||!1),[P,Q]=l(),[T,U]=l(null),[V,Y]=l(h||null),Z=o(new Set),_=o(new Set);n(()=>{if(V&&C.current&&W.current){const e=parseFloat(C.current.max)||100,t=parseFloat(C.current.min)||0,n=(V-t)/(e-t),r=Math.max(0,Math.min(n,1)),o=C.current.getBoundingClientRect();1===r?(W.current.style.width=r*(o.width-16)+16+"px",W.current.style.borderRadius="4px"):(W.current.style.width=r*(o.width-16)+8+"px",W.current.style.borderRadius="4px 0px 0px 4px")}Z.current.forEach(e=>e(V)),"function"==typeof x&&x(V)},[V]),n(()=>{if(T){if(z.current&&C.current){const e=C.current.getBoundingClientRect(),t=Math.max(0,Math.min(T,1));T>=1?(z.current.style.width=t*(e.width-16)+16+"px",z.current.style.borderRadius="4px"):(z.current.style.width=t*(e.width-16)+8+"px",z.current.style.borderRadius="4px 0px 0px 4px")}}else z.current&&(z.current.style.width="0px");_.current.forEach(e=>e(T)),"function"==typeof b&&b(T)},[T]),r(k,()=>({...C.current,get matchWidth(){return J},set matchWidth(e){K(e)},get railWidth(){return j},set railWidth(e){q(e)},get hoverWidth(){return D},set hoverWidth(e){G(e)},get hover(){return T},set hover(e){U(e)},onHover:e=>(_.current.add(e),()=>{_.current.delete(e)}),get available(){return V},set available(e){Y(e)},onAvailable:e=>(Z.current.add(e),()=>{Z.current.delete(e)}),get handleColor(){return I},set handleColor(e){A(e)},get progressColor(){return B},set progressColor(e){F(e)},get railColor(){return L},set railColor(e){H(e)},get hoverColor(){return S},set hoverColor(e){X(e)},get availableColor(){return N},set availableColor(e){O(e)}}),[]);const ee=()=>{if(C.current&&R.current&&E.current){const e=C.current.valueAsNumber,t=parseFloat(C.current.max)||100,n=parseFloat(C.current.min)||0,r=(e-n)/(t-n),o=C.current.getBoundingClientRect();R.current.style.width=r*(o.width-16)+8+"px",E.current.style.transform=`translateX(${r*(o.width-16)+8}px)`}};n(()=>{ee()},[v,y,w.value]),n(()=>{if(C.current)return C.current.addEventListener("input",ee),()=>{C.current?.removeEventListener("input",ee)}},[]);const te=()=>{if(C.current&&R.current&&E.current&&W.current&&z.current&&$.current){const e=C.current.getBoundingClientRect(),t=C.current.parentElement.getBoundingClientRect(),n=C.current.offsetHeight,r=.5*(null===T?j:D);$.current.style.width=`${e.width}px`,$.current.style.top=e.top-t.top+.5*n-r+"px",$.current.style.left=e.left-t.left+"px",W.current.style.top=e.top-t.top+.5*n-r+"px",W.current.style.left=e.left-t.left+"px",z.current.style.top=e.top-t.top+.5*n-r+"px",z.current.style.left=e.left-t.left+"px",R.current.style.top=e.top-t.top+.5*n-r+"px",R.current.style.left=e.left-t.left+"px",E.current.style.top=e.top-t.top+.5*n-8+"px",E.current.style.left=e.left-t.left-8+"px",ee()}};n(()=>{te()},[T,D,j]),n(()=>{te();const e=new ResizeObserver(te);return C.current&&e.observe(C.current),window.addEventListener("resize",te),()=>{e.disconnect(),window.removeEventListener("resize",te)}},[]);const ne=C.current?.id||M.current;return e.createElement(e.Fragment,null,e.createElement("style",null,`\n /* Chrome */\n input[id=${ne}]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n background: ${I};\n width: 16px;\n height: 16px;\n border-radius: 50%;\n margin-top: -4px;\n z-index: 9999999999;\n cursor: pointer; */\n }\n\n input[id=${ne}]::-webkit-slider-runnable-track {\n -webkit-appearance: none;\n // height: 8px;\n // background: ${L};\n // border-radius: 4px;\n }\n\n /* Firefox */\n input[id=${ne}]::-moz-range-progress {\n background: #0000;\n // background: ${B};\n }\n\n input[id=${ne}]::-moz-range-track {\n background: #0000;\n // background: ${L};\n }\n \n input[id=${ne}]::-moz-range-tooltip {\n display: none;\n }\n\n /* IE */\n input[id=${ne}] {\n -ms-track-color: #0000;\n }\n\n input[id=${ne}]::-ms-fill-lower {\n background: #0000;\n // background: ${B};\n }\n\n input[id=${ne}]::-ms-fill-upper {\n background: #0000;\n // background: ${L};\n }\n `),e.createElement("input",{id:ne,...w,ref:C,type:"range",min:v,max:y,onMouseMove:e=>{const t=e.target.getBoundingClientRect(),n=(e.clientX-t.left-8)/(t.width-16);U(Math.max(0,Math.min(1,n)))},onMouseLeave:()=>U(null),style:{padding:"8px 0",position:"absolute",height:"8px",margin:0,...w.style,touchAction:"none",WebkitAppearance:"none",backgroundColor:"transparent"}}),e.createElement("div",{ref:$,style:{...u,height:(null===T?j:D)+"px",zIndex:99999,background:L,borderRadius:"4px"}}),e.createElement("div",{ref:W,style:{...u,height:(null===T?j:D)+"px",zIndex:999999,background:N}}),e.createElement("div",{ref:z,style:{...u,height:(null===T?j:D)+"px",zIndex:9999999,background:S}}),e.createElement("div",{ref:R,style:{...u,height:(null===T?j:D)+"px",zIndex:99999999,background:B}}),e.createElement("div",{ref:E,style:{pointerEvents:"none",position:"absolute",height:"16px",width:"16px",zIndex:999999999,background:I,touchAction:"none",borderRadius:"50%"}}))});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare function DateLabelWithPicker({ time, setTime, theme, ...props }: {
|
|
3
|
+
time: number;
|
|
4
|
+
setTime: (newTime: number) => void;
|
|
5
|
+
theme?: 'dark' | 'light';
|
|
6
|
+
} & React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>): JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{useEffect as t,useRef as r,useState as n}from"react";import{formatDateWithWeekDay as i}from"../common/TimeTools";import{LABEL_WITH_PICKER_HOVER_STYLE as o,LABEL_WITH_PICKER_SPAN_STYLE as a}from"./TimeLabelWithPicker";export function DateLabelWithPicker({time:c,setTime:l,theme:s,...u}){const m=r(c),p=r(null),[d,h]=n(!1);t(()=>{m.current=c},[c]),t(()=>{if(p.current){const e=()=>{const e=p.current.value,[t,r,n]=e.split("-").map(e=>parseInt(e)),i=new Date(m.current);i.setDate(n),i.setMonth(r-1),i.setFullYear(t),l(i.getTime())};return p.current.addEventListener("input",e),()=>{p.current?.removeEventListener("input",e)}}},[]);return e.createElement("div",{...u,style:{position:"relative",...u.style}},e.createElement("span",{style:d?o(s||"dark"):a(s||"dark"),onClick:()=>{if(p.current){const e=new Date(m.current),t=e.getDate().toString().padStart(2,"0"),r=(e.getMonth()+1).toString().padStart(2,"0"),n=e.getFullYear().toString().padStart(4,"0");p.current.value=n+"-"+r+"-"+t,p.current.showPicker()}},onMouseEnter:()=>h(!0),onMouseLeave:()=>h(!1)},i(c)),e.createElement("input",{type:"date",ref:p,style:{position:"absolute",left:"0px",visibility:"hidden",colorScheme:"dark"===s?"dark":"light"}}))}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TimeSliderTimeRangeArray } from '../data/TimeSliderRange';
|
|
3
|
+
export declare function DateRangeLabelWithPicker({ range, setRange, theme, ...props }: {
|
|
4
|
+
range: TimeSliderTimeRangeArray;
|
|
5
|
+
setRange: (newRange: TimeSliderTimeRangeArray) => void;
|
|
6
|
+
theme?: 'dark' | 'light';
|
|
7
|
+
} & React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>): JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{useEffect as t,useRef as n,useState as r}from"react";import a from"./YearScroller";import{LABEL_WITH_PICKER_HOVER_STYLE as l,LABEL_WITH_PICKER_SPAN_STYLE as u}from"./TimeLabelWithPicker";export function DateRangeLabelWithPicker({range:c,setRange:i,theme:s,...g}){const p=n(c),m=n(null),d=n(null),h=n(null),D=n(null),S=n(null),[f,F]=r(!1);t(()=>{p.current=c},[c]),t(()=>{if(d.current){const e=()=>{const e=new Date(p.current[0]),t=new Date(p.current[1]-1),n=d.current.value,[r,a,l]=n.split("-").map(e=>parseInt(e));e.toDateString()===t.toDateString()&&(t.setDate(l),t.setMonth(a-1),t.setFullYear(r)),e.setDate(l),e.setMonth(a-1),e.setFullYear(r),i([e.getTime(),t.getTime()+1])};d.current.addEventListener("input",e)}if(h.current){const e=()=>{const e=new Date(p.current[0]),t=new Date(p.current[1]-1),n=h.current.value,[r,a,l]=n.split("-").map(e=>parseInt(e));t.setDate(l),t.setMonth(a-1),t.setFullYear(r),i([e.getTime(),t.getTime()+1])};h.current.addEventListener("input",e)}if(D.current){const e=()=>{const e=new Date(p.current[0]),t=new Date(p.current[1]-1),n=D.current.value,[r,a]=n.split("-").map(e=>parseInt(e));t.setDate(o(a-1,r)),t.setMonth(a-1),t.setFullYear(r),e.setMonth(a-1),e.setFullYear(r),i([e.getTime(),t.getTime()+1])};D.current.addEventListener("change",e),D.current.addEventListener("input",e)}if(S.current){const e=e=>{const t=new Date(p.current[0]),n=new Date(p.current[1]-1);n.setDate(o(11,e)),n.setFullYear(e),t.setFullYear(e),i([t.getTime(),n.getTime()+1])};S.current.onSelect(e)}},[]);const w=e=>{if(m.current){const t=m.current.getBoundingClientRect(),n=(e.clientX-t.left)/t.width;F(n<=.5?"start":"end")}};return e.createElement("div",{...g,style:{position:"relative",...g.style}},e.createElement("span",{ref:m,style:f?l(s||"dark"):u(s||"dark"),onClick:e=>{if(d.current&&h.current&&D.current&&S.current&&m.current){const t=new Date(p.current[0]);if(function(e){const[t,n]=e,r=new Date(t),a=new Date(n),l=new Date(n-1);return r.getFullYear()===l.getFullYear()&&r.getMonth()===l.getMonth()&&1===r.getDate()&&1===a.getDate()}(p.current)){const e=(t.getMonth()+1).toString().padStart(2,"0"),n=t.getFullYear().toString().padStart(4,"0");D.current.value=n+"-"+e,D.current.showPicker()}else if(function(e){const[t,n]=e,r=new Date(t),a=new Date(n),l=new Date(n-1);return r.getFullYear()===l.getFullYear()&&1===r.getDate()&&1===a.getDate()&&0===r.getMonth()&&0===a.getMonth()}(p.current)){const e=t.getFullYear();S.current.value=e,S.current.show()}else{const n=new Date(p.current[1]),r=m.current.getBoundingClientRect();if((e.clientX-r.left)/r.width<=.5||t.toDateString()===n.toDateString()){const e=t.getDate().toString().padStart(2,"0"),n=(t.getMonth()+1).toString().padStart(2,"0"),r=t.getFullYear().toString().padStart(4,"0");d.current.value=r+"-"+n+"-"+e,d.current.showPicker()}else{const e=n.getDate().toString().padStart(2,"0"),t=(n.getMonth()+1).toString().padStart(2,"0"),r=n.getFullYear().toString().padStart(4,"0");h.current.value=r+"-"+t+"-"+e,h.current.focus(),h.current.showPicker()}}}},onMouseMove:w,onMouseEnter:w,onMouseLeave:()=>F(!1)},function(t,n){const[r,a]=t,l=new Date(r),u=new Date(a),o=new Date(a-1),c=l.toLocaleString("default",{month:"short"}),i=o.toLocaleString("default",{month:"short"}),s=l.getDate().toString().padStart(2,"0"),g=o.getDate().toString().padStart(2,"0"),p={color:"#888"},m="end"===n?p:void 0,d="start"===n?p:void 0;return l.getFullYear()===o.getFullYear()?l.getMonth()===o.getMonth()?l.getDate()===o.getDate()?`${g} ${i} ${o.getFullYear()}`:1===l.getDate()&&1===u.getDate()?`${i} ${o.getFullYear()}`:e.createElement(e.Fragment,null,e.createElement("span",{style:m},`${s}`),e.createElement("span",null," - "),e.createElement("span",{style:d},`${g}`),e.createElement("span",null,` ${i} ${o.getFullYear()}`)):1===l.getDate()&&1===u.getDate()&&0===l.getMonth()&&0===u.getMonth()?`${o.getFullYear()}`:e.createElement(e.Fragment,null,e.createElement("span",{style:m},`${s} ${c}`),e.createElement("span",null," - "),e.createElement("span",{style:d},`${g} ${i}`),e.createElement("span",null,` ${o.getFullYear()}`)):1===l.getDate()&&1===u.getDate()&&0===l.getMonth()&&0===u.getMonth()?` ${l.getFullYear()} - ${o.getFullYear()}`:e.createElement(e.Fragment,null,e.createElement("span",{style:m},`${s} ${c} ${l.getFullYear()}`),e.createElement("span",null," - "),e.createElement("span",{style:d},`${g} ${i} ${o.getFullYear()}`))}(c,f)),e.createElement("input",{type:"date",ref:d,style:{position:"absolute",left:"0px",visibility:"hidden",colorScheme:"dark"===s?"dark":"light"}}),e.createElement("input",{type:"date",ref:h,style:{position:"absolute",right:"0px",visibility:"hidden",colorScheme:"dark"===s?"dark":"light"}}),e.createElement("input",{type:"month",ref:D,style:{position:"absolute",right:"0px",visibility:"hidden",colorScheme:"dark"===s?"dark":"light"}}),e.createElement(a,{ref:S}))}function o(e,t){if(e<0||e>11)throw new Error("Month must be between 0 and 11");if(1===e){return t%4==0&&t%100!=0||t%400==0?29:28}return[31,28,31,30,31,30,31,31,30,31,30,31][e]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useDeepMemo<T>(factory: () => T, deps: any[], cleanup?: (value: T) => void): T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useEffect as e,useRef as r}from"react";function t(e,r){if(Object.is(e,r))return!0;if(typeof e!=typeof r)return!1;if("object"!=typeof e||null===e||null===r)return!1;if(Array.isArray(e))return!(!Array.isArray(r)||e.length!==r.length)&&e.every((e,n)=>t(e,r[n]));const n=Object.keys(e),u=Object.keys(r);return n.length===u.length&&n.every(n=>t(e[n],r[n]))}export function useDeepMemo(n,u,c){const o=r();return o.current&&t(o.current.deps,u)||(c&&o.current&&c(o.current.value),o.current={deps:u,value:n()}),e(()=>()=>{"function"==typeof c&&o.current&&c(o.current.value)},[]),o.current.value}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const FullscreenButton: () => JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{useState as l,useEffect as n}from"react";import{MaterialIconButton as t}from"./MaterialIconButton";export const FullscreenButton=()=>{const[c,u]=l(!1);return n(()=>{c?function(){const e=document.documentElement;e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}():function(){const e=document;e.exitFullscreen?document.fullscreenElement&&document.hasFocus()&&document.exitFullscreen().catch(e=>{console.warn("Failed to exit fullscreen:",e)}):e.mozCancelFullScreen?e.mozCancelFullScreen():e.webkitExitFullscreen?e.webkitExitFullscreen():e.msExitFullscreen&&e.msExitFullscreen()}()},[c]),e.createElement(e.Fragment,null,c&&e.createElement(t,{iconName:"fullscreen_exit",onClick:()=>u(!1)}),!c&&e.createElement(t,{iconName:"fullscreen",onClick:()=>u(!0)}))};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare function MaterialIconButton({ iconName, color, rotate, active, ...buttonProps }: {
|
|
3
|
+
color?: string;
|
|
4
|
+
active?: boolean;
|
|
5
|
+
iconName: string;
|
|
6
|
+
rotate?: number;
|
|
7
|
+
} & React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>): JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import o from"react";export function MaterialIconButton({iconName:t,color:e,rotate:n,active:r,...a}){const i={display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"6px",backgroundColor:r?"#780":"#0008",color:e||(r?"#000":"#fff"),fontFamily:"Roboto, sans-serif",fontWeight:500,fontSize:"12px",letterSpacing:"0.5px",padding:"2px",border:"none",borderRadius:"4px",cursor:"pointer",boxShadow:"0 2px 4px rgba(0,0,0,0.2)",transition:"background-color 0.2s, box-shadow 0.2s"},l={backgroundColor:"#df0"},s={},c={fontVariationSettings:"'FILL' 1",transform:n?`rotateZ(${n}deg)`:void 0,color:e||(r?"#000":"#fff"),fontSize:"18px",lineHeight:1},f={color:"#000"},p={color:"#df0"},[d,u]=o.useState(!1),[g,x]=o.useState(!1),b={...i,...d?l:{},...g?s:{}},m={...c,...d?f:{},...g?p:{}};return o.createElement("button",{...a,style:b,onPointerEnter:()=>u(!0),onPointerLeave:()=>{u(!1),x(!1)},onPointerDown:()=>x(!0),onPointerUp:()=>x(!1)},o.createElement("span",{className:"material-symbols-outlined",style:m},t))}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import o from"react";export function MaterialTextButton({children:e,text:t,color:n,onClick:r,active:i}){const a={height:"22px",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"6px",backgroundColor:i?"#780":"#0008",color:n||(i?"#000":"#fff"),fontFamily:"Roboto, sans-serif",fontWeight:500,fontSize:"12px",letterSpacing:"0.5px",padding:"2px 4px",border:"none",borderRadius:"4px",cursor:"pointer",boxShadow:"0 2px 4px rgba(0,0,0,0.2)",transition:"background-color 0.2s, box-shadow 0.2s"},l={backgroundColor:"#df0"},s={},c={fontSize:"14px",lineHeight:1},p={color:"#000"},u={color:"#df0"},[x,d]=o.useState(!1),[f,g]=o.useState(!1),b={...a,...x?l:{},...f?s:{}},h={...c,...x?p:{},...f?u:{}};return o.createElement("button",{onClick:r,style:b,onMouseEnter:()=>d(!0),onMouseLeave:()=>{d(!1),g(!1)},onMouseDown:()=>g(!0),onMouseUp:()=>g(!1)},e,o.createElement("span",{style:h},t))}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A custom React hook to add pinch-to-zoom functionality to an element.
|
|
3
|
+
* @returns A tuple containing the ref to attach to the target element and the style object.
|
|
4
|
+
*/
|
|
5
|
+
export declare function usePinchZoom<T extends HTMLElement>(): [
|
|
6
|
+
React.RefObject<T | null>,
|
|
7
|
+
{
|
|
8
|
+
transform: string;
|
|
9
|
+
}
|
|
10
|
+
];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useRef as e,useEffect as t,useState as n,useCallback as c}from"react";const r=(e,t)=>Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)),s=(e,t)=>({x:(e.x+t.x)/2,y:(e.y+t.y)/2});export function usePinchZoom(){const u=e(null),[o,l]=n({scale:1,x:0,y:0}),a=e(0),h=e(1),i=e(null),v=c(e=>{if(2===e.touches.length&&u.current){e.preventDefault();const t={x:e.touches[0].clientX,y:e.touches[0].clientY},n={x:e.touches[1].clientX,y:e.touches[1].clientY};a.current=r(t,n),h.current=o.scale,i.current=s(t,n)}},[o.scale]),x=c(e=>{if(2===e.touches.length&&a.current>0&&u.current){e.preventDefault();const t={x:e.touches[0].clientX,y:e.touches[0].clientY},n={x:e.touches[1].clientX,y:e.touches[1].clientY},c=r(t,n)/a.current*h.current,u=s(t,n),o=u.x-(i.current?.x??0),v=u.y-(i.current?.y??0);l({scale:c,x:o,y:v})}},[]),y=c(()=>{a.current=0,i.current=null},[]);t(()=>{const e=u.current;if(e)return e.addEventListener("touchstart",v,{passive:!1}),e.addEventListener("touchmove",x,{passive:!1}),e.addEventListener("touchend",y),e.addEventListener("touchcancel",y),()=>{e.removeEventListener("touchstart",v),e.removeEventListener("touchmove",x),e.removeEventListener("touchend",y),e.removeEventListener("touchcancel",y)}},[v,x,y]);const d={transform:`translate(${o.x}px, ${o.y}px) scale(${o.scale})`};return[u,d]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useRef as r,useCallback as m}from"react";
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TimeSlider, TimeSliderOptions } from '../engine/TimeSlider';
|
|
3
|
+
import { TimeSliderEngine } from '../engine/TimeSliderEngine';
|
|
4
|
+
import { TimeSliderLayer } from '../layer/TimeSliderLayer';
|
|
5
|
+
import { TimeSliderLayerLoader } from '../layer/TimeSliderLayerLoader';
|
|
6
|
+
export type CurrentSliderProps = {
|
|
7
|
+
railWidth?: number;
|
|
8
|
+
hoverWidth?: number;
|
|
9
|
+
handleColor?: string;
|
|
10
|
+
progressColor?: string;
|
|
11
|
+
railColor?: string;
|
|
12
|
+
hoverColor?: string;
|
|
13
|
+
availableColor?: string;
|
|
14
|
+
};
|
|
15
|
+
export type ReactTimeSliderProps = TimeSliderOptions & {
|
|
16
|
+
showStats?: boolean;
|
|
17
|
+
timeRange?: [startTime: number, endTime: number];
|
|
18
|
+
onTimeRange?: (newRange: [startTime: number, endTime: number]) => void;
|
|
19
|
+
engine: TimeSliderEngine<any>;
|
|
20
|
+
layers: TimeSliderLayer[];
|
|
21
|
+
loaders?: TimeSliderLayerLoader<any>[];
|
|
22
|
+
verticalGap?: number;
|
|
23
|
+
noPlayButton?: boolean;
|
|
24
|
+
selectRangeButton?: boolean;
|
|
25
|
+
noTimeLabels?: boolean;
|
|
26
|
+
noRangeLabel?: boolean;
|
|
27
|
+
noDateLabels?: boolean;
|
|
28
|
+
canHideLabels?: boolean;
|
|
29
|
+
theme?: 'dark' | 'light';
|
|
30
|
+
currentSlider?: CurrentSliderProps;
|
|
31
|
+
};
|
|
32
|
+
export type ReactTimeSliderRef = {
|
|
33
|
+
timeSlider: TimeSlider;
|
|
34
|
+
};
|
|
35
|
+
export declare const ReactTimeSlider: React.ForwardRefExoticComponent<TimeSliderOptions & {
|
|
36
|
+
showStats?: boolean;
|
|
37
|
+
timeRange?: [startTime: number, endTime: number];
|
|
38
|
+
onTimeRange?: (newRange: [startTime: number, endTime: number]) => void;
|
|
39
|
+
engine: TimeSliderEngine<any>;
|
|
40
|
+
layers: TimeSliderLayer[];
|
|
41
|
+
loaders?: TimeSliderLayerLoader<any>[];
|
|
42
|
+
verticalGap?: number;
|
|
43
|
+
noPlayButton?: boolean;
|
|
44
|
+
selectRangeButton?: boolean;
|
|
45
|
+
noTimeLabels?: boolean;
|
|
46
|
+
noRangeLabel?: boolean;
|
|
47
|
+
noDateLabels?: boolean;
|
|
48
|
+
canHideLabels?: boolean;
|
|
49
|
+
theme?: "dark" | "light";
|
|
50
|
+
currentSlider?: CurrentSliderProps;
|
|
51
|
+
} & React.RefAttributes<ReactTimeSliderRef>>;
|
|
52
|
+
export declare function useMaterialIcons(style?: 'outlined' | 'sharp' | 'rounded' | 'two-tone' | 'filled'): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{forwardRef as t,useCallback as n,useEffect as r,useImperativeHandle as i,useLayoutEffect as a,useMemo as o,useRef as l,useState as s}from"react";import{Disposables as c}from"../common/Disposables";import{formatDuration as m}from"../common/TimeTools";import{TimeSlider as d}from"../engine/TimeSlider";import{ONE_YEAR as p}from"../ticks/TimeSliderConstants";import{ColoredSlider as u}from"./ColoredSlider";import{DateLabelWithPicker as h}from"./DateLabelWithPicker";import{DateRangeLabelWithPicker as g}from"./DateRangeLabelWithPicker";import{MaterialIconButton as f}from"./MaterialIconButton";import{MaterialTextButton as x}from"./MaterialTextButton";import{TimeLabelWithPicker as w}from"./TimeLabelWithPicker";const y={padding:"4px 8px",background:"#0008",borderRadius:"4px",color:"#fff",fontFamily:"monospace",fontSize:"12px"},v=[Date.now()-p,Date.now()];function E(e,t){return e[0]===t[0]&&e[1]===t[1]}function b(e){return JSON.stringify(e)}export const ReactTimeSlider=t(({timeRange:t,onTimeRange:n,selectRangeButton:a,noPlayButton:p,noTimeLabels:C,noRangeLabel:k,noDateLabels:R,theme:L,canHideLabels:S,verticalGap:N,engine:I,layers:_,loaders:D,showStats:z,currentSlider:M,...B},P)=>{const W=o(()=>new d(B),[]);r(()=>{B?.showCurrent&&(W.showCurrent=B?.showCurrent)},[B.showCurrent]),r(()=>{B?.showTicks&&(W.showTicks=B?.showTicks)},[B.showTicks]),r(()=>{B?.playSpeed&&(W.playSpeed=B?.playSpeed)},[B.playSpeed]),r(()=>{B?.liveRange&&(W.liveRange=B?.liveRange)},[B.liveRange]);const F=N||4,G=22+F+8+"px",H=22+F+22+F+8+"px",O=l(null),X=l(null),A=l(null),[J,U]=s(!1),[V,Y]=s(!1),[$,j]=s(!1),[q,K]=s(!1),[Q,Z]=s(!1),[ee,te]=s(Date.now()),ne=l(null);useMaterialIcons();const[re,ie]=s(t||v),ae=l(t||v),oe=void 0!==t,le=l(new Set),[se,ce]=s(!1);r(()=>{if(oe){const e=b(t);if(J&&!E(t,ae.current)&&!le.current.has(e)){ae.current=t;const[e,n]=t;W.setTimeRange({startTime:e,endTime:n})}le.current.delete(e)}},[J,t,oe]),r(()=>{const e=new c;return e.add(W.on("time",e=>{const{startTime:t,endTime:r}=e,i=[t,r];E(i,ae.current)||(ae.current=i,le.current.add(b(i)),ie(i),n?.(i))})),e.disposeLater()},[W]),r(()=>{U(!1);const e=new c;return W.init(X.current).then(()=>U(!0)),e.add(W.on("time",e=>{if(e.startTime!==ae.current[0]||e.endTime!==ae.current[1]){const{startTime:t,endTime:r}=e,i=[t,r];ae.current=i,ie(i),n?.(i)}})),e.add(W.on("playing",Y)),e.add(W.on("live",j)),e.add(W.on("current",te)),e.disposeLater()},[W]),r(()=>{D?.forEach(e=>W.addLayerLoader(e))},[D]),r(()=>{"boolean"==typeof B.showCurrent&&(W.showCurrent=B.showCurrent)},[B.showCurrent]),i(P,()=>({get timeSlider(){return W}})),r(()=>{if(B.showCurrent){const e=setInterval(()=>{A.current&&(A.current.available=Date.now())},10);return()=>clearInterval(e)}},[B.showCurrent]),r(()=>{J&&W.showStats(!0===z)},[J,z]),r(()=>{},[J]),r(()=>{J&&W.setEngine(I)},[J,I]),r(()=>{if(J){const e=new Set,t=new Set;W.getLayers().forEach(e=>t.add(e.id)),_.forEach(n=>{t.delete(n.id),e.add(n.id)}),W.getLayers().forEach(t=>e.delete(t.id));const n=_.filter(t=>e.has(t.id)),r=W.getLayers().filter(e=>t.has(e.id));r.length===W.getLayers().length&&n.length>0&&W.setTimeRange(n[0].model.getTimeRange()),r.forEach(e=>W.removeLayer(e)),n.forEach(e=>W.addLayer(e))}},[J,_]);r(()=>{const e=e=>{ne.current&&e.target&&e.target.parentElement?.getAttribute("layerpanelbutton")!==W.id&&!ne.current.contains(e.target)&&Z(!1)};if(Q)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[Q]);const me=e=>{const t=W.current,{duration:n,startTime:r}=W.getTimeRange(),i=(t-r)/n;i>1||i<0?W.setTimeRange({startTime:e-.5*n,endTime:e+.5*n}):W.setTimeRange({startTime:e-i*n,endTime:e+(1-i)*n}),W.setCurrent(e)};r(()=>{const e=()=>{if(O.current){let e=560;B.showCurrent&&(e+=160),p&&(e-=30),k&&(e-=160),C&&(e-=140),R&&(e-=185);const t=O.current.getBoundingClientRect().width;K(t<e)}};e();const t=new ResizeObserver(e);return O.current&&t.observe(O.current),window.addEventListener("resize",e),()=>{t.disconnect(),window.removeEventListener("resize",e)}},[B.showCurrent,p,k,C,R]);let de=42;B.showCurrent&&(de+=4),q&&!S&&(de+=26);const pe="dark"===L;return r(()=>{L&&W.setTheme(L)},[L]),e.createElement("div",{ref:O,style:{display:"block",position:"relative",borderRadius:"inherit",background:pe?"#222":"#ddd",width:"100%",height:"100%",padding:"8px",boxSizing:"border-box"}},Q&&e.createElement("div",{ref:ne,style:{position:"absolute",top:G,left:"8px",maxWidth:"200px",display:"flex",gap:"8px",alignItems:"center",paddingRight:"8px",paddingBottom:"8px",paddingTop:"8px",flexDirection:"column",zIndex:1e3,background:pe?"#222":"#ddd"}},W.getLayers().map(t=>e.createElement(T,{key:t.id,layer:t,timeSlider:W,isDarkMode:pe}))),e.createElement("div",{style:{position:"absolute",top:"8px",left:"8px",display:"flex",gap:"8px",alignItems:"center"}},e.createElement(f,{layerpanelbutton:W.id,iconName:"layers",onClick:e=>Z(e=>!e)}),e.createElement(f,{iconName:"skip_previous",onClick:()=>W.up({animate:1e3}),rotate:90}),!q&&!k&&e.createElement("span",{style:{...y}},m(re)),e.createElement(f,{iconName:"arrow_range",onClick:()=>W.fit({animate:3e3})}),a&&e.createElement(f,{iconName:"ink_selection",active:se,onClick:()=>{ce(!0),W.startSelectingRange(()=>ce(!1))}})),q&&!S&&B.showCurrent&&!k&&e.createElement("div",{style:{position:"absolute",top:G,left:"8px",display:"flex",gap:"8px",height:"22px"}},e.createElement("span",{style:{...y}},m(re))),q&&!S&&!B.showCurrent&&!k&&e.createElement("div",{style:{position:"absolute",top:"8px",left:"50%",transform:"translateX(-50%)",display:"flex",gap:"8px",height:"22px"}},e.createElement("span",{style:{...y}},m(re))),(!q||!S)&&e.createElement("div",{style:{position:"absolute",top:q?G:"8px",right:q?"8px":"50%",transform:q?void 0:"translateX(50%)",padding:0,display:"flex",gap:"8px",height:"22px",width:!q||B.showCurrent?void 0:"calc(100% - 16px)"}},!B.showCurrent&&(!C||!C)&&e.createElement(e.Fragment,null,!C&&e.createElement(w,{theme:L,time:re[0],setTime:e=>W.setTimeRange({startTime:e})}),q&&!C&&!R&&!B.showCurrent&&e.createElement("div",{style:{flexGrow:1}}),!R&&e.createElement(g,{theme:L,range:[re[0],re[1]],setRange:e=>W.setTimeRange({startTime:e[0],endTime:e[1]})}),q&&!C&&!R&&!B.showCurrent&&e.createElement("div",{style:{flexGrow:1}}),!C&&e.createElement(w,{theme:L,time:re[1]-1,setTime:e=>W.setTimeRange({endTime:e+1})})),B.showCurrent&&e.createElement(e.Fragment,null,!R&&e.createElement(h,{theme:L,time:ee,setTime:me}),!C&&e.createElement(w,{theme:L,time:ee,setTime:me}))),e.createElement("div",{style:{position:"absolute",top:"8px",right:"8px",display:"flex",gap:"8px",alignItems:"center"}},B.showCurrent&&e.createElement(e.Fragment,null,e.createElement(x,{text:"Live",onClick:()=>{W.live?W.pause():W.setLive(!0)},color:$?"#fff":pe?"#888":"#bbb"},e.createElement("span",{className:"material-symbols-outlined",style:{fontSize:"18px",zIndex:1,lineHeight:1}},"radio_button_unchecked"),$&&e.createElement("span",{className:"material-symbols-outlined",style:{fontSize:"18px",lineHeight:1,marginLeft:"-24px",color:"red"}},"radio_button_checked"))),e.createElement(f,{iconName:"skip_previous",onClick:()=>W.previous({animate:1e3})}),!p&&!V&&e.createElement(f,{iconName:"play_arrow",onClick:()=>W.play()}),!p&&V&&e.createElement(f,{iconName:"pause",onClick:()=>W.pause()}),e.createElement(f,{iconName:"skip_next",onClick:()=>W.next({animate:1e3})})),B.showCurrent&&e.createElement(u,{ref:A,value:ee,min:re[0],max:re[1],onValue:e=>{W.pause(),W.setCurrent(e)},onPointerMove:e=>W.updateHover({x:e.clientX,y:e.clientY}),onPointerLeave:()=>W.updateHover(null),matchWidth:!0,style:{width:"calc(100% - 16px)",left:"8px",position:"absolute",bottom:"26px",zIndex:1},...M}),e.createElement("div",{ref:X,style:{position:"absolute",top:q&&!S?H:G,left:"8px",borderRadius:"inherit",width:"calc(100% - 16px)",height:`calc(100% - ${de}px)`,background:pe?"#111":"#eee",overflow:"hidden"}}))});function T({layer:t,timeSlider:n,isDarkMode:i}){const[a,o]=s(t.visible);return r(()=>{t.on("visible",e=>o(e))},[]),e.createElement("div",{style:{display:"flex",gap:"8px",alignItems:"center",background:i?"#222":"#ddd",borderRadius:"4px",width:"100%"}},a&&e.createElement(f,{iconName:"visibility",onClick:()=>t.visible=!1}),!a&&e.createElement(f,{iconName:"visibility_off",color:"#888",onClick:()=>t.visible=!0}),e.createElement("span",{style:{...y,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flexGrow:1,minWidth:0}},t.name||t.constructor.name+"#"+t.id.slice(t.id.length-4).toUpperCase()),e.createElement(f,{iconName:"center_focus_weak",onClick:()=>n.fit({animate:3e3,range:t.model.getTimeRange()})}))}export function useMaterialIcons(e="outlined"){r(()=>{const e=document.createElement("link");return e.rel="stylesheet",e.href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200",document.head.appendChild(e),()=>{document.head.removeChild(e)}},[e])}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React, { CSSProperties } from 'react';
|
|
2
|
+
export declare const LABEL_WITH_PICKER_SPAN_STYLE: (theme: 'dark' | 'light') => CSSProperties;
|
|
3
|
+
export declare const LABEL_WITH_PICKER_HOVER_STYLE: (theme: 'dark' | 'light') => CSSProperties;
|
|
4
|
+
export declare function TimeLabelWithPicker({ time, setTime, theme, ...props }: {
|
|
5
|
+
time: number;
|
|
6
|
+
setTime: (newTime: number) => void;
|
|
7
|
+
theme?: 'dark' | 'light';
|
|
8
|
+
} & React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>): JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{useEffect as t,useRef as o,useState as r}from"react";import{formatTime as n}from"../common/TimeTools";export const LABEL_WITH_PICKER_SPAN_STYLE=e=>({padding:"4px 8px",background:"#0008",borderRadius:"4px",color:"#fff",fontFamily:"monospace",fontSize:"12px",cursor:"pointer"});export const LABEL_WITH_PICKER_HOVER_STYLE=e=>({padding:"4px 8px",background:"#0008",borderRadius:"4px",color:"#fff",fontFamily:"monospace",fontSize:"12px",cursor:"pointer",background:"#df0",color:"#000",fontWeight:"bold"});export function TimeLabelWithPicker({time:i,setTime:c,theme:p,...a}){const s=o(i),u=o(null),[d,l]=r(!1);t(()=>{s.current=i},[i]),t(()=>{if(u.current){const e=()=>{const e=u.current.value,[t,o,r]=e.split(":").map(e=>parseInt(e)),n=new Date(s.current);n.setHours(t),n.setMinutes(o),n.setSeconds(r),c(n.getTime())};return u.current.addEventListener("input",e),()=>{u.current?.removeEventListener("input",e)}}},[]);return e.createElement("div",{...a,style:{position:"relative",...a.style}},e.createElement("span",{style:d?{padding:"4px 8px",background:"#0008",borderRadius:"4px",color:"#fff",fontFamily:"monospace",fontSize:"12px",cursor:"pointer",background:"#df0",color:"#000",fontWeight:"bold"}:{padding:"4px 8px",background:"#0008",borderRadius:"4px",color:"#fff",fontFamily:"monospace",fontSize:"12px",cursor:"pointer"},onClick:()=>{if(u.current){const e=new Date(s.current),t=e.getHours().toString().padStart(2,"0"),o=e.getMinutes().toString().padStart(2,"0"),r=e.getSeconds().toString().padStart(2,"0");u.current.value=t+":"+o+":"+r,u.current.showPicker()}},onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1)},n(i)),e.createElement("input",{ref:u,step:1,type:"time",style:{position:"absolute",left:"0px",visibility:"hidden",colorScheme:"dark"===p?"dark":"light"}}))}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React, { CSSProperties } from "react";
|
|
2
|
+
export type YearScrollerRef = {
|
|
3
|
+
value: number;
|
|
4
|
+
show: () => void;
|
|
5
|
+
hide: () => void;
|
|
6
|
+
onSelect: (callback: (year: number) => void) => void;
|
|
7
|
+
};
|
|
8
|
+
type Props = {
|
|
9
|
+
initialYear?: number;
|
|
10
|
+
style?: CSSProperties;
|
|
11
|
+
};
|
|
12
|
+
declare const YearScroller: React.ForwardRefExoticComponent<Props & React.RefAttributes<YearScrollerRef>>;
|
|
13
|
+
export default YearScroller;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{forwardRef as t,useEffect as n,useImperativeHandle as o,useRef as r,useState as l}from"react";import{createPortal as c}from"react-dom";function i(e,t,n){const o=e-(t||50),r=e+(n||50);return Array.from({length:r-o+1},(e,t)=>o+t)}const s=(new Date).getFullYear(),d=t(({initialYear:t,style:d},a)=>{const u=r(null),p=r(null),[f,m]=l({top:0,left:0}),[g,y]=l(t||s),[h,x]=l(t||s),[v,b]=l(i(t||s)),[E,k]=l(!1),[w,C]=l(0),I=r(()=>{});o(a,()=>({get value(){return g},set value(e){y(e)},show:()=>{if(p.current){const e=p.current.getBoundingClientRect();m({top:e.top-60,left:e.left}),k(!0)}},hide:()=>k(!1),onSelect:e=>{I.current=e}})),n(()=>{const e=e=>{if(u.current){const{left:t,top:n,right:o,bottom:r}=u.current.getBoundingClientRect(),{clientX:l,clientY:c}=e;(l<t||l>o||c<n||c>r)&&k(!1)}};return document.body.addEventListener("pointerdown",e),()=>{document.body.removeEventListener("pointerdown",e)}},[]),n(()=>{const e=i(g);C(0),b(e)},[E,g]),n(()=>{if(E&&u.current){let e=0;w>0&&(e=-48),w<0&&(e=48),u.current.scrollTop=1152-w+e}},[E,g,v,w]);const T=document.getElementById("year-scroller-root")||(()=>{const e=document.createElement("div");return e.id="year-scroller-root",document.body.appendChild(e),e})();return e.createElement(e.Fragment,null,e.createElement("div",{ref:p,style:{display:"inline-block"}}),E&&c(e.createElement("div",{ref:u,onMouseLeave:()=>x(g),onScroll:()=>{const e=u.current;if(e)if(e.scrollTop<120){const t=i(v[0]);C(-e.scrollTop),b(t)}else if(e.scrollHeight-e.scrollTop-e.clientHeight<120){const t=i(v[v.length-1]);C(e.scrollHeight-e.scrollTop-e.clientHeight),b(t)}},style:{display:"flex",alignItems:"center",flexDirection:"column",zIndex:1e3,background:"#222",colorScheme:"dark",position:"fixed",top:f.top,left:f.left,width:"72px",height:"120px",overflowY:"auto",fontFamily:"sans-serif",borderRadius:"4px",justifyItems:"center",...d}},v.map(t=>e.createElement("div",{style:{alignItems:"center",background:"#222",padding:"2px 4px",width:"calc(100% - 8px)"},onMouseEnter:()=>x(t),onClick:()=>(e=>{y(e),x(e),I.current?.(e),k(!1)})(t)},e.createElement("span",{key:t,style:{padding:"4px 8px",borderRadius:"4px",fontFamily:"monospace",fontSize:"12px",height:"12px",display:"flex",alignItems:"center",justifyContent:"center",color:t===g||t===h?"#000":"#ddd",backgroundColor:t===h?"#df0":t===g?"#780":"#111",cursor:"pointer"}},t)))),T))});export default d;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const MAGNITUDE_COLORS: string[];
|
|
2
|
+
export declare function getMagnitudeColors(): string[];
|
|
3
|
+
export declare function getUltraFadedMagnitudeColors(): string[];
|
|
4
|
+
export declare function getVeryFadedMagnitudeColors(): string[];
|
|
5
|
+
export declare function getFadedMagnitudeColors(): string[];
|
|
6
|
+
export declare function getMagnitudeColors2(): string[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MAGNITUDE_COLORS=[...getMagnitudeColors(),...getUltraFadedMagnitudeColors()];export function getMagnitudeColors(){return["#a0f","#0af","#0ff","#0fa","#af0","#ff0","#fa0","#f00","#f0a","#f0f"]}export function getUltraFadedMagnitudeColors(){return["#edf","#def","#dff","#dfe","#efd","#ffd","#fed","#fdd","#fde","#fdf"]}export function getVeryFadedMagnitudeColors(){return["#dbf","#bdf","#bff","#bfd","#dfb","#ffb","#fdb","#fbb","#fbd","#fbf"]}export function getFadedMagnitudeColors(){return["#b7f","#7bf","#7ff","#7fb","#bf7","#ff7","#fb7","#f77","#f7b","#f7f"]}export function getMagnitudeColors2(){return["#00b","#00f","#04f","#07f","#0bf","#0ff","#4ff","#7ff","#bff","#fff"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { TimeSliderStyle } from "./TimeSliderStyle";
|
|
2
|
+
export type TimeSliderIntervalsStyle = TimeSliderStyle & {
|
|
3
|
+
fill?: {
|
|
4
|
+
color?: string;
|
|
5
|
+
opacity?: number;
|
|
6
|
+
};
|
|
7
|
+
border?: {
|
|
8
|
+
centered?: boolean;
|
|
9
|
+
color?: string;
|
|
10
|
+
opacity?: number;
|
|
11
|
+
width?: number;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|