@mantou/gem 1.6.5 → 1.6.8

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 (87) hide show
  1. package/README.md +6 -38
  2. package/{umd.d.ts → all.d.ts} +1 -5
  3. package/all.d.ts.map +1 -0
  4. package/all.js +14 -0
  5. package/all.js.map +1 -0
  6. package/elements/dialog-base.d.ts +1 -1
  7. package/elements/dialog-base.d.ts.map +1 -1
  8. package/elements/dialog-base.js +3 -5
  9. package/elements/dialog-base.js.map +1 -1
  10. package/elements/gesture.js +4 -4
  11. package/elements/gesture.js.map +1 -1
  12. package/elements/link.d.ts.map +1 -1
  13. package/elements/link.js +8 -15
  14. package/elements/link.js.map +1 -1
  15. package/elements/modal-base.d.ts +3 -12
  16. package/elements/modal-base.d.ts.map +1 -1
  17. package/elements/modal-base.js +6 -3
  18. package/elements/modal-base.js.map +1 -1
  19. package/elements/route.js +5 -2
  20. package/elements/route.js.map +1 -1
  21. package/helper/i18n.js +47 -58
  22. package/helper/i18n.js.map +1 -1
  23. package/helper/request.js +11 -19
  24. package/helper/request.js.map +1 -1
  25. package/index.d.ts +5 -4
  26. package/index.d.ts.map +1 -1
  27. package/index.js +4 -2
  28. package/index.js.map +1 -1
  29. package/lib/element.d.ts.map +1 -1
  30. package/lib/element.js +1 -1
  31. package/lib/element.js.map +1 -1
  32. package/lib/history.js +17 -5
  33. package/lib/history.js.map +1 -1
  34. package/lib/utils.d.ts +3 -1
  35. package/lib/utils.d.ts.map +1 -1
  36. package/lib/utils.js +5 -4
  37. package/lib/utils.js.map +1 -1
  38. package/package.json +22 -53
  39. package/src/{umd.ts → all.ts} +0 -4
  40. package/src/elements/dialog-base.ts +2 -3
  41. package/src/elements/link.ts +2 -2
  42. package/src/index.ts +4 -6
  43. package/src/lib/element.ts +2 -1
  44. package/src/lib/history.ts +1 -1
  45. package/src/lib/utils.ts +9 -4
  46. package/src/test/gem-element/advance.test.ts +1 -0
  47. package/src/test/gem-element/basic.test.ts +1 -0
  48. package/src/test/gem-element/decorators.test.ts +1 -0
  49. package/src/test/gem-element/multi.test.ts +1 -0
  50. package/src/test/history.test.ts +1 -0
  51. package/src/test/store.test.ts +1 -0
  52. package/src/test/utils.test.ts +1 -0
  53. package/src/examples/base-path/index.ts +0 -44
  54. package/src/examples/controlled/index.ts +0 -75
  55. package/src/examples/decorator/chidren.ts +0 -77
  56. package/src/examples/decorator/index.ts +0 -110
  57. package/src/examples/dialog/index.ts +0 -148
  58. package/src/examples/effect/index.ts +0 -45
  59. package/src/examples/elements/env.ts +0 -7
  60. package/src/examples/elements/layout.ts +0 -53
  61. package/src/examples/elements/nav.ts +0 -71
  62. package/src/examples/elements/source.ts +0 -68
  63. package/src/examples/gesture/canvas.ts +0 -69
  64. package/src/examples/gesture/index.ts +0 -97
  65. package/src/examples/gesture/manifest.json +0 -3
  66. package/src/examples/hash/index.ts +0 -55
  67. package/src/examples/i18n/index.ts +0 -63
  68. package/src/examples/index/index.ts +0 -33
  69. package/src/examples/index/manifest.json +0 -5
  70. package/src/examples/light-dom/index.ts +0 -31
  71. package/src/examples/multi-page/api.ts +0 -9
  72. package/src/examples/multi-page/index.ts +0 -78
  73. package/src/examples/multi-page/page-a.ts +0 -16
  74. package/src/examples/multi-page/page-b.ts +0 -12
  75. package/src/examples/multi-page/page-c.ts +0 -40
  76. package/src/examples/multi-page/store.ts +0 -10
  77. package/src/examples/perf-demo/index.ts +0 -136
  78. package/src/examples/ref-route/index.ts +0 -109
  79. package/src/examples/reflect/index.ts +0 -61
  80. package/src/examples/styled/index.ts +0 -39
  81. package/src/examples/svg-icon/index.ts +0 -31
  82. package/src/examples/theme/index.ts +0 -56
  83. package/src/examples/unsafe/index.ts +0 -29
  84. package/umd.d.ts.map +0 -1
  85. package/umd.js +0 -54
  86. package/umd.js.LICENSE.txt +0 -13
  87. package/umd.js.map +0 -1
