@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.
Files changed (55) hide show
  1. package/dist/gem.es.js +1159 -1166
  2. package/dist/gem.umd.js +25 -25
  3. package/elements/base/modal-factory.d.ts +12 -7
  4. package/elements/base/modal-factory.d.ts.map +1 -1
  5. package/elements/base/modal-factory.js +3 -3
  6. package/elements/base/modal-factory.js.map +1 -1
  7. package/elements/base/route.d.ts +8 -2
  8. package/elements/base/route.d.ts.map +1 -1
  9. package/elements/base/route.js +21 -16
  10. package/elements/base/route.js.map +1 -1
  11. package/elements/base/title.js +2 -2
  12. package/elements/base/title.js.map +1 -1
  13. package/helper/i18n.d.ts.map +1 -1
  14. package/helper/i18n.js +11 -11
  15. package/helper/i18n.js.map +1 -1
  16. package/helper/theme.d.ts +8 -7
  17. package/helper/theme.d.ts.map +1 -1
  18. package/helper/theme.js +21 -21
  19. package/helper/theme.js.map +1 -1
  20. package/lib/decorators.d.ts +2 -1
  21. package/lib/decorators.d.ts.map +1 -1
  22. package/lib/decorators.js +6 -0
  23. package/lib/decorators.js.map +1 -1
  24. package/lib/element.d.ts +6 -4
  25. package/lib/element.d.ts.map +1 -1
  26. package/lib/element.js +12 -15
  27. package/lib/element.js.map +1 -1
  28. package/lib/history.d.ts +20 -8
  29. package/lib/history.d.ts.map +1 -1
  30. package/lib/history.js +12 -12
  31. package/lib/history.js.map +1 -1
  32. package/lib/store.d.ts +5 -10
  33. package/lib/store.d.ts.map +1 -1
  34. package/lib/store.js +7 -22
  35. package/lib/store.js.map +1 -1
  36. package/lib/utils.d.ts +1 -0
  37. package/lib/utils.d.ts.map +1 -1
  38. package/lib/utils.js +19 -14
  39. package/lib/utils.js.map +1 -1
  40. package/package.json +4 -4
  41. package/src/elements/base/modal-factory.ts +3 -3
  42. package/src/elements/base/route.ts +7 -9
  43. package/src/elements/base/title.ts +2 -2
  44. package/src/helper/i18n.ts +11 -8
  45. package/src/helper/theme.ts +27 -26
  46. package/src/lib/decorators.ts +9 -2
  47. package/src/lib/element.ts +18 -19
  48. package/src/lib/history.ts +12 -12
  49. package/src/lib/store.ts +11 -31
  50. package/src/lib/utils.ts +21 -14
  51. package/src/test/gem-element/advance.test.ts +2 -2
  52. package/src/test/gem-element/basic.test.ts +3 -3
  53. package/src/test/gem-element/decorators.test.ts +4 -4
  54. package/src/test/store.test.ts +7 -7
  55. package/src/test/utils.test.ts +1 -1
