@mantou/gem 2.0.0-alpha.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gem.es.js +1159 -1166
- package/dist/gem.umd.js +25 -25
- package/elements/base/modal-factory.d.ts +12 -7
- package/elements/base/modal-factory.d.ts.map +1 -1
- package/elements/base/modal-factory.js +3 -3
- package/elements/base/modal-factory.js.map +1 -1
- package/elements/base/route.d.ts +8 -2
- package/elements/base/route.d.ts.map +1 -1
- package/elements/base/route.js +21 -16
- package/elements/base/route.js.map +1 -1
- package/elements/base/title.js +2 -2
- package/elements/base/title.js.map +1 -1
- package/helper/i18n.d.ts.map +1 -1
- package/helper/i18n.js +11 -11
- package/helper/i18n.js.map +1 -1
- package/helper/theme.d.ts +8 -7
- package/helper/theme.d.ts.map +1 -1
- package/helper/theme.js +21 -21
- package/helper/theme.js.map +1 -1
- package/lib/decorators.d.ts +2 -1
- package/lib/decorators.d.ts.map +1 -1
- package/lib/decorators.js +6 -0
- package/lib/decorators.js.map +1 -1
- package/lib/element.d.ts +6 -4
- package/lib/element.d.ts.map +1 -1
- package/lib/element.js +12 -15
- package/lib/element.js.map +1 -1
- package/lib/history.d.ts +20 -8
- package/lib/history.d.ts.map +1 -1
- package/lib/history.js +12 -12
- package/lib/history.js.map +1 -1
- package/lib/store.d.ts +5 -10
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +7 -22
- package/lib/store.js.map +1 -1
- package/lib/utils.d.ts +1 -0
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +19 -14
- package/lib/utils.js.map +1 -1
- package/package.json +4 -4
- package/src/elements/base/modal-factory.ts +3 -3
- package/src/elements/base/route.ts +7 -9
- package/src/elements/base/title.ts +2 -2
- package/src/helper/i18n.ts +11 -8
- package/src/helper/theme.ts +27 -26
- package/src/lib/decorators.ts +9 -2
- package/src/lib/element.ts +18 -19
- package/src/lib/history.ts +12 -12
- package/src/lib/store.ts +11 -31
- package/src/lib/utils.ts +21 -14
- package/src/test/gem-element/advance.test.ts +2 -2
- package/src/test/gem-element/basic.test.ts +3 -3
- package/src/test/gem-element/decorators.test.ts +4 -4
- package/src/test/store.test.ts +7 -7
- package/src/test/utils.test.ts +1 -1
package/lib/utils.js
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
const { assign, setPrototypeOf, fromEntries, entries, keys } = Object;
|
|
2
|
+
const microtaskSet = new Set();
|
|
2
3
|
export function addMicrotask(func) {
|
|
3
|
-
if (
|
|
4
|
+
if (microtaskSet.has(func))
|
|
4
5
|
return;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
microtaskSet = new Set();
|
|
10
|
-
set.forEach((f) => f());
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
microtaskSet.delete(func);
|
|
6
|
+
queueMicrotask(() => {
|
|
7
|
+
microtaskSet.delete(func);
|
|
8
|
+
func();
|
|
9
|
+
});
|
|
14
10
|
microtaskSet.add(func);
|
|
15
11
|
}
|
|
12
|
+
export function createUpdater(initState, fn) {
|
|
13
|
+
const state = fn;
|
|
14
|
+
setPrototypeOf(state, null);
|
|
15
|
+
delete state.name;
|
|
16
|
+
delete state.length;
|
|
17
|
+
assign(state, initState);
|
|
18
|
+
// TODO: type
|
|
19
|
+
return state;
|
|
20
|
+
}
|
|
16
21
|
// 不编码 hash 用于比较
|
|
17
22
|
export function absoluteLocation(currentPath = '', relativePath = '') {
|
|
18
23
|
const { pathname, search, hash } = new URL(relativePath, location.origin + currentPath);
|
|
@@ -124,12 +129,12 @@ export class QueryString extends URLSearchParams {
|
|
|
124
129
|
concat(param) {
|
|
125
130
|
let query;
|
|
126
131
|
if (typeof param === 'string') {
|
|
127
|
-
query =
|
|
132
|
+
query = fromEntries(new URLSearchParams(param).entries());
|
|
128
133
|
}
|
|
129
134
|
else {
|
|
130
135
|
query = param;
|
|
131
136
|
}
|
|
132
|
-
|
|
137
|
+
entries(query).forEach(([key, value]) => {
|
|
133
138
|
this.append(key, this.#stringify(value));
|
|
134
139
|
});
|
|
135
140
|
}
|
|
@@ -206,7 +211,7 @@ export function kebabToCamelCase(str) {
|
|
|
206
211
|
return str.replace(/-(.)/g, (_substr, $1) => $1.toUpperCase());
|
|
207
212
|
}
|
|
208
213
|
export function cleanObject(o) {
|
|
209
|
-
|
|
214
|
+
keys(o).forEach((key) => {
|
|
210
215
|
delete o[key];
|
|
211
216
|
});
|
|
212
217
|
return o;
|
package/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/lib/utils.ts"],"names":[],"mappings":"AAAA,IAAI,YAAY,GAAG,IAAI,GAAG,EAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/lib/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mantou/gem",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "💎 使用自定义元素的轻量级 WebApp 开发框架",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"frontend",
|
|
@@ -44,13 +44,13 @@
|
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@esm-bundle/chai": "^4.3.4-fix.0",
|
|
47
|
-
"@gemjs/config": "^2.
|
|
47
|
+
"@gemjs/config": "^2.1.0",
|
|
48
48
|
"@open-wc/testing": "^2.5.33",
|
|
49
49
|
"@types/mocha": "^10.0.7",
|
|
50
50
|
"@web/dev-server-esbuild": "^1.0.2",
|
|
51
51
|
"@web/test-runner": "^0.18.1",
|
|
52
52
|
"rimraf": "^3.0.2",
|
|
53
|
-
"typescript": "^5.
|
|
53
|
+
"typescript": "^5.6.2",
|
|
54
54
|
"vite": "^5.2.10"
|
|
55
55
|
},
|
|
56
56
|
"author": "mantou132",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"url": "https://github.com/mantou132/gem/issues"
|
|
65
65
|
},
|
|
66
66
|
"homepage": "https://github.com/mantou132/gem#readme",
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "00c0b40a5f92eaf3fce6e92b1a1f656565e69811"
|
|
68
68
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GemElement } from '../../lib/element';
|
|
2
|
-
import { connect, createStore
|
|
2
|
+
import { connect, createStore } from '../../lib/store';
|
|
3
3
|
import { history } from '../../lib/history';
|
|
4
4
|
import { aria, mounted, shadow } from '../../lib/decorators';
|
|
5
5
|
|
|
@@ -46,7 +46,7 @@ export function createModalClass<T extends Record<string, unknown>>(options: T)
|
|
|
46
46
|
this.inertStore = ([...document.body.children] as HTMLElement[]).filter((e) => !e.inert);
|
|
47
47
|
this.inertStore.forEach((e) => (e.inert = true));
|
|
48
48
|
document.body.append(instance);
|
|
49
|
-
const changeStore = () =>
|
|
49
|
+
const changeStore = () => this.store({ [open]: true, ...opts });
|
|
50
50
|
setTimeout(() => {
|
|
51
51
|
changeStore();
|
|
52
52
|
history.push({
|
|
@@ -75,7 +75,7 @@ export function createModalClass<T extends Record<string, unknown>>(options: T)
|
|
|
75
75
|
static closeHandle() {
|
|
76
76
|
this.inertStore.forEach((e) => (e.inert = false));
|
|
77
77
|
this.instance?.remove();
|
|
78
|
-
|
|
78
|
+
this.store({ [open]: false, ...options });
|
|
79
79
|
return final;
|
|
80
80
|
}
|
|
81
81
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { TemplateResult } from '../../lib/element';
|
|
2
|
-
import {
|
|
2
|
+
import { createState, GemElement, html } from '../../lib/element';
|
|
3
3
|
import type { Emitter } from '../../lib/decorators';
|
|
4
|
-
import { property, emitter, boolattribute, shadow, effect, template,
|
|
4
|
+
import { property, emitter, boolattribute, shadow, effect, template, light } from '../../lib/decorators';
|
|
5
5
|
import type { Store } from '../../lib/store';
|
|
6
|
-
import { createStore,
|
|
6
|
+
import { createStore, connect } from '../../lib/store';
|
|
7
7
|
import type { UpdateHistoryParams } from '../../lib/history';
|
|
8
8
|
import { titleStore, history } from '../../lib/history';
|
|
9
9
|
import type { QueryString } from '../../lib/utils';
|
|
@@ -139,6 +139,7 @@ const scrollPositionMap = new Map<string, number>();
|
|
|
139
139
|
* @fires error
|
|
140
140
|
* @fires loading
|
|
141
141
|
*/
|
|
142
|
+
@light({ penetrable: true })
|
|
142
143
|
export class GemLightRouteElement extends GemElement {
|
|
143
144
|
@boolattribute transition: boolean;
|
|
144
145
|
@property routes?: RouteItem[] | RoutesObject;
|
|
@@ -204,7 +205,7 @@ export class GemLightRouteElement extends GemElement {
|
|
|
204
205
|
#updateLocationStore = () => {
|
|
205
206
|
if (!this.locationStore) return;
|
|
206
207
|
const { path, query, hash, data } = history.getParams();
|
|
207
|
-
|
|
208
|
+
this.locationStore({
|
|
208
209
|
path,
|
|
209
210
|
params: this.currentParams,
|
|
210
211
|
query,
|
|
@@ -245,9 +246,6 @@ export class GemLightRouteElement extends GemElement {
|
|
|
245
246
|
}
|
|
246
247
|
};
|
|
247
248
|
|
|
248
|
-
@willMount()
|
|
249
|
-
#unBoundary = () => this.internals.states.delete(BoundaryCSSState);
|
|
250
|
-
|
|
251
249
|
@effect((i) => [i.scrollContainer])
|
|
252
250
|
#rememberScrollPosition = () => {
|
|
253
251
|
if (!this.#scrollContainer) return;
|
|
@@ -258,7 +256,7 @@ export class GemLightRouteElement extends GemElement {
|
|
|
258
256
|
|
|
259
257
|
// history or i18n
|
|
260
258
|
@effect((i) => [i.scrollContainer])
|
|
261
|
-
#connectTriggerStore = () => connect(this.trigger.store, () => this.#state(
|
|
259
|
+
#connectTriggerStore = () => this.trigger.store && connect(this.trigger.store, () => this.#state());
|
|
262
260
|
|
|
263
261
|
#updateContentDep = () => {
|
|
264
262
|
const { path, query, hash } = this.trigger.getParams();
|
|
@@ -312,7 +310,7 @@ export class GemLightRouteElement extends GemElement {
|
|
|
312
310
|
if (this.trigger === history) {
|
|
313
311
|
// 嵌套路由执行顺序也是从父到子
|
|
314
312
|
if (location.href !== titleStore.url || route?.title) {
|
|
315
|
-
|
|
313
|
+
titleStore({ url: location.href, title: route?.title });
|
|
316
314
|
}
|
|
317
315
|
}
|
|
318
316
|
const contentOrLoader = content || getContent?.(params, this.shadowRoot || this);
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
import { GemElement, html } from '../../lib/element';
|
|
16
16
|
import { attribute, boolattribute, effect, mounted, shadow } from '../../lib/decorators';
|
|
17
|
-
import {
|
|
17
|
+
import { connect } from '../../lib/store';
|
|
18
18
|
import { titleStore } from '../../lib/history';
|
|
19
19
|
|
|
20
20
|
// 避免重定向时的中间状态标题
|
|
@@ -50,7 +50,7 @@ export class GemTitleElement extends GemElement {
|
|
|
50
50
|
static title = document.title;
|
|
51
51
|
|
|
52
52
|
static setTitle(title: string) {
|
|
53
|
-
|
|
53
|
+
titleStore({ title });
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
@effect((i) => [i.inert])
|
package/src/helper/i18n.ts
CHANGED
|
@@ -113,6 +113,7 @@ export class I18n<T = Record<string, Msg>> implements RouteTrigger {
|
|
|
113
113
|
this.onChange?.(lang);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
+
#inConstructor = true;
|
|
116
117
|
constructor(options: I18nOptions<T>) {
|
|
117
118
|
if (!options.resources[options.fallbackLanguage]) {
|
|
118
119
|
throw new GemError('i18n: fallbackLanguage invalid');
|
|
@@ -139,6 +140,7 @@ export class I18n<T = Record<string, Msg>> implements RouteTrigger {
|
|
|
139
140
|
} else {
|
|
140
141
|
this.resetLanguage();
|
|
141
142
|
}
|
|
143
|
+
this.#inConstructor = false;
|
|
142
144
|
}
|
|
143
145
|
|
|
144
146
|
get(s: keyof T): string;
|
|
@@ -207,14 +209,15 @@ export class I18n<T = Record<string, Msg>> implements RouteTrigger {
|
|
|
207
209
|
}
|
|
208
210
|
this.resources[lang] = pack;
|
|
209
211
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
212
|
+
if (!this.#inConstructor) {
|
|
213
|
+
// 更新所有元素,可能会更新许多不必要的元素
|
|
214
|
+
const temp: Element[] = [document.documentElement];
|
|
215
|
+
while (!!temp.length) {
|
|
216
|
+
const element = temp.pop()!;
|
|
217
|
+
(element as any)[UpdateToken]?.();
|
|
218
|
+
// 和 gem 更新机制一样使用深度优先
|
|
219
|
+
temp.push(...[...element.children, ...(element.shadowRoot?.children || [])].reverse());
|
|
220
|
+
}
|
|
218
221
|
}
|
|
219
222
|
|
|
220
223
|
if (lang !== this.currentLanguage) {
|
package/src/helper/theme.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import type { Store } from '../lib/store';
|
|
2
|
-
import { connect,
|
|
3
|
-
import { camelToKebabCase, randomStr } from '../lib/utils';
|
|
2
|
+
import { connect, createStore } from '../lib/store';
|
|
3
|
+
import { camelToKebabCase, createUpdater, randomStr } from '../lib/utils';
|
|
4
4
|
import type { GemElement } from '../lib/element';
|
|
5
5
|
import { SheetToken, createCSSSheet } from '../lib/element';
|
|
6
6
|
|
|
7
|
-
export type Theme<T> = ReturnType<typeof
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
export type Theme<T> = ReturnType<typeof createUpdater<T>> &
|
|
8
|
+
ReturnType<typeof createCSSSheet> & {
|
|
9
|
+
[K in keyof T as K extends `${string}Color`
|
|
10
|
+
? `${string & K}${'' | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900}`
|
|
11
|
+
: K]: T[K];
|
|
12
|
+
};
|
|
12
13
|
|
|
13
14
|
const themeStoreMap = new WeakMap();
|
|
14
15
|
const themePropsMap = new WeakMap();
|
|
@@ -23,12 +24,12 @@ export function getThemeProps<T>(theme: Theme<T>) {
|
|
|
23
24
|
return themePropsMap.get(theme) as Theme<T>;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
function
|
|
27
|
+
function createThemeFromProps<T extends Record<string, unknown>>(themeObj: T, props: Record<string, string> = {}) {
|
|
27
28
|
const salt = randomStr();
|
|
28
29
|
const styleSheet = createCSSSheet({})[SheetToken];
|
|
29
|
-
const
|
|
30
|
+
const store = createStore<T>(themeObj);
|
|
30
31
|
const theme: any = new Proxy(
|
|
31
|
-
{ [SheetToken]: styleSheet },
|
|
32
|
+
createUpdater({ [SheetToken]: styleSheet }, (payload: Partial<T>) => store(payload)),
|
|
32
33
|
{
|
|
33
34
|
get(target: any, key: string) {
|
|
34
35
|
if (!target[key]) {
|
|
@@ -58,41 +59,41 @@ function useThemeFromProps<T extends Record<string, unknown>>(themeObj: T, props
|
|
|
58
59
|
updateContent();
|
|
59
60
|
styleSheet.updateStyle();
|
|
60
61
|
});
|
|
61
|
-
return
|
|
62
|
+
return theme as Theme<T>;
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
/**
|
|
65
66
|
* 用于 `@adoptedStyle(theme)`,类似 `createCSSSheet`
|
|
66
67
|
*/
|
|
67
|
-
export function
|
|
68
|
-
return
|
|
68
|
+
export function createScopedTheme<T extends Record<string, unknown>>(themeObj: T) {
|
|
69
|
+
return createThemeFromProps(themeObj);
|
|
69
70
|
}
|
|
70
71
|
|
|
71
|
-
|
|
72
|
-
export function
|
|
73
|
-
const result =
|
|
74
|
-
document.adoptedStyleSheets.push(result[
|
|
72
|
+
/** 全局主题 */
|
|
73
|
+
export function createTheme<T extends Record<string, unknown>>(themeObj: T) {
|
|
74
|
+
const result = createScopedTheme(themeObj);
|
|
75
|
+
document.adoptedStyleSheets.push(result[SheetToken].getStyle());
|
|
75
76
|
return result;
|
|
76
77
|
}
|
|
77
78
|
|
|
78
|
-
|
|
79
|
-
export function
|
|
80
|
-
return
|
|
79
|
+
/** 用来覆盖全局主题 */
|
|
80
|
+
export function createOverrideTheme<T extends Record<string, unknown>>(theme: Theme<T>, themeObj: Partial<T>) {
|
|
81
|
+
return createThemeFromProps(themeObj, getThemeProps(theme));
|
|
81
82
|
}
|
|
82
83
|
|
|
83
|
-
export function
|
|
84
|
-
const
|
|
84
|
+
export function createDecoratorTheme<T extends Record<string, unknown>>(themeObj: T) {
|
|
85
|
+
const themeAsKeys = createThemeFromProps<T>(themeObj);
|
|
85
86
|
const props = getThemeProps(themeAsKeys);
|
|
86
|
-
const
|
|
87
|
+
const update =
|
|
87
88
|
<E extends GemElement, V extends () => T, K = any[] | undefined>(
|
|
88
89
|
getDep?: K extends readonly any[] ? (instance: E) => K : undefined,
|
|
89
90
|
) =>
|
|
90
91
|
(_: any, { addInitializer, access }: ClassFieldDecoratorContext<E, V> | ClassMethodDecoratorContext<E, V>) => {
|
|
91
92
|
addInitializer(function (this: E) {
|
|
92
|
-
const
|
|
93
|
+
const theme = createThemeFromProps({ ...themeObj }, props);
|
|
93
94
|
this.internals.sheets.push(theme[SheetToken].getStyle(this));
|
|
94
|
-
this.memo(() =>
|
|
95
|
+
this.memo(() => theme(access.get(this).apply(this)), getDep && (() => getDep(this) as any));
|
|
95
96
|
});
|
|
96
97
|
};
|
|
97
|
-
return
|
|
98
|
+
return createUpdater(themeAsKeys, update) as ReturnType<typeof createUpdater<typeof themeAsKeys, typeof update>>;
|
|
98
99
|
}
|
package/src/lib/decorators.ts
CHANGED
|
@@ -8,7 +8,7 @@ import * as storeExports from './store';
|
|
|
8
8
|
import * as versionExports from './version';
|
|
9
9
|
|
|
10
10
|
type GemElementPrototype = GemElement;
|
|
11
|
-
type StaticField = Exclude<keyof Metadata, keyof ShadowRootInit | 'aria' | 'noBlocking'>;
|
|
11
|
+
type StaticField = Exclude<keyof Metadata, keyof ShadowRootInit | 'aria' | 'noBlocking' | 'penetrable'>;
|
|
12
12
|
|
|
13
13
|
const { deleteProperty, getOwnPropertyDescriptor, defineProperty } = Reflect;
|
|
14
14
|
const { getPrototypeOf, assign } = Object;
|
|
@@ -456,7 +456,7 @@ export function adoptedStyle(sheet: ReturnType<typeof createCSSSheet>) {
|
|
|
456
456
|
* class App extends GemElement {}
|
|
457
457
|
* ```
|
|
458
458
|
*/
|
|
459
|
-
export function connectStore(store: Store<
|
|
459
|
+
export function connectStore(store: Store<any>) {
|
|
460
460
|
return function (_: unknown, context: ClassDecoratorContext) {
|
|
461
461
|
pushStaticField(context, 'observedStores', store);
|
|
462
462
|
};
|
|
@@ -474,6 +474,13 @@ export function shadow({
|
|
|
474
474
|
};
|
|
475
475
|
}
|
|
476
476
|
|
|
477
|
+
export function light({ penetrable }: Pick<Metadata, 'penetrable'>) {
|
|
478
|
+
return function (_: any, context: ClassDecoratorContext) {
|
|
479
|
+
const metadata = context.metadata as Metadata;
|
|
480
|
+
metadata.penetrable = penetrable;
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
|
|
477
484
|
/**
|
|
478
485
|
* 将元素标记为可中断异步渲染
|
|
479
486
|
* 例如:https://examples.gemjs.org/async
|
package/src/lib/element.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type { GemReflectElement } from '../elements/reflect';
|
|
|
5
5
|
|
|
6
6
|
import type { Store } from './store';
|
|
7
7
|
import { connect } from './store';
|
|
8
|
-
import { LinkedList, addMicrotask, isArrayChange, addListener, randomStr } from './utils';
|
|
8
|
+
import { LinkedList, addMicrotask, isArrayChange, addListener, randomStr, createUpdater } from './utils';
|
|
9
9
|
|
|
10
10
|
export { html, svg, render, directive, TemplateResult, SVGTemplateResult } from 'lit-html';
|
|
11
11
|
|
|
@@ -29,7 +29,7 @@ declare global {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
const { assign, defineProperty
|
|
32
|
+
const { assign, defineProperty } = Object;
|
|
33
33
|
|
|
34
34
|
defineProperty(Symbol, 'metadata', { value: Symbol.for('Symbol.metadata') });
|
|
35
35
|
|
|
@@ -40,7 +40,7 @@ export const SheetToken = Symbol.for('gem@sheetToken');
|
|
|
40
40
|
// proto prop
|
|
41
41
|
export const UpdateToken = Symbol.for('gem@update');
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
const BoundaryCSSState = 'gem-style-boundary';
|
|
44
44
|
export const RenderErrorEvent = 'gem@render-error';
|
|
45
45
|
|
|
46
46
|
// fix modal-factory type error
|
|
@@ -177,8 +177,9 @@ export function createCSSSheet<T extends Record<string, string>>(
|
|
|
177
177
|
Object.keys(rules).forEach((key) => {
|
|
178
178
|
const isScope = key === '$';
|
|
179
179
|
// 对于已经有 `-` 的保留原始 key,支持覆盖修改
|
|
180
|
+
// :scope 下可以写嵌套样式 &:xxx,:host() 下不行(子内容可以)
|
|
180
181
|
sheet[key] = isScope || key.includes('-') ? key : `${key}-${randomStr()}`;
|
|
181
|
-
style += `${isScope ? ':scope,:host' : `.${sheet[key]}`} {${rules[key]}}`;
|
|
182
|
+
style += `${isScope ? ':where(:scope:not([hidden])),:host(:where(:not([hidden])))' : `.${sheet[key]}`} {${rules[key]}}`;
|
|
182
183
|
});
|
|
183
184
|
}
|
|
184
185
|
styleSheet.setContent(style);
|
|
@@ -221,7 +222,7 @@ const appleCSSStyleSheet = (ele: HTMLElement, sheets: CSSStyleSheet[]) => {
|
|
|
221
222
|
};
|
|
222
223
|
|
|
223
224
|
/**必须使用在字段中,否则会读取到错误的实例 */
|
|
224
|
-
export let createState: <T>(initState: T) =>
|
|
225
|
+
export let createState: <T>(initState: T) => ReturnType<typeof createUpdater<T>>;
|
|
225
226
|
|
|
226
227
|
type GetDepFun<T> = () => T;
|
|
227
228
|
type EffectCallback<T> = (depValues: T, oldDepValues?: T) => any;
|
|
@@ -263,15 +264,17 @@ type RenderItem = { render: Render; condition?: () => boolean };
|
|
|
263
264
|
export let createTemplate: (ele: GemElement, item: RenderItem) => void;
|
|
264
265
|
|
|
265
266
|
export type Metadata = Partial<ShadowRootInit> & {
|
|
267
|
+
/** 内容可被外部样式化 */
|
|
268
|
+
penetrable?: boolean;
|
|
266
269
|
noBlocking?: boolean;
|
|
267
270
|
aria?: Partial<
|
|
268
271
|
ARIAMixin & {
|
|
269
|
-
|
|
272
|
+
/** 自动添加 tabIndex;支持 `disabled` 属性 */
|
|
270
273
|
focusable: boolean;
|
|
271
274
|
}
|
|
272
275
|
>;
|
|
273
276
|
// 实例化时使用到,DevTools 需要读取
|
|
274
|
-
observedStores: Store<
|
|
277
|
+
observedStores: Store<any>[];
|
|
275
278
|
adoptedStyleSheets?: Sheet<unknown>[];
|
|
276
279
|
// 以下静态字段仅供外部读取,没有实际作用
|
|
277
280
|
observedProperties?: string[];
|
|
@@ -329,17 +332,13 @@ export abstract class GemElement extends HTMLElement {
|
|
|
329
332
|
static {
|
|
330
333
|
createState = <T>(initState: T) => {
|
|
331
334
|
const ele = currentConstructGemElement;
|
|
332
|
-
const state
|
|
335
|
+
const state = createUpdater(initState, (payload) => {
|
|
333
336
|
assign(state, payload);
|
|
334
337
|
// 避免无限刷新
|
|
335
338
|
if (!ele.#rendering) addMicrotask(ele.#update);
|
|
336
|
-
};
|
|
337
|
-
setPrototypeOf(state, null);
|
|
338
|
-
delete state.name;
|
|
339
|
-
delete state.length;
|
|
339
|
+
});
|
|
340
340
|
ele.#internals.stateList.push(state);
|
|
341
|
-
|
|
342
|
-
return state as T & ((this: GemElement, state: Partial<T>) => void);
|
|
341
|
+
return state;
|
|
343
342
|
};
|
|
344
343
|
createRef = () => new RefObject(currentConstructGemElement);
|
|
345
344
|
createTemplate = (ele, item) => ele.#renderList.push(item);
|
|
@@ -361,10 +360,6 @@ export abstract class GemElement extends HTMLElement {
|
|
|
361
360
|
|
|
362
361
|
assign(this.#internals, internalsAria);
|
|
363
362
|
|
|
364
|
-
// light dom 添加边界,防止内容被外部样式化
|
|
365
|
-
// 特殊情况下需要手动 `delete` 边界,以应该外部样式
|
|
366
|
-
if (!mode) this.#internals.states.add(BoundaryCSSState);
|
|
367
|
-
|
|
368
363
|
// https://stackoverflow.com/questions/43836886/failed-to-construct-customelement-error-when-javascript-file-is-placed-in-head
|
|
369
364
|
// focusable 元素一般同时具备 disabled 属性
|
|
370
365
|
// 和原生元素行为保持一致,disabled 时不触发 click 事件
|
|
@@ -502,7 +497,11 @@ export abstract class GemElement extends HTMLElement {
|
|
|
502
497
|
}
|
|
503
498
|
this.#compat();
|
|
504
499
|
|
|
505
|
-
const { observedStores } = this.#metadata;
|
|
500
|
+
const { observedStores, mode, penetrable } = this.#metadata;
|
|
501
|
+
|
|
502
|
+
// 有渲染函数的 light dom 应该添加边界,防止内容被外部样式化
|
|
503
|
+
// 如果渲染内容需要应用外部样式,需要手动 `delete` 边界
|
|
504
|
+
if (!mode && this.#renderList.length && !penetrable) this.#internals.states.add(BoundaryCSSState);
|
|
506
505
|
|
|
507
506
|
this.#isConnected = true;
|
|
508
507
|
this.#disconnectStore = observedStores?.map((store) => connect(store, this.#update));
|
package/src/lib/history.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// https://github.com/WICG/navigation-api#stakeholder-feedback
|
|
2
2
|
|
|
3
|
-
import { connect,
|
|
3
|
+
import { connect, createStore } from './store';
|
|
4
4
|
import { QueryString, cleanObject, GemError, absoluteLocation } from './utils';
|
|
5
5
|
|
|
6
6
|
const nativeHistory = window.history;
|
|
@@ -18,7 +18,7 @@ export interface HistoryState {
|
|
|
18
18
|
[index: string]: any;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
const
|
|
21
|
+
const store = createStore<HistoryState>({
|
|
22
22
|
$hasCloseHandle: false,
|
|
23
23
|
$hasOpenHandle: false,
|
|
24
24
|
$hasShouldCloseHandle: false,
|
|
@@ -103,7 +103,7 @@ function updateHistory(p: UpdateHistoryParams, native: typeof nativeHistory.push
|
|
|
103
103
|
paramsMap.set(state.$key, params);
|
|
104
104
|
dispatchBeforeChangeEvent();
|
|
105
105
|
cleanObject(store);
|
|
106
|
-
|
|
106
|
+
store(state);
|
|
107
107
|
const url = getUrlBarPath(path) + new QueryString(query) + hash;
|
|
108
108
|
const prevHash = decodeURIComponent(location.hash);
|
|
109
109
|
native(state, title, url);
|
|
@@ -123,7 +123,7 @@ function updateHistoryByNative(data: any, title: string, originUrl: string, nati
|
|
|
123
123
|
paramsMap.set(state.$key, params);
|
|
124
124
|
dispatchBeforeChangeEvent();
|
|
125
125
|
cleanObject(store);
|
|
126
|
-
|
|
126
|
+
store(state);
|
|
127
127
|
const url = getUrlBarPath(pathname) + params.query + hash;
|
|
128
128
|
const prevHash = location.hash;
|
|
129
129
|
native(state, title, url);
|
|
@@ -131,7 +131,7 @@ function updateHistoryByNative(data: any, title: string, originUrl: string, nati
|
|
|
131
131
|
if (prevHash !== hash) window.dispatchEvent(new CustomEvent('hashchange'));
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
const
|
|
134
|
+
const gemBasePathStore = createStore({
|
|
135
135
|
basePath: '',
|
|
136
136
|
});
|
|
137
137
|
|
|
@@ -147,7 +147,7 @@ class GemHistory extends EventTarget {
|
|
|
147
147
|
}
|
|
148
148
|
set basePath(basePath: string) {
|
|
149
149
|
// 应用初始化的时候设置
|
|
150
|
-
|
|
150
|
+
gemBasePathStore({ basePath });
|
|
151
151
|
// paramsMap 更新后 ui 才会更新
|
|
152
152
|
Object.assign(paramsMap.get(store.$key)!, { path: getInternalPath(location.pathname) });
|
|
153
153
|
}
|
|
@@ -156,7 +156,7 @@ class GemHistory extends EventTarget {
|
|
|
156
156
|
}
|
|
157
157
|
updateParams(params: UpdateHistoryParams) {
|
|
158
158
|
Object.assign(paramsMap.get(store.$key)!, params);
|
|
159
|
-
|
|
159
|
+
store();
|
|
160
160
|
}
|
|
161
161
|
push(params: UpdateHistoryParams) {
|
|
162
162
|
updateHistory(params, nativePushState);
|
|
@@ -183,7 +183,7 @@ class GemHistory extends EventTarget {
|
|
|
183
183
|
// `<gem-**>` 只读写父应用 `basePath`
|
|
184
184
|
const gemHistory = new GemHistory();
|
|
185
185
|
|
|
186
|
-
const
|
|
186
|
+
const gemTitleStore = createStore({ defaultTitle: document.title, url: '', title: '' });
|
|
187
187
|
|
|
188
188
|
const _GEMHISTORY = { history: gemHistory, titleStore: gemTitleStore, basePathStore: gemBasePathStore };
|
|
189
189
|
|
|
@@ -217,7 +217,7 @@ if (!window._GEMHISTORY) {
|
|
|
217
217
|
// 支持在 `data:` `blob:` 中 `import`
|
|
218
218
|
if (protocol.startsWith('http')) gemHistory.replace({ path: pathname, query: search, hash });
|
|
219
219
|
} else if (nativeHistory.state.$hasCloseHandle) {
|
|
220
|
-
|
|
220
|
+
store(nativeHistory.state);
|
|
221
221
|
const params = normalizeParams({ title: document.title });
|
|
222
222
|
paramsMap.set(store.$key, params);
|
|
223
223
|
// 有 handle 返回键的页面刷新需要清除返回 handler
|
|
@@ -225,7 +225,7 @@ if (!window._GEMHISTORY) {
|
|
|
225
225
|
} else {
|
|
226
226
|
// 有 gem 历史的正常普通刷新, 储存 params
|
|
227
227
|
const params = normalizeParams({ title: document.title, hash: location.hash });
|
|
228
|
-
|
|
228
|
+
store({
|
|
229
229
|
$key: getKey(),
|
|
230
230
|
...(nativeHistory.state || {}),
|
|
231
231
|
});
|
|
@@ -242,7 +242,7 @@ if (!window._GEMHISTORY) {
|
|
|
242
242
|
connect(store, () => {
|
|
243
243
|
const { title } = gemHistory.getParams();
|
|
244
244
|
if (title !== gemTitleStore.title) {
|
|
245
|
-
|
|
245
|
+
gemTitleStore({ title });
|
|
246
246
|
}
|
|
247
247
|
});
|
|
248
248
|
|
|
@@ -312,7 +312,7 @@ if (!window._GEMHISTORY) {
|
|
|
312
312
|
|
|
313
313
|
dispatchBeforeChangeEvent();
|
|
314
314
|
cleanObject(store);
|
|
315
|
-
|
|
315
|
+
store(newState);
|
|
316
316
|
});
|
|
317
317
|
}
|
|
318
318
|
|