@netless/telebox-insider 0.2.5 → 0.2.9
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/dist/TeleBox/constants.d.ts +7 -0
- package/dist/TeleBox/index.d.ts +5 -2
- package/dist/TeleBox/typings.d.ts +8 -1
- package/dist/TeleBoxCollector/index.d.ts +5 -1
- package/dist/TeleBoxManager/MaxTitleBar/index.d.ts +3 -0
- package/dist/TeleBoxManager/constants.d.ts +3 -1
- package/dist/TeleBoxManager/index.d.ts +5 -1
- package/dist/TeleBoxManager/typings.d.ts +4 -1
- package/dist/style.css +1 -1
- package/dist/telebox-insider.cjs.js +2 -2
- package/dist/telebox-insider.cjs.js.map +1 -1
- package/dist/telebox-insider.es.js +2 -2
- package/dist/telebox-insider.es.js.map +1 -1
- package/package.json +2 -2
- package/src/TeleBox/constants.ts +8 -0
- package/src/TeleBox/index.ts +71 -0
- package/src/TeleBox/style.scss +10 -0
- package/src/TeleBox/typings.ts +9 -0
- package/src/TeleBoxCollector/index.ts +34 -8
- package/src/TeleBoxCollector/style.scss +11 -5
- package/src/TeleBoxManager/MaxTitleBar/index.ts +25 -0
- package/src/TeleBoxManager/MaxTitleBar/style.scss +18 -0
- package/src/TeleBoxManager/constants.ts +2 -0
- package/src/TeleBoxManager/index.ts +69 -9
- package/src/TeleBoxManager/typings.ts +4 -0
- package/src/TeleBoxReact/index.tsx +18 -0
- package/src/TeleTitleBar/DefaultTitleBar/style.scss +14 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@netless/telebox-insider",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Window widget for Whiteboard",
|
|
6
6
|
"license": "MIT",
|
|
@@ -75,6 +75,6 @@
|
|
|
75
75
|
"shallowequal": "^1.1.0",
|
|
76
76
|
"side-effect-manager": "^0.1.5",
|
|
77
77
|
"stylefire": "^7.0.3",
|
|
78
|
-
"value-enhancer": "^0.0.
|
|
78
|
+
"value-enhancer": "^0.0.8"
|
|
79
79
|
}
|
|
80
80
|
}
|
package/src/TeleBox/constants.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
export enum TELE_BOX_COLOR_SCHEME {
|
|
2
|
+
Light = "light",
|
|
3
|
+
Dark = "dark",
|
|
4
|
+
Auto = "auto",
|
|
5
|
+
}
|
|
6
|
+
|
|
1
7
|
export enum TELE_BOX_STATE {
|
|
2
8
|
Normal = "normal",
|
|
3
9
|
Minimized = "minimized",
|
|
@@ -5,6 +11,8 @@ export enum TELE_BOX_STATE {
|
|
|
5
11
|
}
|
|
6
12
|
|
|
7
13
|
export enum TELE_BOX_EVENT {
|
|
14
|
+
DarkMode = "dark_mode",
|
|
15
|
+
PrefersColorScheme = "prefers_color_scheme",
|
|
8
16
|
Close = "close",
|
|
9
17
|
Focus = "focus",
|
|
10
18
|
Blur = "blur",
|
package/src/TeleBox/index.ts
CHANGED
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
TELE_BOX_STATE,
|
|
27
27
|
TELE_BOX_RESIZE_HANDLE,
|
|
28
28
|
TELE_BOX_DELEGATE_EVENT,
|
|
29
|
+
TELE_BOX_COLOR_SCHEME,
|
|
29
30
|
} from "./constants";
|
|
30
31
|
import type {
|
|
31
32
|
TeleBoxConfig,
|
|
@@ -36,12 +37,15 @@ import type {
|
|
|
36
37
|
TeleBoxDelegateEvents,
|
|
37
38
|
TeleBoxCoord,
|
|
38
39
|
TeleBoxSize,
|
|
40
|
+
TeleBoxColorScheme,
|
|
39
41
|
} from "./typings";
|
|
40
42
|
|
|
41
43
|
export * from "./constants";
|
|
42
44
|
export * from "./typings";
|
|
43
45
|
|
|
44
46
|
type ValConfig = {
|
|
47
|
+
prefersColorScheme: Val<TeleBoxColorScheme, boolean>;
|
|
48
|
+
darkMode: Val<boolean, boolean>;
|
|
45
49
|
containerRect: Val<TeleBoxRect, boolean>;
|
|
46
50
|
collectorRect: Val<TeleBoxRect | undefined, boolean>;
|
|
47
51
|
/** Box title. Default empty. */
|
|
@@ -74,6 +78,8 @@ export class TeleBox {
|
|
|
74
78
|
public constructor({
|
|
75
79
|
id = genUniqueKey(),
|
|
76
80
|
title = getBoxDefaultName(),
|
|
81
|
+
prefersColorScheme = TELE_BOX_COLOR_SCHEME.Light,
|
|
82
|
+
darkMode,
|
|
77
83
|
visible = true,
|
|
78
84
|
width = 0.5,
|
|
79
85
|
height = 0.5,
|
|
@@ -112,6 +118,58 @@ export class TeleBox {
|
|
|
112
118
|
this.events = new EventEmitter();
|
|
113
119
|
this._delegateEvents = new EventEmitter();
|
|
114
120
|
|
|
121
|
+
const prefersColorScheme$ = createVal<TeleBoxColorScheme, boolean>(
|
|
122
|
+
prefersColorScheme
|
|
123
|
+
);
|
|
124
|
+
prefersColorScheme$.reaction((prefersColorScheme, _, skipUpdate) => {
|
|
125
|
+
if (!skipUpdate) {
|
|
126
|
+
this.events.emit(
|
|
127
|
+
TELE_BOX_EVENT.PrefersColorScheme,
|
|
128
|
+
prefersColorScheme
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const darkMode$ = createVal(Boolean(darkMode));
|
|
134
|
+
|
|
135
|
+
if (darkMode == null) {
|
|
136
|
+
prefersColorScheme$.subscribe(
|
|
137
|
+
(prefersColorScheme, _, skipUpdate) => {
|
|
138
|
+
this._sideEffect.add(() => {
|
|
139
|
+
if (prefersColorScheme === "auto") {
|
|
140
|
+
const prefersDark = window.matchMedia(
|
|
141
|
+
"(prefers-color-scheme: dark)"
|
|
142
|
+
);
|
|
143
|
+
darkMode$.setValue(prefersDark.matches, skipUpdate);
|
|
144
|
+
const handler = (
|
|
145
|
+
evt: MediaQueryListEvent
|
|
146
|
+
): void => {
|
|
147
|
+
darkMode$.setValue(evt.matches, skipUpdate);
|
|
148
|
+
};
|
|
149
|
+
prefersDark.addEventListener("change", handler);
|
|
150
|
+
return () =>
|
|
151
|
+
prefersDark.removeEventListener(
|
|
152
|
+
"change",
|
|
153
|
+
handler
|
|
154
|
+
);
|
|
155
|
+
} else {
|
|
156
|
+
darkMode$.setValue(
|
|
157
|
+
prefersColorScheme === "dark",
|
|
158
|
+
skipUpdate
|
|
159
|
+
);
|
|
160
|
+
return () => {};
|
|
161
|
+
}
|
|
162
|
+
}, "prefers-color-scheme");
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
darkMode$.reaction((darkMode, _, skipUpdate) => {
|
|
168
|
+
if (!skipUpdate) {
|
|
169
|
+
this.events.emit(TELE_BOX_EVENT.DarkMode, darkMode);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
115
173
|
const containerRect$ = createVal(containerRect, shallowequal);
|
|
116
174
|
const collectorRect$ = createVal(collectorRect, shallowequal);
|
|
117
175
|
|
|
@@ -354,6 +412,8 @@ export class TeleBox {
|
|
|
354
412
|
const $userStyles$ = createVal(styles);
|
|
355
413
|
|
|
356
414
|
const valConfig: ValConfig = {
|
|
415
|
+
prefersColorScheme: prefersColorScheme$,
|
|
416
|
+
darkMode: darkMode$,
|
|
357
417
|
containerRect: containerRect$,
|
|
358
418
|
collectorRect: collectorRect$,
|
|
359
419
|
title: title$,
|
|
@@ -417,6 +477,10 @@ export class TeleBox {
|
|
|
417
477
|
public _coord$: Val<TeleBoxCoord, boolean>;
|
|
418
478
|
public _intrinsicCoord$: Val<TeleBoxCoord, boolean>;
|
|
419
479
|
|
|
480
|
+
public get darkMode(): boolean {
|
|
481
|
+
return this._darkMode$.value;
|
|
482
|
+
}
|
|
483
|
+
|
|
420
484
|
public _state$: Val<TeleBoxState, boolean>;
|
|
421
485
|
|
|
422
486
|
public get state(): TeleBoxState {
|
|
@@ -735,6 +799,13 @@ export class TeleBox {
|
|
|
735
799
|
bindClassName(this.$box, this._draggable$, "no-drag", isFalsy);
|
|
736
800
|
bindClassName(this.$box, this._resizable$, "no-resize", isFalsy);
|
|
737
801
|
bindClassName(this.$box, this._focus$, "blur", isFalsy);
|
|
802
|
+
bindClassName(this.$box, this._darkMode$, "color-scheme-dark");
|
|
803
|
+
bindClassName(
|
|
804
|
+
this.$box,
|
|
805
|
+
this._darkMode$,
|
|
806
|
+
"color-scheme-light",
|
|
807
|
+
isFalsy
|
|
808
|
+
);
|
|
738
809
|
|
|
739
810
|
this._renderSideEffect.add(() => {
|
|
740
811
|
const minimizedClassName = this.wrapClassName("minimized");
|
package/src/TeleBox/style.scss
CHANGED
package/src/TeleBox/typings.ts
CHANGED
|
@@ -6,8 +6,11 @@ import type {
|
|
|
6
6
|
TELE_BOX_DELEGATE_EVENT,
|
|
7
7
|
TELE_BOX_RESIZE_HANDLE,
|
|
8
8
|
TELE_BOX_STATE,
|
|
9
|
+
TELE_BOX_COLOR_SCHEME,
|
|
9
10
|
} from "./constants";
|
|
10
11
|
|
|
12
|
+
export type TeleBoxColorScheme = `${TELE_BOX_COLOR_SCHEME}`;
|
|
13
|
+
|
|
11
14
|
export type TeleBoxCoord = { x: number; y: number };
|
|
12
15
|
|
|
13
16
|
export type TeleBoxSize = { width: number; height: number };
|
|
@@ -26,6 +29,10 @@ export interface TeleBoxConfig {
|
|
|
26
29
|
readonly id?: string;
|
|
27
30
|
/** Box title. Default empty. */
|
|
28
31
|
readonly title?: string;
|
|
32
|
+
/** Prefers Box color scheme. Default light. */
|
|
33
|
+
readonly prefersColorScheme?: TeleBoxColorScheme;
|
|
34
|
+
/** Actual Box Dark Mode */
|
|
35
|
+
readonly darkMode?: boolean;
|
|
29
36
|
/** Box visible. Default true. */
|
|
30
37
|
readonly visible?: boolean;
|
|
31
38
|
/** Box width relative to root element. 0~1. Default 0.5. */
|
|
@@ -79,6 +86,8 @@ export interface TeleBoxConfig {
|
|
|
79
86
|
type CheckTeleBoxConfig<T extends Record<`${TELE_BOX_EVENT}`, any>> = T;
|
|
80
87
|
|
|
81
88
|
export type TeleBoxEventConfig = CheckTeleBoxConfig<{
|
|
89
|
+
dark_mode: boolean;
|
|
90
|
+
prefers_color_scheme: TeleBoxColorScheme;
|
|
82
91
|
close: void;
|
|
83
92
|
focus: void;
|
|
84
93
|
blur: void;
|
|
@@ -5,6 +5,7 @@ import { TeleStyles } from "../typings";
|
|
|
5
5
|
export interface TeleBoxCollectorConfig {
|
|
6
6
|
visible?: boolean;
|
|
7
7
|
readonly?: boolean;
|
|
8
|
+
darkMode?: boolean;
|
|
8
9
|
namespace?: string;
|
|
9
10
|
styles?: TeleStyles;
|
|
10
11
|
onClick?: () => void;
|
|
@@ -14,12 +15,14 @@ export class TeleBoxCollector {
|
|
|
14
15
|
public constructor({
|
|
15
16
|
visible = true,
|
|
16
17
|
readonly = false,
|
|
18
|
+
darkMode = false,
|
|
17
19
|
namespace = "telebox",
|
|
18
20
|
styles = {},
|
|
19
21
|
onClick,
|
|
20
22
|
}: TeleBoxCollectorConfig = {}) {
|
|
21
|
-
this._visible =
|
|
22
|
-
this._readonly =
|
|
23
|
+
this._visible = visible;
|
|
24
|
+
this._readonly = readonly;
|
|
25
|
+
this._darkMode = darkMode;
|
|
23
26
|
this.namespace = namespace;
|
|
24
27
|
this.styles = styles;
|
|
25
28
|
this.onClick = onClick;
|
|
@@ -37,6 +40,10 @@ export class TeleBoxCollector {
|
|
|
37
40
|
return this._readonly;
|
|
38
41
|
}
|
|
39
42
|
|
|
43
|
+
public get darkMode(): boolean {
|
|
44
|
+
return this._darkMode;
|
|
45
|
+
}
|
|
46
|
+
|
|
40
47
|
public onClick: (() => void) | undefined;
|
|
41
48
|
|
|
42
49
|
public $collector: HTMLElement | undefined;
|
|
@@ -85,6 +92,23 @@ export class TeleBoxCollector {
|
|
|
85
92
|
return this;
|
|
86
93
|
}
|
|
87
94
|
|
|
95
|
+
public setDarkMode(darkMode: boolean): this {
|
|
96
|
+
if (this._darkMode !== darkMode) {
|
|
97
|
+
this._darkMode = darkMode;
|
|
98
|
+
if (this.$collector) {
|
|
99
|
+
this.$collector.classList.toggle(
|
|
100
|
+
this.wrapClassName("color-scheme-dark"),
|
|
101
|
+
darkMode
|
|
102
|
+
);
|
|
103
|
+
this.$collector.classList.toggle(
|
|
104
|
+
this.wrapClassName("color-scheme-light"),
|
|
105
|
+
!darkMode
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
111
|
+
|
|
88
112
|
public setStyles(styles: TeleStyles): this {
|
|
89
113
|
Object.assign(this.styles, styles);
|
|
90
114
|
if (this.$collector) {
|
|
@@ -103,6 +127,7 @@ export class TeleBoxCollector {
|
|
|
103
127
|
if (!this.$collector) {
|
|
104
128
|
this.$collector = document.createElement("button");
|
|
105
129
|
this.$collector.className = this.wrapClassName("collector");
|
|
130
|
+
this.$collector.style.backgroundImage = `url('${collectorSVG}')`;
|
|
106
131
|
this.$collector.addEventListener(
|
|
107
132
|
"click",
|
|
108
133
|
this.handleCollectorClick
|
|
@@ -120,12 +145,11 @@ export class TeleBoxCollector {
|
|
|
120
145
|
);
|
|
121
146
|
}
|
|
122
147
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
this.$collector.appendChild($icon);
|
|
148
|
+
this.$collector.classList.add(
|
|
149
|
+
this.wrapClassName(
|
|
150
|
+
this._darkMode ? "color-scheme-dark" : "color-scheme-light"
|
|
151
|
+
)
|
|
152
|
+
);
|
|
129
153
|
|
|
130
154
|
this.setStyles(this.styles);
|
|
131
155
|
}
|
|
@@ -153,6 +177,8 @@ export class TeleBoxCollector {
|
|
|
153
177
|
|
|
154
178
|
protected _readonly: boolean;
|
|
155
179
|
|
|
180
|
+
protected _darkMode: boolean;
|
|
181
|
+
|
|
156
182
|
protected handleCollectorClick = (): void => {
|
|
157
183
|
if (!this._readonly && this.onClick) {
|
|
158
184
|
this.onClick();
|
|
@@ -18,11 +18,9 @@
|
|
|
18
18
|
cursor: pointer;
|
|
19
19
|
user-select: none;
|
|
20
20
|
pointer-events: none;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
width: 18px;
|
|
25
|
-
height: 16px;
|
|
21
|
+
background-repeat: no-repeat;
|
|
22
|
+
background-size: 18px 16px;
|
|
23
|
+
background-position: center;
|
|
26
24
|
}
|
|
27
25
|
|
|
28
26
|
.#{$namespace}-collector-visible {
|
|
@@ -33,3 +31,11 @@
|
|
|
33
31
|
.#{$namespace}-collector-readonly {
|
|
34
32
|
cursor: not-allowed;
|
|
35
33
|
}
|
|
34
|
+
|
|
35
|
+
.#{$namespace}-color-scheme-dark {
|
|
36
|
+
color-scheme: dark;
|
|
37
|
+
|
|
38
|
+
&.#{$namespace}-collector {
|
|
39
|
+
background-color: #43434d;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -8,6 +8,7 @@ import { TeleBoxRect, TeleBoxState } from "../../TeleBox/typings";
|
|
|
8
8
|
export type MaxTitleBarTeleBox = Pick<TeleBox, "id" | "title" | "readonly">;
|
|
9
9
|
|
|
10
10
|
export interface MaxTitleBarConfig extends DefaultTitleBarConfig {
|
|
11
|
+
darkMode: boolean;
|
|
11
12
|
boxes: MaxTitleBarTeleBox[];
|
|
12
13
|
containerRect: TeleBoxRect;
|
|
13
14
|
focusedBox?: MaxTitleBarTeleBox;
|
|
@@ -20,6 +21,7 @@ export class MaxTitleBar extends DefaultTitleBar {
|
|
|
20
21
|
this.boxes = config.boxes;
|
|
21
22
|
this.focusedBox = config.focusedBox;
|
|
22
23
|
this.containerRect = config.containerRect;
|
|
24
|
+
this.darkMode = config.darkMode;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
public focusBox(box?: MaxTitleBarTeleBox): void {
|
|
@@ -89,6 +91,22 @@ export class MaxTitleBar extends DefaultTitleBar {
|
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
|
|
94
|
+
public setDarkMode(darkMode: boolean): void {
|
|
95
|
+
if (darkMode !== this.darkMode) {
|
|
96
|
+
this.darkMode = darkMode;
|
|
97
|
+
if (this.$titleBar) {
|
|
98
|
+
this.$titleBar.classList.toggle(
|
|
99
|
+
this.wrapClassName("color-scheme-dark"),
|
|
100
|
+
darkMode
|
|
101
|
+
);
|
|
102
|
+
this.$titleBar.classList.toggle(
|
|
103
|
+
this.wrapClassName("color-scheme-light"),
|
|
104
|
+
!darkMode
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
92
110
|
public render(): HTMLElement {
|
|
93
111
|
const $titleBar = super.render();
|
|
94
112
|
const { x, y, width } = this.containerRect;
|
|
@@ -104,6 +122,11 @@ export class MaxTitleBar extends DefaultTitleBar {
|
|
|
104
122
|
this.wrapClassName("readonly"),
|
|
105
123
|
this.readonly
|
|
106
124
|
);
|
|
125
|
+
$titleBar.classList.add(
|
|
126
|
+
this.wrapClassName(
|
|
127
|
+
this.darkMode ? "color-scheme-dark" : "color-scheme-light"
|
|
128
|
+
)
|
|
129
|
+
);
|
|
107
130
|
|
|
108
131
|
this.updateTitles();
|
|
109
132
|
|
|
@@ -171,6 +194,8 @@ export class MaxTitleBar extends DefaultTitleBar {
|
|
|
171
194
|
return this.$titles;
|
|
172
195
|
}
|
|
173
196
|
|
|
197
|
+
protected darkMode: boolean;
|
|
198
|
+
|
|
174
199
|
protected $titles: HTMLElement | undefined;
|
|
175
200
|
|
|
176
201
|
protected boxes: MaxTitleBarTeleBox[];
|
|
@@ -123,3 +123,21 @@ $scrollbar-color-active: rgba(238, 238, 247, 1);
|
|
|
123
123
|
cursor: not-allowed;
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
+
|
|
127
|
+
.#{$namespace}-color-scheme-dark {
|
|
128
|
+
color-scheme: dark;
|
|
129
|
+
|
|
130
|
+
&.#{$namespace}-titlebar {
|
|
131
|
+
color: #e9e9e9;
|
|
132
|
+
background: #43434d;
|
|
133
|
+
border-bottom: none;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.#{$namespace}-titles-tab {
|
|
137
|
+
border-right-color: #7b88a0;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.#{$namespace}-title {
|
|
141
|
+
color: #e9e9e9;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -17,7 +17,11 @@ import type {
|
|
|
17
17
|
TeleBoxManagerUpdateConfig,
|
|
18
18
|
} from "./typings";
|
|
19
19
|
import { MaxTitleBar } from "./MaxTitleBar";
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
TeleBoxColorScheme,
|
|
22
|
+
TELE_BOX_COLOR_SCHEME,
|
|
23
|
+
TELE_BOX_DELEGATE_EVENT,
|
|
24
|
+
} from "..";
|
|
21
25
|
import { SideEffectManager } from "side-effect-manager";
|
|
22
26
|
import {
|
|
23
27
|
createSideEffectBinder,
|
|
@@ -30,6 +34,7 @@ export * from "./typings";
|
|
|
30
34
|
export * from "./constants";
|
|
31
35
|
|
|
32
36
|
type ValConfig = {
|
|
37
|
+
prefersColorScheme: Val<TeleBoxColorScheme, boolean>;
|
|
33
38
|
containerRect: Val<TeleBoxRect, boolean>;
|
|
34
39
|
collector: Val<TeleBoxCollector | null>;
|
|
35
40
|
readonly: Val<boolean, boolean>;
|
|
@@ -42,6 +47,7 @@ export interface TeleBoxManager extends ValEnhancedResult<ValConfig> {}
|
|
|
42
47
|
export class TeleBoxManager {
|
|
43
48
|
public constructor({
|
|
44
49
|
root = document.body,
|
|
50
|
+
prefersColorScheme = TELE_BOX_COLOR_SCHEME.Light,
|
|
45
51
|
minimized = false,
|
|
46
52
|
maximized = false,
|
|
47
53
|
fence = true,
|
|
@@ -63,6 +69,43 @@ export class TeleBoxManager {
|
|
|
63
69
|
this.namespace = namespace;
|
|
64
70
|
this.zIndex = zIndex;
|
|
65
71
|
|
|
72
|
+
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
|
|
73
|
+
const prefersDark$ = createVal(prefersDark.matches);
|
|
74
|
+
this._sideEffect.add(() => {
|
|
75
|
+
const handler = (evt: MediaQueryListEvent): void => {
|
|
76
|
+
prefersDark$.setValue(evt.matches);
|
|
77
|
+
};
|
|
78
|
+
prefersDark.addEventListener("change", handler);
|
|
79
|
+
return () => prefersDark.removeEventListener("change", handler);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
const prefersColorScheme$ = createVal(prefersColorScheme);
|
|
83
|
+
prefersColorScheme$.reaction((prefersColorScheme, _, skipUpdate) => {
|
|
84
|
+
this.boxes.forEach((box) =>
|
|
85
|
+
box.setPrefersColorScheme(prefersColorScheme, skipUpdate)
|
|
86
|
+
);
|
|
87
|
+
if (!skipUpdate) {
|
|
88
|
+
this.events.emit(
|
|
89
|
+
TELE_BOX_MANAGER_EVENT.PrefersColorScheme,
|
|
90
|
+
prefersColorScheme
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
this._darkMode$ = combine(
|
|
96
|
+
[prefersDark$, prefersColorScheme$],
|
|
97
|
+
([prefersDark, prefersColorScheme]) =>
|
|
98
|
+
prefersColorScheme === "auto"
|
|
99
|
+
? prefersDark
|
|
100
|
+
: prefersColorScheme === "dark"
|
|
101
|
+
);
|
|
102
|
+
this._darkMode$.reaction((darkMode, _, skipUpdate) => {
|
|
103
|
+
this.boxes.forEach((box) => box.setDarkMode(darkMode, skipUpdate));
|
|
104
|
+
if (!skipUpdate) {
|
|
105
|
+
this.events.emit(TELE_BOX_MANAGER_EVENT.DarkMode, darkMode);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
66
109
|
const readonly$ = createVal(readonly);
|
|
67
110
|
readonly$.reaction((readonly, _, skipUpdate) => {
|
|
68
111
|
this.boxes.forEach((box) => box.setReadonly(readonly, skipUpdate));
|
|
@@ -123,6 +166,7 @@ export class TeleBoxManager {
|
|
|
123
166
|
if (collector) {
|
|
124
167
|
collector.setVisible(minimized$.value);
|
|
125
168
|
collector.setReadonly(readonly$.value);
|
|
169
|
+
collector.setDarkMode(this._darkMode$.value);
|
|
126
170
|
this._sideEffect.add(() => {
|
|
127
171
|
collector.onClick = () => {
|
|
128
172
|
if (!readonly$.value) {
|
|
@@ -136,6 +180,9 @@ export class TeleBoxManager {
|
|
|
136
180
|
readonly$.subscribe((readonly) =>
|
|
137
181
|
collector$.value?.setReadonly(readonly)
|
|
138
182
|
);
|
|
183
|
+
this._darkMode$.subscribe((darkMode) => {
|
|
184
|
+
collector$.value?.setDarkMode(darkMode);
|
|
185
|
+
});
|
|
139
186
|
|
|
140
187
|
minimized$.subscribe((minimized, _, skipUpdate) => {
|
|
141
188
|
collector$.value?.setVisible(minimized);
|
|
@@ -210,6 +257,7 @@ export class TeleBoxManager {
|
|
|
210
257
|
);
|
|
211
258
|
|
|
212
259
|
this.maxTitleBar = new MaxTitleBar({
|
|
260
|
+
darkMode: this.darkMode,
|
|
213
261
|
readonly: readonly$.value,
|
|
214
262
|
namespace: this.namespace,
|
|
215
263
|
state: state$.value,
|
|
@@ -244,8 +292,12 @@ export class TeleBoxManager {
|
|
|
244
292
|
readonly$.subscribe((readonly) =>
|
|
245
293
|
this.maxTitleBar.setReadonly(readonly)
|
|
246
294
|
);
|
|
295
|
+
this._darkMode$.subscribe((darkMode) => {
|
|
296
|
+
this.maxTitleBar.setDarkMode(darkMode);
|
|
297
|
+
});
|
|
247
298
|
|
|
248
299
|
const valConfig: ValConfig = {
|
|
300
|
+
prefersColorScheme: prefersColorScheme$,
|
|
249
301
|
containerRect: containerRect$,
|
|
250
302
|
collector: collector$,
|
|
251
303
|
readonly: readonly$,
|
|
@@ -271,6 +323,12 @@ export class TeleBoxManager {
|
|
|
271
323
|
|
|
272
324
|
public zIndex: number;
|
|
273
325
|
|
|
326
|
+
public _darkMode$: Val<boolean, boolean>;
|
|
327
|
+
|
|
328
|
+
public get darkMode(): boolean {
|
|
329
|
+
return this._darkMode$.value;
|
|
330
|
+
}
|
|
331
|
+
|
|
274
332
|
public _state$: Val<TeleBoxState, boolean>;
|
|
275
333
|
|
|
276
334
|
public get state(): TeleBoxState {
|
|
@@ -385,11 +443,11 @@ export class TeleBoxManager {
|
|
|
385
443
|
const box = boxes[0];
|
|
386
444
|
this.focusBox({ focus: false, box });
|
|
387
445
|
box.destroy();
|
|
388
|
-
if (this.boxes.length <= 0) {
|
|
389
|
-
this.setMaximized(false);
|
|
390
|
-
this.setMinimized(false);
|
|
391
|
-
}
|
|
392
446
|
if (!skipUpdate) {
|
|
447
|
+
if (this.boxes.length <= 0) {
|
|
448
|
+
this.setMaximized(false);
|
|
449
|
+
this.setMinimized(false);
|
|
450
|
+
}
|
|
393
451
|
this.events.emit(TELE_BOX_MANAGER_EVENT.Removed, boxes);
|
|
394
452
|
}
|
|
395
453
|
return box;
|
|
@@ -412,11 +470,11 @@ export class TeleBoxManager {
|
|
|
412
470
|
const boxes = this.boxes.splice(0, this.boxes.length);
|
|
413
471
|
this.maxTitleBar.setBoxes(this.boxes);
|
|
414
472
|
boxes.forEach((box) => box.destroy());
|
|
415
|
-
if (this.boxes.length <= 0) {
|
|
416
|
-
this.setMaximized(false);
|
|
417
|
-
this.setMinimized(false);
|
|
418
|
-
}
|
|
419
473
|
if (!skipUpdate) {
|
|
474
|
+
if (this.boxes.length <= 0) {
|
|
475
|
+
this.setMaximized(false);
|
|
476
|
+
this.setMinimized(false);
|
|
477
|
+
}
|
|
420
478
|
this.events.emit(TELE_BOX_MANAGER_EVENT.Removed, boxes);
|
|
421
479
|
}
|
|
422
480
|
return boxes;
|
|
@@ -614,6 +672,8 @@ export class TeleBoxManager {
|
|
|
614
672
|
y,
|
|
615
673
|
width,
|
|
616
674
|
height,
|
|
675
|
+
darkMode: this.darkMode,
|
|
676
|
+
prefersColorScheme: this.prefersColorScheme,
|
|
617
677
|
maximized: this.maximized,
|
|
618
678
|
minimized: this.minimized,
|
|
619
679
|
fence: this.fence,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type EventEmitter from "eventemitter3";
|
|
2
|
+
import { TeleBoxColorScheme } from "..";
|
|
2
3
|
import type { ReadonlyTeleBox, TeleBoxState } from "../TeleBox";
|
|
3
4
|
import type { TeleBoxConfig } from "../TeleBox/typings";
|
|
4
5
|
import type { TeleBoxCollector } from "../TeleBoxCollector";
|
|
@@ -7,6 +8,7 @@ import type { TELE_BOX_MANAGER_EVENT } from "./constants";
|
|
|
7
8
|
export interface TeleBoxManagerConfig
|
|
8
9
|
extends Pick<
|
|
9
10
|
TeleBoxConfig,
|
|
11
|
+
| "prefersColorScheme"
|
|
10
12
|
| "fence"
|
|
11
13
|
| "containerRect"
|
|
12
14
|
| "maximized"
|
|
@@ -67,6 +69,8 @@ export type TeleBoxManagerEventConfig = CheckTeleBoxManagerConfig<{
|
|
|
67
69
|
intrinsic_move: [ReadonlyTeleBox];
|
|
68
70
|
intrinsic_resize: [ReadonlyTeleBox];
|
|
69
71
|
visual_resize: [ReadonlyTeleBox];
|
|
72
|
+
prefers_color_scheme: [TeleBoxColorScheme];
|
|
73
|
+
dark_mode: [boolean];
|
|
70
74
|
}>;
|
|
71
75
|
|
|
72
76
|
export type TeleBoxManagerEvent = keyof TeleBoxManagerEventConfig;
|
|
@@ -16,6 +16,12 @@ export type TeleBoxReactProps = TeleBoxConfig & {
|
|
|
16
16
|
export const TeleBoxReact: FC<TeleBoxReactProps> = (props) => {
|
|
17
17
|
const [teleBox] = useState(() => new TeleBox(props));
|
|
18
18
|
|
|
19
|
+
useUpdateEffect(() => {
|
|
20
|
+
if (props.prefersColorScheme != null) {
|
|
21
|
+
teleBox.setPrefersColorScheme(props.prefersColorScheme);
|
|
22
|
+
}
|
|
23
|
+
}, [teleBox, props.prefersColorScheme]);
|
|
24
|
+
|
|
19
25
|
useUpdateEffect(() => {
|
|
20
26
|
if (props.minWidth != null) {
|
|
21
27
|
teleBox.setMinWidth(props.minWidth);
|
|
@@ -52,6 +58,18 @@ export const TeleBoxReact: FC<TeleBoxReactProps> = (props) => {
|
|
|
52
58
|
}
|
|
53
59
|
}, [teleBox, props.visible]);
|
|
54
60
|
|
|
61
|
+
useUpdateEffect(() => {
|
|
62
|
+
if (props.minimized != null) {
|
|
63
|
+
teleBox.setMinimized(props.minimized, true);
|
|
64
|
+
}
|
|
65
|
+
}, [teleBox, props.minimized]);
|
|
66
|
+
|
|
67
|
+
useUpdateEffect(() => {
|
|
68
|
+
if (props.maximized != null) {
|
|
69
|
+
teleBox.setMaximized(props.maximized, true);
|
|
70
|
+
}
|
|
71
|
+
}, [teleBox, props.maximized]);
|
|
72
|
+
|
|
55
73
|
useUpdateEffect(() => {
|
|
56
74
|
if (props.state != null) {
|
|
57
75
|
teleBox.setState(props.state, true);
|
|
@@ -71,3 +71,17 @@
|
|
|
71
71
|
.#{$namespace}-titlebar-icon-close {
|
|
72
72
|
background: center / cover no-repeat url("./icons/close.svg");
|
|
73
73
|
}
|
|
74
|
+
|
|
75
|
+
.#{$namespace}-color-scheme-dark {
|
|
76
|
+
color-scheme: dark;
|
|
77
|
+
|
|
78
|
+
.#{$namespace}-title {
|
|
79
|
+
color: #e9e9e9;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.#{$namespace}-titlebar {
|
|
83
|
+
color: #e9e9e9;
|
|
84
|
+
background: #43434d;
|
|
85
|
+
border-bottom: none;
|
|
86
|
+
}
|
|
87
|
+
}
|