package/lib/utils.js CHANGED
@@ -1,18 +1,23 @@
1
- let microtaskSet = new Set();
1
+ const { assign, setPrototypeOf, fromEntries, entries, keys } = Object;
2
+ const microtaskSet = new Set();
2
3
  export function addMicrotask(func) {
3
- if (typeof func !== 'function')
4
+ if (microtaskSet.has(func))
4
5
  return;
5
- if (!microtaskSet.size) {
6
- // delayed execution callback after updating store
7
- globalThis.queueMicrotask(() => {
8
- const set = microtaskSet;
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 = Object.fromEntries(new URLSearchParams(param).entries());
132
+ query = fromEntries(new URLSearchParams(param).entries());
128
133
  }
129
134
  else {
130
135
  query = param;
131
136
  }
132
- Object.entries(query).forEach(([key, value]) => {
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
- Object.keys(o).forEach((key) => {
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":"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"}
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.0.0-alpha.1+5cccf43",
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.0.0-alpha.0",
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.5.3",
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": "5cccf43261f8eae0c76a80ec90e243fb880b10a9"
67
+ "gitHead": "00c0b40a5f92eaf3fce6e92b1a1f656565e69811"
68
68
  }
@@ -1,5 +1,5 @@
1
1
  import { GemElement } from '../../lib/element';
2
- import { connect, createStore, updateStore } from '../../lib/store';
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 = () => updateStore(this.store, { [open]: true, ...opts });
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
- updateStore(this.store, { [open]: false, ...options });
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 { BoundaryCSSState, createState, GemElement, html } from '../../lib/element';
2
+ import { createState, GemElement, html } from '../../lib/element';
3
3
  import type { Emitter } from '../../lib/decorators';
4
- import { property, emitter, boolattribute, shadow, effect, template, willMount } from '../../lib/decorators';
4
+ import { property, emitter, boolattribute, shadow, effect, template, light } from '../../lib/decorators';
5
5
  import type { Store } from '../../lib/store';
6
- import { createStore, updateStore, connect } from '../../lib/store';
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
- updateStore(this.locationStore, {
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
- updateStore(titleStore, { url: location.href, title: route?.title });
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 { updateStore, connect } from '../../lib/store';
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
- updateStore(titleStore, { title });
53
+ titleStore({ title });
54
54
  }
55
55
 
56
56
  @effect((i) => [i.inert])
@@ -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
- // update all element
211
- const temp: Element[] = [document.documentElement];
212
- while (!!temp.length) {
213
- const element = temp.pop()!;
214
- (element as any)[UpdateToken]?.();
215
- if (element.shadowRoot?.firstElementChild) temp.push(element.shadowRoot.firstElementChild);
216
- if (element.firstElementChild) temp.push(element.firstElementChild);
217
- if (element.nextElementSibling) temp.push(element.nextElementSibling);
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) {
@@ -1,14 +1,15 @@
1
1
  import type { Store } from '../lib/store';
2
- import { connect, useStore } from '../lib/store';
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 createCSSSheet> & {
8
- [K in keyof T as K extends `${string}Color`
9
- ? `${string & K}${'' | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900}`
10
- : K]: T[K];
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 useThemeFromProps<T extends Record<string, unknown>>(themeObj: T, props: Record<string, string> = {}) {
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 [store, updateStore] = useStore<T>(themeObj);
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 [theme as Theme<T>, updateStore] as const;
62
+ return theme as Theme<T>;
62
63
  }
63
64
 
64
65
  /**
65
66
  * 用于 `@adoptedStyle(theme)`,类似 `createCSSSheet`
66
67
  */
67
- export function useScopedTheme<T extends Record<string, unknown>>(themeObj: T) {
68
- return useThemeFromProps(themeObj);
68
+ export function createScopedTheme<T extends Record<string, unknown>>(themeObj: T) {
69
+ return createThemeFromProps(themeObj);
69
70
  }
70
71
 
71
- /**全局主题 */
72
- export function useTheme<T extends Record<string, unknown>>(themeObj: T) {
73
- const result = useScopedTheme(themeObj);
74
- document.adoptedStyleSheets.push(result[0][SheetToken].getStyle());
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 useOverrideTheme<T extends Record<string, unknown>>(theme: Theme<T>, themeObj: Partial<T>) {
80
- return useThemeFromProps(themeObj, getThemeProps(theme));
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 useDecoratorTheme<T extends Record<string, unknown>>(themeObj: T) {
84
- const [themeAsKeys] = useThemeFromProps(themeObj);
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 updateDecorator =
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 [theme, update] = useThemeFromProps({ ...themeObj }, props);
93
+ const theme = createThemeFromProps({ ...themeObj }, props);
93
94
  this.internals.sheets.push(theme[SheetToken].getStyle(this));
94
- this.memo(() => update(access.get(this).apply(this)), getDep && (() => getDep(this) as any));
95
+ this.memo(() => theme(access.get(this).apply(this)), getDep && (() => getDep(this) as any));
95
96
  });
96
97
  };
97
- return [themeAsKeys, updateDecorator] as const;
98
+ return createUpdater(themeAsKeys, update) as ReturnType<typeof createUpdater<typeof themeAsKeys, typeof update>>;
98
99
  }
@@ -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<unknown>) {
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
@@ -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, setPrototypeOf } = Object;
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
- export const BoundaryCSSState = 'gem-style-boundary';
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) => T & ((state: Partial<T>) => void);
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
- /**自动添加 tabIndex;支持 `disabled` 属性 */
272
+ /** 自动添加 tabIndex;支持 `disabled` 属性 */
270
273
  focusable: boolean;
271
274
  }
272
275
  >;
273
276
  // 实例化时使用到,DevTools 需要读取
274
- observedStores: Store<unknown>[];
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: any = (payload: Partial<T>) => {
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
- assign(state, initState);
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));
@@ -1,6 +1,6 @@
1
1
  // https://github.com/WICG/navigation-api#stakeholder-feedback
2
2
 
3
- import { connect, useStore } from './store';
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 [store, updateHistoryStore] = useStore<HistoryState>({
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
- updateHistoryStore(state);
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
- updateHistoryStore(state);
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 [gemBasePathStore, updateBasePathStore] = useStore({
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
- updateBasePathStore({ basePath });
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
- updateHistoryStore();
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 [gemTitleStore, updateTitleStore] = useStore({ defaultTitle: document.title, url: '', title: '' });
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
- updateHistoryStore(nativeHistory.state);
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
- updateHistoryStore({
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
- updateTitleStore({ title });
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
- updateHistoryStore(newState);
315
+ store(newState);
316
316
  });
317
317
  }
318
318