@@ -1,68 +0,0 @@
1
- import { GemElement, html, customElement } from '../..';
2
- import { EXAMPLE, FILES } from './env';
3
-
4
- @customElement('gem-examples-source')
5
- export class Source extends GemElement {
6
- state = {
7
- files: FILES.map((file) => ({ file: file, content: '' })),
8
- current: FILES[0],
9
- };
10
- render() {
11
- const { files, current } = this.state;
12
- return html`
13
- <style>
14
- :host {
15
- border-top: 1px solid #666;
16
- overflow: auto;
17
- grid-area: source;
18
- background: #eee5;
19
- }
20
- ul {
21
- margin: 0;
22
- padding: 0 1em;
23
- display: flex;
24
- gap: 1em 2em;
25
- border-bottom: 1px solid #eee;
26
- position: sticky;
27
- top: 0;
28
- background: white;
29
- }
30
- li {
31
- cursor: pointer;
32
- line-height: 2;
33
- list-style: none;
34
- border-bottom: 2px solid transparent;
35
- }
36
- li.current {
37
- border-color: #1ecfe3;
38
- }
39
- pre {
40
- margin: 0;
41
- padding: 1em;
42
- }
43
- </style>
44
- <ul>
45
- ${FILES.map(
46
- (file) =>
47
- html`
48
- <li class=${current === file ? 'current' : ''} @click=${() => this.setState({ current: file })}>
49
- ${file}
50
- </li>
51
- `,
52
- )}
53
- </ul>
54
- <pre>${files.find((e) => e.file === current)?.content}</pre>
55
- `;
56
- }
57
- mounted() {
58
- FILES.forEach(async (file) => {
59
- const { files } = this.state;
60
- const item = files.find((e) => e.file === file);
61
- if (!item) return;
62
- item.content = await (
63
- await fetch(`https://raw.githubusercontent.com/mantou132/gem/master/src/examples/${EXAMPLE}/${file}`)
64
- ).text();
65
- this.update();
66
- });
67
- }
68
- }
@@ -1,69 +0,0 @@
1
- import { GemElement, html, customElement, property, refobject, RefObject } from '../..';
2
- import { PanEventDetail } from '../../elements/gesture';
3
-
4
- @customElement('app-canvas')
5
- export class AppCanvas extends GemElement {
6
- @property data: PanEventDetail[];
7
-
8
- @refobject canvasRef: RefObject<HTMLCanvasElement>;
9
- @refobject canvasRef1: RefObject<HTMLCanvasElement>;
10
- render() {
11
- return html`
12
- <br />
13
- <canvas ref=${this.canvasRef.ref} style="border: 1px solid"></canvas>
14
- <canvas ref=${this.canvasRef1.ref} style="border: 1px solid"></canvas>
15
- `;
16
- }
17
-
18
- mounted() {
19
- const canvas = this.canvasRef.element!;
20
- const canvas1 = this.canvasRef1.element!;
21
- const ctx = canvas.getContext('2d')!;
22
- const ctx1 = canvas1.getContext('2d')!;
23
- canvas.height = 150;
24
- canvas1.height = 150;
25
- this.effect(() => {
26
- canvas.width = 0;
27
- canvas.width = 300;
28
- canvas1.width = 0;
29
- canvas1.width = 300;
30
- const maxX = [...this.data].sort(({ x }, { x: x1 }) => {
31
- if (x > x1) return -1;
32
- return 1;
33
- })[0]?.x;
34
- ctx.fillText(String(maxX), 0, 8);
35
- const maxY = [...this.data].sort(({ y }, { y: y1 }) => {
36
- if (y > y1) return -1;
37
- return 1;
38
- })[0]?.y;
39
- ctx1.fillText(String(maxY), 0, 8);
40
- console.log('x:', this.data.map(({ x }) => x).join());
41
- console.log('y:', this.data.map(({ y }) => y).join());
42
- console.log(
43
- 'timeStamp interval:',
44
- this.data.reduce(
45
- (p, c, index) => (index ? `${p}, ${(c.timeStamp - this.data[index - 1].timeStamp).toFixed()}` : ''),
46
- '',
47
- ),
48
- );
49
- this.data.forEach((data, index) => {
50
- const y = 150 - data.x * (150 / maxX);
51
- const y1 = 150 - data.y * (150 / maxY);
52
- const x = index * (300 / this.data.length);
53
- if (index === 0) {
54
- ctx.beginPath();
55
- ctx.moveTo(x, y);
56
- ctx1.beginPath();
57
- ctx1.moveTo(x, y1);
58
- } else {
59
- ctx.lineTo(x, y);
60
- ctx1.lineTo(x, y1);
61
- }
62
- if (index === this.data.length - 1) {
63
- ctx.stroke();
64
- ctx1.stroke();
65
- }
66
- });
67
- });
68
- }
69
- }
@@ -1,97 +0,0 @@
1
- import { render, GemElement, html, customElement, refobject, RefObject } from '../..';
2
-
3
- import '../../elements/gesture';
4
- import { PanEventDetail, PinchEventDetail, RotateEventDetail, SwipeEventDetail } from '../../elements/gesture';
5
- import '../elements/layout';
6
- import './canvas';
7
-
8
- @customElement('app-root')
9
- export class AppRoot extends GemElement {
10
- @refobject gestureRef: RefObject<any>;
11
- state = {
12
- x: 0,
13
- y: 0,
14
- duration: 0,
15
- scale: 1,
16
- rotate: 0,
17
- swipe: '',
18
- moves: [],
19
- };
20
- onPan = (evt: CustomEvent<PanEventDetail>) => {
21
- const { detail } = evt;
22
- const { x, y } = this.state;
23
- this.setState({ x: detail.x + x, y: detail.y + y, duration: 0 });
24
- };
25
- onPinch = (evt: CustomEvent<PinchEventDetail>) => {
26
- this.setState({ scale: evt.detail.scale * this.state.scale });
27
- };
28
- onRotate = (evt: CustomEvent<RotateEventDetail>) => {
29
- this.setState({ rotate: evt.detail.rotate + this.state.rotate });
30
- };
31
- onSwipe = (e: CustomEvent<SwipeEventDetail>) => {
32
- this.setState({ swipe: `${e.detail.direction}, speed: ${e.detail.speed}` });
33
- };
34
- onEnd = () => {
35
- this.setState({
36
- x: 0,
37
- y: 0,
38
- duration: 0.5,
39
- scale: 1,
40
- rotate: 0,
41
- swipe: '',
42
- moves: [...this.gestureRef.element.movesMap.values().next().value],
43
- });
44
- };
45
- render() {
46
- const { x, y, scale, rotate, duration, swipe, moves } = this.state;
47
- return html`
48
- <style>
49
- img {
50
- translate: ${x}px ${y}px;
51
- scale: ${scale};
52
- rotate: ${rotate}deg;
53
- transition: all ${duration}s;
54
- }
55
- </style>
56
- <gem-gesture
57
- ref=${this.gestureRef.ref}
58
- @pan=${this.onPan}
59
- @end=${this.onEnd}
60
- @pinch=${this.onPinch}
61
- @rotate=${this.onRotate}
62
- @press=${console.log}
63
- @swipe=${this.onSwipe}
64
- touch-action="pan-y"
65
- >
66
- <gem-gesture
67
- @pan=${console.log}
68
- @end=${console.log}
69
- @pinch=${console.log}
70
- @rotate=${console.log}
71
- @press=${console.log}
72
- @swipe=${console.log}
73
- touch-action="pan-y"
74
- >
75
- <img src="https://gem-book.js.org/logo.png" width="200" />
76
- </gem-gesture>
77
- <div>${moves[moves.length - 1] ? `${JSON.stringify(moves[moves.length - 1])}` : ''}</div>
78
- <div>${swipe}</div>
79
- <app-canvas .data=${moves}></app-canvas>
80
- </gem-gesture>
81
- `;
82
- }
83
- }
84
-
85
- render(
86
- html`
87
- <style>
88
- body {
89
- overscroll-behavior: contain;
90
- }
91
- </style>
92
- <gem-examples-layout>
93
- <app-root slot="main"></app-root>
94
- </gem-examples-layout>
95
- `,
96
- document.body,
97
- );
@@ -1,3 +0,0 @@
1
- {
2
- "desc": ""
3
- }
@@ -1,55 +0,0 @@
1
- import { GemElement, render, html } from '../../';
2
- import '../../elements/link';
3
-
4
- import '../elements/layout';
5
-
6
- class Article extends GemElement {
7
- constructor() {
8
- super();
9
- window.addEventListener('hashchange', this.checkHash);
10
- }
11
-
12
- mounted = () => {
13
- // 在当前页面刷新浏览器会保留滚动位置
14
- // 开新窗口测试带 hash 链接
15
- this.checkHash();
16
- };
17
-
18
- unmounted = () => {
19
- window.removeEventListener('hashchange', this.checkHash);
20
- };
21
-
22
- checkHash = () => {
23
- if (this.id === location.hash.substr(1)) {
24
- this.scrollIntoView();
25
- }
26
- };
27
-
28
- render() {
29
- return html`<div style="height: 1000px"><slot></slot></div>`;
30
- }
31
- }
32
- customElements.define('app-article', Article);
33
-
34
- class App extends GemElement {
35
- render() {
36
- return html`
37
- <a href="#article-1">${'<a href="#article-1">'}</a>
38
- <a href="#article-2">${'<a href="#article-2">'}</a>
39
- <gem-link path="/" hash="#article-1"><button>go #article-1</button></gem-link>
40
- <gem-link path="/" hash="#article-2"><button>go #article-2</button></gem-link>
41
- <app-article id="article-1" style="display: block; margin-top: 100px;">article-1</app-article>
42
- <app-article id="article-2" style="display: block; margin-top: 100px;">article-2</app-article>
43
- `;
44
- }
45
- }
46
- customElements.define('app-root', App);
47
-
48
- render(
49
- html`
50
- <gem-examples-layout>
51
- <app-root slot="main"></app-root>
52
- </gem-examples-layout>
53
- `,
54
- document.body,
55
- );
@@ -1,63 +0,0 @@
1
- import { GemElement, html, connectStore, customElement, render } from '../../';
2
-
3
- import '../elements/layout';
4
-
5
- import { I18n } from '../../helper/i18n';
6
-
7
- const en = {
8
- title: 'This is I18n',
9
- hello: 'Hello, $1! $2=> $1, Hello!',
10
- detail: 'See $1<detail>, $1<detail2>',
11
- };
12
- const i18n = new I18n<typeof en>({
13
- cache: true,
14
- fallbackLanguage: 'en',
15
- resources: {
16
- en,
17
- de: {
18
- title: 'Das ist I18n',
19
- },
20
- zh: 'data:text/plain;base64,eyJ0aXRsZSI6Iui/meaYr0kxOG4ifQ==',
21
- },
22
- onChange: console.log,
23
- });
24
-
25
- const i18nModule = i18n.createSubModule<typeof en>('test', {
26
- en,
27
- de: {
28
- title: 'Das ist I18n',
29
- },
30
- zh: 'data:text/plain;base64,eyJ0aXRsZSI6Iui/meaYr0kxOG4ifQ==',
31
- });
32
-
33
- @connectStore(i18n.store)
34
- @connectStore(i18nModule.store)
35
- @customElement('app-root')
36
- export class App extends GemElement {
37
- render() {
38
- return html`
39
- <button @click=${() => i18n.setLanguage('de')}>de</button>
40
- <button @click=${() => i18n.setLanguage('zh')}>zh</button>
41
- <button @click=${() => i18n.setLanguage('en')}>en</button>
42
- <button @click=${() => i18n.resetLanguage()}>reset</button>
43
- <p>Current language: ${i18n.currentLanguage}</p>
44
- <p>${i18n.get('title')}</p>
45
- <p>${i18n.get('hello', 'World', 'reverse')}</p>
46
- <p>${i18n.get('detail', (s) => html`<a href="#">${s}</a>`)}</p>
47
-
48
- <h2>sub module</h2>
49
- <p>${i18nModule.get('title')}</p>
50
- <p>${i18nModule.get('hello', 'World', 'reverse')}</p>
51
- <p>${i18nModule.get('detail', (s) => html`<a href="#">${s}</a>`)}</p>
52
- `;
53
- }
54
- }
55
-
56
- render(
57
- html`
58
- <gem-examples-layout>
59
- <app-root slot="main"></app-root>
60
- </gem-examples-layout>
61
- `,
62
- document.body,
63
- );
@@ -1,33 +0,0 @@
1
- import { render, GemElement, createStore, updateStore, html } from '../../';
2
- import { connectStore, customElement } from '../../lib/decorators';
3
-
4
- import '../elements/layout';
5
-
6
- // 新建全局数据对象
7
- const store = createStore({
8
- a: 1,
9
- });
10
-
11
- // 定义自定义元素
12
- @customElement('app-root')
13
- @connectStore(store)
14
- export class HelloWorld extends GemElement {
15
- clickHandle = () => {
16
- updateStore(store, { a: ++store.a });
17
- };
18
- render() {
19
- return html`
20
- <button @click="${this.clickHandle}">Hello, World</button>
21
- <div>store.a: ${store.a}</div>
22
- `;
23
- }
24
- }
25
-
26
- render(
27
- html`
28
- <gem-examples-layout>
29
- <app-root slot="main"></app-root>
30
- </gem-examples-layout>
31
- `,
32
- document.body,
33
- );
@@ -1,5 +0,0 @@
1
- {
2
- "order": -1,
3
- "name": "hello world",
4
- "desc": ""
5
- }
@@ -1,31 +0,0 @@
1
- import { GemElement, html, render } from '../../';
2
-
3
- import '../elements/layout';
4
-
5
- export class App extends GemElement {
6
- state = { now: 0 };
7
- constructor() {
8
- super({ isLight: true });
9
- setInterval(() => {
10
- this.setState({ now: Date.now() });
11
- }, 1000);
12
- }
13
-
14
- render() {
15
- return html`
16
- <div>hello world!</div>
17
- <time>${this.state.now}</time>
18
- `;
19
- }
20
- }
21
-
22
- customElements.define('app-root', App);
23
-
24
- render(
25
- html`
26
- <gem-examples-layout>
27
- <app-root slot="main"></app-root>
28
- </gem-examples-layout>
29
- `,
30
- document.body,
31
- );
@@ -1,9 +0,0 @@
1
- import { updateStore } from '../../';
2
- import store from './store';
3
-
4
- export default {
5
- async getData() {
6
- const text = await new Promise<string>((res) => setTimeout(() => res('pageA async data'), 1000));
7
- updateStore(store.pageA, { text });
8
- },
9
- };
@@ -1,78 +0,0 @@
1
- import { GemElement, html, render } from '../../';
2
- import { GemTitleElement } from '../../elements/title';
3
- import '../../elements/route';
4
- import '../../elements/link';
5
-
6
- import '../elements/layout';
7
-
8
- import './page-b';
9
- import './page-c';
10
-
11
- const routes = [
12
- {
13
- pattern: '/',
14
- redirect: '/c/e',
15
- },
16
- {
17
- title: 'Page A Title',
18
- pattern: '/a',
19
- get content() {
20
- import('./page-a');
21
- return html`<app-page-a>A: </app-page-a>`;
22
- },
23
- },
24
- {
25
- title: 'Page B Title',
26
- pattern: '/B',
27
- content: html` <app-page-b>B: </app-page-b> `,
28
- },
29
- {
30
- title: 'Page C Title',
31
- pattern: '/c/*',
32
- content: html`<app-page-c>C: </app-page-c>`,
33
- },
34
- {
35
- pattern: '/',
36
- content: html`<div>hello</div>`,
37
- },
38
- ];
39
-
40
- class App extends GemElement {
41
- render() {
42
- return html`
43
- <style>
44
- :host {
45
- text-align: center;
46
- }
47
- gem-link {
48
- cursor: pointer;
49
- }
50
- gem-link + gem-link {
51
- margin-left: 0.5em;
52
- }
53
- gem-link:hover {
54
- text-decoration: underline;
55
- }
56
- </style>
57
- <header><gem-title suffix=${GemTitleElement.defaultSuffix}>AppName</gem-title></header>
58
- <nav>
59
- <gem-link path="/">Home</gem-link>
60
- <gem-link path="/A">PageA</gem-link>
61
- <gem-link path="/b">PageB</gem-link>
62
- <gem-link path="/c/e" pattern="/c/*">PageC</gem-link>
63
- </nav>
64
- <main><gem-light-route .routes=${routes}></gem-light-route></main>
65
- `;
66
- }
67
- }
68
-
69
- customElements.define('app-root', App);
70
-
71
- render(
72
- html`
73
- <gem-examples-layout>
74
- <app-root slot="main"></app-root>
75
- </gem-examples-layout>
76
- `,
77
- document.body,
78
- );
@@ -1,16 +0,0 @@
1
- import { GemElement, html } from '../../';
2
- import storeSet from './store';
3
- import api from './api';
4
-
5
- customElements.define(
6
- 'app-page-a',
7
- class extends GemElement {
8
- static observedStores = [storeSet.pageA];
9
- mounted() {
10
- api.getData();
11
- }
12
- render() {
13
- return html`<slot></slot> ${storeSet.pageA.text}`;
14
- }
15
- },
16
- );
@@ -1,12 +0,0 @@
1
- import { GemElement, html } from '../../';
2
- import storeSet from './store';
3
-
4
- customElements.define(
5
- 'app-page-b',
6
- class extends GemElement {
7
- static observedStores = [storeSet.pageB];
8
- render() {
9
- return html`<slot></slot> ${storeSet.pageB.text}`;
10
- }
11
- },
12
- );
@@ -1,40 +0,0 @@
1
- import { GemElement, html } from '../../';
2
- import '../../elements/route';
3
- import '../../elements/link';
4
-
5
- const routes = [
6
- {
7
- title: 'ccccccd',
8
- pattern: '/c/d',
9
- content: html`<div>C/D</div>`,
10
- },
11
- {
12
- // `title` 未设置会使用父路由标题
13
- pattern: '/c/e',
14
- content: html`<div>C/E</div>`,
15
- },
16
- {
17
- pattern: '/c/*',
18
- content: html`<div>C/E</div>`,
19
- },
20
- ];
21
-
22
- customElements.define(
23
- 'app-page-c',
24
- class extends GemElement {
25
- render() {
26
- return html`
27
- <style>
28
- gem-link + gem-link {
29
- margin-left: 0.5em;
30
- }
31
- </style>
32
- <gem-link path="./d">Page c/d</gem-link>
33
- <gem-link path="./e">Page c/e</gem-link>
34
- <gem-route .routes=${routes}></gem-route>
35
- inert route:
36
- <gem-route ?inert=${true} .routes=${routes}></gem-route>
37
- `;
38
- }
39
- },
40
- );
@@ -1,10 +0,0 @@
1
- import { createStoreSet } from '../../';
2
-
3
- export default createStoreSet({
4
- pageA: {
5
- text: 'this is page A',
6
- },
7
- pageB: {
8
- text: 'this is page B',
9
- },
10
- });