@mantou/gem 1.6.4 → 1.6.10

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 (158) hide show
  1. package/README.md +6 -38
  2. package/dist/gem.es.js +3260 -0
  3. package/dist/gem.umd.js +229 -0
  4. package/elements/{dialog-base.d.ts → base/dialog.d.ts} +4 -4
  5. package/elements/base/dialog.d.ts.map +1 -0
  6. package/elements/{dialog-base.js → base/dialog.js} +26 -28
  7. package/elements/base/dialog.js.map +1 -0
  8. package/elements/base/gesture.d.ts +66 -0
  9. package/elements/base/gesture.d.ts.map +1 -0
  10. package/elements/base/gesture.js +214 -0
  11. package/elements/base/gesture.js.map +1 -0
  12. package/elements/base/link.d.ts +44 -0
  13. package/elements/base/link.d.ts.map +1 -0
  14. package/elements/base/link.js +206 -0
  15. package/elements/base/link.js.map +1 -0
  16. package/elements/{modal-base.d.ts → base/modal-factory.d.ts} +20 -20
  17. package/elements/base/modal-factory.d.ts.map +1 -0
  18. package/elements/{modal-base.js → base/modal-factory.js} +10 -7
  19. package/elements/base/modal-factory.js.map +1 -0
  20. package/elements/base/reflect.d.ts +6 -0
  21. package/elements/base/reflect.d.ts.map +1 -0
  22. package/elements/base/reflect.js +33 -0
  23. package/elements/base/reflect.js.map +1 -0
  24. package/elements/base/route.d.ts +78 -0
  25. package/elements/base/route.d.ts.map +1 -0
  26. package/elements/base/route.js +220 -0
  27. package/elements/base/route.js.map +1 -0
  28. package/elements/base/title.d.ts +30 -0
  29. package/elements/base/title.d.ts.map +1 -0
  30. package/elements/base/title.js +74 -0
  31. package/elements/base/title.js.map +1 -0
  32. package/elements/base/unsafe.d.ts +14 -0
  33. package/elements/base/unsafe.d.ts.map +1 -0
  34. package/elements/base/unsafe.js +42 -0
  35. package/elements/base/unsafe.js.map +1 -0
  36. package/elements/base/use.d.ts +19 -0
  37. package/elements/base/use.d.ts.map +1 -0
  38. package/elements/base/use.js +70 -0
  39. package/elements/base/use.js.map +1 -0
  40. package/elements/gesture.d.ts +1 -67
  41. package/elements/gesture.d.ts.map +1 -1
  42. package/elements/gesture.js +3 -219
  43. package/elements/gesture.js.map +1 -1
  44. package/elements/link.d.ts +1 -45
  45. package/elements/link.d.ts.map +1 -1
  46. package/elements/link.js +4 -215
  47. package/elements/link.js.map +1 -1
  48. package/elements/reflect.d.ts +1 -8
  49. package/elements/reflect.d.ts.map +1 -1
  50. package/elements/reflect.js +3 -39
  51. package/elements/reflect.js.map +1 -1
  52. package/elements/route.d.ts +1 -81
  53. package/elements/route.d.ts.map +1 -1
  54. package/elements/route.js +4 -225
  55. package/elements/route.js.map +1 -1
  56. package/elements/title.d.ts +1 -30
  57. package/elements/title.d.ts.map +1 -1
  58. package/elements/title.js +3 -75
  59. package/elements/title.js.map +1 -1
  60. package/elements/unsafe.d.ts +1 -14
  61. package/elements/unsafe.d.ts.map +1 -1
  62. package/elements/unsafe.js +3 -46
  63. package/elements/unsafe.js.map +1 -1
  64. package/elements/use.d.ts +1 -19
  65. package/elements/use.d.ts.map +1 -1
  66. package/elements/use.js +3 -74
  67. package/elements/use.js.map +1 -1
  68. package/helper/i18n.js +47 -58
  69. package/helper/i18n.js.map +1 -1
  70. package/helper/request.js +11 -19
  71. package/helper/request.js.map +1 -1
  72. package/index.d.ts +5 -4
  73. package/index.d.ts.map +1 -1
  74. package/index.js +4 -2
  75. package/index.js.map +1 -1
  76. package/lib/element.d.ts.map +1 -1
  77. package/lib/element.js +1 -1
  78. package/lib/element.js.map +1 -1
  79. package/lib/history.d.ts +28 -16
  80. package/lib/history.d.ts.map +1 -1
  81. package/lib/history.js +179 -169
  82. package/lib/history.js.map +1 -1
  83. package/lib/utils.d.ts +3 -1
  84. package/lib/utils.d.ts.map +1 -1
  85. package/lib/utils.js +7 -5
  86. package/lib/utils.js.map +1 -1
  87. package/lib/version.d.ts +1 -1
  88. package/lib/version.js +1 -1
  89. package/package.json +25 -53
  90. package/src/{umd.ts → dist.ts} +4 -5
  91. package/src/elements/{dialog-base.ts → base/dialog.ts} +6 -7
  92. package/src/elements/base/gesture.ts +256 -0
  93. package/src/elements/base/link.ts +178 -0
  94. package/src/elements/{modal-base.ts → base/modal-factory.ts} +3 -3
  95. package/src/elements/base/reflect.ts +29 -0
  96. package/src/elements/base/route.ts +244 -0
  97. package/src/elements/base/title.ts +68 -0
  98. package/src/elements/base/unsafe.ts +37 -0
  99. package/src/elements/base/use.ts +57 -0
  100. package/src/elements/gesture.ts +3 -257
  101. package/src/elements/link.ts +4 -179
  102. package/src/elements/reflect.ts +3 -31
  103. package/src/elements/route.ts +4 -248
  104. package/src/elements/title.ts +3 -68
  105. package/src/elements/unsafe.ts +3 -37
  106. package/src/elements/use.ts +3 -57
  107. package/src/index.ts +4 -6
  108. package/src/lib/element.ts +2 -1
  109. package/src/lib/history.ts +183 -195
  110. package/src/lib/utils.ts +11 -5
  111. package/src/lib/version.ts +1 -1
  112. package/src/test/gem-element/advance.test.ts +1 -0
  113. package/src/test/gem-element/basic.test.ts +1 -0
  114. package/src/test/gem-element/decorators.test.ts +1 -0
  115. package/src/test/gem-element/multi.test.ts +1 -0
  116. package/src/test/history.test.ts +16 -10
  117. package/src/test/store.test.ts +1 -0
  118. package/src/test/utils.test.ts +1 -0
  119. package/elements/dialog-base.d.ts.map +0 -1
  120. package/elements/dialog-base.js.map +0 -1
  121. package/elements/modal-base.d.ts.map +0 -1
  122. package/elements/modal-base.js.map +0 -1
  123. package/src/examples/base-path/index.ts +0 -44
  124. package/src/examples/controlled/index.ts +0 -75
  125. package/src/examples/decorator/chidren.ts +0 -77
  126. package/src/examples/decorator/index.ts +0 -110
  127. package/src/examples/dialog/index.ts +0 -148
  128. package/src/examples/effect/index.ts +0 -45
  129. package/src/examples/elements/env.ts +0 -7
  130. package/src/examples/elements/layout.ts +0 -53
  131. package/src/examples/elements/nav.ts +0 -71
  132. package/src/examples/elements/source.ts +0 -68
  133. package/src/examples/gesture/canvas.ts +0 -69
  134. package/src/examples/gesture/index.ts +0 -97
  135. package/src/examples/gesture/manifest.json +0 -3
  136. package/src/examples/hash/index.ts +0 -55
  137. package/src/examples/i18n/index.ts +0 -63
  138. package/src/examples/index/index.ts +0 -33
  139. package/src/examples/index/manifest.json +0 -5
  140. package/src/examples/light-dom/index.ts +0 -31
  141. package/src/examples/multi-page/api.ts +0 -9
  142. package/src/examples/multi-page/index.ts +0 -78
  143. package/src/examples/multi-page/page-a.ts +0 -16
  144. package/src/examples/multi-page/page-b.ts +0 -12
  145. package/src/examples/multi-page/page-c.ts +0 -40
  146. package/src/examples/multi-page/store.ts +0 -10
  147. package/src/examples/perf-demo/index.ts +0 -136
  148. package/src/examples/ref-route/index.ts +0 -109
  149. package/src/examples/reflect/index.ts +0 -61
  150. package/src/examples/styled/index.ts +0 -39
  151. package/src/examples/svg-icon/index.ts +0 -31
  152. package/src/examples/theme/index.ts +0 -56
  153. package/src/examples/unsafe/index.ts +0 -29
  154. package/umd.d.ts +0 -18
  155. package/umd.d.ts.map +0 -1
  156. package/umd.js +0 -54
  157. package/umd.js.LICENSE.txt +0 -13
  158. package/umd.js.map +0 -1
@@ -1,44 +0,0 @@
1
- import { GemElement, html, history, render, customElement } from '../../';
2
- import '../../elements/link';
3
-
4
- import '../elements/layout';
5
-
6
- @customElement('app-root')
7
- export class App extends GemElement {
8
- state = {
9
- count: 5,
10
- };
11
- constructor() {
12
- super();
13
- this.onclick = () => {
14
- this.setState({ count: this.state.count - 1 });
15
- if (!this.state.count) {
16
- history.basePath = '/base-path';
17
- }
18
- };
19
- }
20
- render() {
21
- return html`
22
- <main>
23
- ${this.state.count > 0
24
- ? html`<div>${this.state.count} 次后将改变 \`basePath\`</div>`
25
- : html`<div>\`basePath\` 为 ${history.basePath}</div>`}
26
- <gem-link href="/a">href="/a"</gem-link>
27
- <button @click=${() => history.push({ path: '/b' })}>push({ path: '/b' })</button>
28
- <button @click=${() => history.push({ hash: '#b' })}>push({ hash: '#b' })</button>
29
- <button @click=${() => history.pushIgnoreCloseHandle({ path: '/c' })}>
30
- push({ pushIgnoreCloseHandle: '/c' })
31
- </button>
32
- </main>
33
- `;
34
- }
35
- }
36
-
37
- render(
38
- html`
39
- <gem-examples-layout>
40
- <app-root slot="main"></app-root>
41
- </gem-examples-layout>
42
- `,
43
- document.body,
44
- );
@@ -1,75 +0,0 @@
1
- import { html, customElement, GemElement, render, attribute, emitter, Emitter, refobject, RefObject } from '../../';
2
-
3
- import '../elements/layout';
4
-
5
- @customElement('app-form-text')
6
- export class FormText extends GemElement {
7
- @refobject inputRef: RefObject<HTMLInputElement>;
8
- @attribute value: string;
9
- @emitter change: Emitter<string>;
10
-
11
- nextState = {
12
- value: '',
13
- selectionStart: 0,
14
- selectionEnd: 0,
15
- };
16
-
17
- mounted() {
18
- this.effect(
19
- () => {
20
- const { element } = this.inputRef;
21
- if (!element) return;
22
- if (this.value === this.nextState.value) {
23
- element.value = this.nextState.value;
24
- element.selectionStart = this.nextState.selectionStart;
25
- element.selectionEnd = this.nextState.selectionEnd;
26
- } else {
27
- element.value = this.value;
28
- }
29
- },
30
- () => [this.value],
31
- );
32
- }
33
-
34
- inputHandle = (e: InputEvent) => {
35
- if (!e.isComposing) {
36
- const { element } = this.inputRef;
37
- if (!element) return;
38
- const { value, selectionStart, selectionEnd } = element;
39
- this.nextState = {
40
- value,
41
- selectionStart: selectionStart || 0,
42
- selectionEnd: selectionEnd || 0,
43
- };
44
- element.value = this.value;
45
- this.change(value);
46
- }
47
- };
48
-
49
- render() {
50
- return html`<input ref=${this.inputRef.ref} @input=${this.inputHandle} />`;
51
- }
52
- }
53
-
54
- @customElement('app-root')
55
- export class Root extends GemElement {
56
- state = { value: '' };
57
-
58
- changeHandle = (e: CustomEvent<string>) => this.setState({ value: e.detail });
59
-
60
- render() {
61
- return html`
62
- Controlled input:
63
- <app-form-text @change=${this.changeHandle} value=${this.state.value}></app-form-text>
64
- `;
65
- }
66
- }
67
-
68
- render(
69
- html`
70
- <gem-examples-layout>
71
- <app-root slot="main"></app-root>
72
- </gem-examples-layout>
73
- `,
74
- document.body,
75
- );
@@ -1,77 +0,0 @@
1
- import {
2
- GemElement,
3
- html,
4
- property,
5
- attribute,
6
- slot,
7
- part,
8
- state,
9
- emitter,
10
- Emitter,
11
- customElement,
12
- numattribute,
13
- boolattribute,
14
- rootElement,
15
- } from '../../';
16
-
17
- export type Message = number[];
18
-
19
- /**
20
- * @attr first-name
21
- * @attr last-name
22
- * @attr count
23
- * @attr disabled
24
- * @fires say-hi
25
- * @fires load
26
- * @state odd
27
- * @slot light
28
- * @part paragraph
29
- */
30
- @customElement('app-children')
31
- @rootElement('app-root')
32
- export class Children extends GemElement {
33
- @slot static light: string;
34
- @part static paragraph: string;
35
-
36
- @attribute firstName: string;
37
- @attribute lastName: string;
38
- @numattribute count: number;
39
- @boolattribute disabled: boolean;
40
- @property message: Message | undefined;
41
- @emitter sayHi: Emitter;
42
- @emitter load: Emitter;
43
- @state odd: boolean;
44
-
45
- constructor() {
46
- super();
47
- console.log('child cons');
48
- }
49
-
50
- mounted = () => {
51
- console.log('child mounted');
52
- setTimeout(() => this.load(new Date()), 1000);
53
- this.addEventListener('click', () => {
54
- this.odd = !this.odd;
55
- });
56
- };
57
-
58
- updated = () => {
59
- console.log('child updated');
60
- };
61
-
62
- render() {
63
- console.log('child render');
64
- return html`
65
- <p>
66
- attributes:
67
- <span>${this.firstName},</span>
68
- <span>${this.lastName},</span>
69
- <span>${this.disabled},</span>
70
- <span>${this.count}.</span>
71
- </p>
72
- <p part=${Children.paragraph}>properties: ${JSON.stringify(this.message)}</p>
73
- <slot name=${Children.light}></slot>
74
- <button @click=${() => this.sayHi({}, { bubbles: true, composed: true })}>say hi</button>
75
- `;
76
- }
77
- }
@@ -1,110 +0,0 @@
1
- import {
2
- createStore,
3
- updateStore,
4
- createCSSSheet,
5
- GemElement,
6
- html,
7
- refobject,
8
- RefObject,
9
- attribute,
10
- connectStore,
11
- customElement,
12
- adoptedStyle,
13
- css,
14
- render,
15
- } from '../../';
16
-
17
- import '../elements/layout';
18
-
19
- import { Message, Children } from './chidren';
20
- import './chidren';
21
-
22
- interface GlobalState {
23
- msg: Message;
24
- now: Date;
25
- }
26
-
27
- const store = createStore<GlobalState>({
28
- msg: [1, 2],
29
- now: new Date(),
30
- });
31
-
32
- const styles = createCSSSheet(css`
33
- h1 {
34
- text-decoration: underline;
35
- }
36
- `);
37
-
38
- @connectStore(store)
39
- @adoptedStyle(styles)
40
- @customElement('app-root')
41
- export class App extends GemElement {
42
- @refobject childRef: RefObject<Children>;
43
- @attribute appTitle: string;
44
-
45
- constructor(title: string) {
46
- super();
47
- this.appTitle = title;
48
- console.log('parent cons');
49
- }
50
-
51
- mounted = () => {
52
- console.log('parent mounted');
53
- };
54
-
55
- updated = () => {
56
- console.log('parent updated');
57
- };
58
-
59
- onSayHi = () => {
60
- const [foo, bar] = store.msg;
61
- updateStore(store, {
62
- msg: [bar, foo],
63
- now: new Date(),
64
- });
65
- };
66
-
67
- loadHandle = () => {
68
- const { element } = this.childRef;
69
- if (!element) return;
70
- const { firstName, lastName, disabled, count } = element;
71
- console.log({ firstName, lastName, disabled, count });
72
- };
73
-
74
- render() {
75
- console.log('parent render');
76
- return html`
77
- <style>
78
- app-children:where(:--odd, [data-odd])::part(${Children.paragraph}) {
79
- color: red;
80
- }
81
- </style>
82
- <h1>${this.appTitle}</h1>
83
- <app-children
84
- ref=${this.childRef.ref}
85
- @load=${this.loadHandle}
86
- @say-hi=${this.onSayHi}
87
- .message=${store.msg}
88
- first-name="hello"
89
- last-name="world"
90
- count=${1}
91
- disabled
92
- >
93
- <p slot=${Children.light}>now: ${store.now}</p>
94
- </app-children>
95
- `;
96
- }
97
- }
98
-
99
- document.addEventListener('say-hi', (e: CustomEvent) => {
100
- console.log('`sayhi` target', e.composedPath()[0]);
101
- });
102
-
103
- render(
104
- html`
105
- <gem-examples-layout>
106
- <app-root app-title="I'm Title" slot="main"></app-root>
107
- </gem-examples-layout>
108
- `,
109
- document.body,
110
- );
@@ -1,148 +0,0 @@
1
- import { GemElement, html, customElement, refobject, RefObject, render } from '../../';
2
- import { createModalClass } from '../../elements/modal-base';
3
- import { DialogBaseElement } from '../../elements/dialog-base';
4
- import '../../elements/link';
5
-
6
- import '../elements/layout';
7
-
8
- @customElement('app-confirm')
9
- class Confirm extends createModalClass({
10
- content: html``,
11
- confirmHandle: () => {
12
- /** */
13
- },
14
- }) {
15
- label = 'confirm title';
16
-
17
- confirm = () => {
18
- Confirm.close();
19
- Confirm.store.confirmHandle();
20
- };
21
-
22
- render() {
23
- return html`
24
- <style>
25
- .root {
26
- position: fixed;
27
- z-index: 3;
28
- top: 0;
29
- left: 0;
30
- width: 100%;
31
- height: 100%;
32
- background: rgba(0, 0, 0, 0.5);
33
- }
34
- .body {
35
- position: absolute;
36
- top: 50%;
37
- left: 50%;
38
- transform: translate(-50%, -50%);
39
- width: 200px;
40
- height: 100px;
41
- background: white;
42
- }
43
- </style>
44
- <div class="root" ?hidden=${!Confirm.isOpen}>
45
- <div class="body">
46
- <h2>${Confirm.store.content}</h2>
47
- <button @click=${this.confirm}>close dialog</button>
48
- </div>
49
- </div>
50
- `;
51
- }
52
- }
53
-
54
- @customElement('app-dialog')
55
- class Dialog extends DialogBaseElement {
56
- shouldClose = () => {
57
- if (this.opened) {
58
- Confirm.open({
59
- content: html`Confirm?`,
60
- confirmHandle: this.forceClose, // 不能使用 `close` 方法
61
- });
62
- return false;
63
- } else {
64
- return true;
65
- }
66
- };
67
-
68
- render() {
69
- return html`
70
- <style>
71
- :host {
72
- display: none;
73
- }
74
- :host(:where(:--opened, [data-opened])) {
75
- display: block;
76
- }
77
- .root {
78
- position: fixed;
79
- z-index: 2;
80
- top: 0;
81
- left: 0;
82
- width: 100%;
83
- height: 100%;
84
- background: rgba(0, 0, 0, 0.5);
85
- backdrop-filter: blur(5px);
86
- }
87
- .body {
88
- position: absolute;
89
- top: 50%;
90
- left: 50%;
91
- transform: translate(-50%, -50%);
92
- width: 300px;
93
- height: 200px;
94
- background: white;
95
- }
96
- </style>
97
- <div class="root">
98
- <div class="body">
99
- <h2>Dialog Title</h2>
100
- <slot></slot>
101
- <button @click=${this.close}>x</button>
102
- </div>
103
- </div>
104
- `;
105
- }
106
- }
107
-
108
- @customElement('app-root')
109
- export class Root extends GemElement {
110
- @refobject dialog: RefObject<Dialog>;
111
-
112
- state = {
113
- modal: false,
114
- };
115
-
116
- clickHandle = () => {
117
- this.dialog.element?.open();
118
- };
119
-
120
- render() {
121
- return html`
122
- <style>
123
- :host {
124
- font-size: x-large;
125
- }
126
- </style>
127
- <button ?inert=${this.state.modal} @click="${this.clickHandle}">open dialog</button>
128
- <app-dialog
129
- label="dialog title"
130
- ref=${this.dialog.ref}
131
- @open=${() => this.setState({ modal: true })}
132
- @close=${() => this.setState({ modal: false })}
133
- >
134
- <div>dialog body</div>
135
- <gem-link path="/hi" style="cursor: pointer; color: blue">replace route</gem-link>
136
- </app-dialog>
137
- `;
138
- }
139
- }
140
-
141
- render(
142
- html`
143
- <gem-examples-layout>
144
- <app-root slot="main"></app-root>
145
- </gem-examples-layout>
146
- `,
147
- document.body,
148
- );
@@ -1,45 +0,0 @@
1
- import { GemElement, html, customElement, RefObject, refobject, render } from '../../';
2
-
3
- import '../elements/layout';
4
-
5
- function effect([textareaElement, callback]: [HTMLTextAreaElement | undefined, (height: number) => void]) {
6
- if (!textareaElement) return callback(0);
7
- const ro = new ResizeObserver(([entry]: [any]) => {
8
- callback(entry.contentRect.height);
9
- });
10
- ro.observe(textareaElement, {});
11
- return () => ro.disconnect();
12
- }
13
-
14
- @customElement('app-root')
15
- export class App extends GemElement {
16
- @refobject textAreaRef: RefObject<HTMLTextAreaElement>;
17
- state = {
18
- height: 0,
19
- hidden: false,
20
- };
21
-
22
- #updateHeight = (height: number) => {
23
- this.setState({ height });
24
- };
25
-
26
- render() {
27
- return html`
28
- <div><button @click=${() => this.setState({ hidden: !this.state.hidden })}>switch</button></div>
29
- ${this.state.hidden ? null : html`<textarea ref=${this.textAreaRef.ref}></textarea>`}
30
- <div>${this.state.height}</div>
31
- `;
32
- }
33
- mounted() {
34
- this.effect(effect, () => [this.textAreaRef.element, this.#updateHeight]);
35
- }
36
- }
37
-
38
- render(
39
- html`
40
- <gem-examples-layout>
41
- <app-root slot="main"></app-root>
42
- </gem-examples-layout>
43
- `,
44
- document.body,
45
- );
@@ -1,7 +0,0 @@
1
- type Manifest = typeof import('../index/manifest.json');
2
-
3
- export const MATADATA = process.env.METADATA as unknown as Record<string, Partial<Manifest>>;
4
- export const EXAMPLES = process.env.EXAMPLES as unknown as string[];
5
- export const EXAMPLE = process.env.EXAMPLE as string;
6
- export const FILES = process.env.FILES as unknown as string[];
7
- export const PATH = process.env.TAEGET === 'pages' && EXAMPLE !== 'index' ? EXAMPLE : '';
@@ -1,53 +0,0 @@
1
- import { GemElement, html } from '../../lib/element';
2
- import { customElement, slot } from '../../lib/decorators';
3
- import '../../elements/reflect';
4
- import '../../elements/title';
5
-
6
- import { MATADATA, EXAMPLE } from './env';
7
- import './nav';
8
- import './source';
9
-
10
- @customElement('gem-examples-layout')
11
- export class Layout extends GemElement {
12
- @slot main: string;
13
-
14
- render() {
15
- return html`
16
- <gem-title suffix=" - Gem Examples" hidden>${MATADATA[EXAMPLE].name || EXAMPLE}</gem-title>
17
- <gem-reflect>
18
- <style>
19
- body {
20
- margin: 0;
21
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
22
- sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
23
- }
24
- </style>
25
- </gem-reflect>
26
- <style>
27
- :host {
28
- display: grid;
29
- grid-template-areas: 'nav main' 'nav source';
30
- grid-template-columns: 260px 1fr;
31
- grid-template-rows: 1fr 400px;
32
- height: 100vh;
33
- }
34
- ::slotted(*) {
35
- overflow: auto;
36
- padding: 2em;
37
- }
38
- @media (max-width: 480px) {
39
- :host {
40
- display: block;
41
- }
42
- gem-examples-nav,
43
- gem-examples-source {
44
- display: none;
45
- }
46
- }
47
- </style>
48
- <gem-examples-nav></gem-examples-nav>
49
- <slot name=${this.main}></slot>
50
- <gem-examples-source></gem-examples-source>
51
- `;
52
- }
53
- }
@@ -1,71 +0,0 @@
1
- import { GemElement, html, customElement, version } from '../..';
2
- import { MATADATA, EXAMPLES, EXAMPLE } from './env';
3
-
4
- const getGitPageUrl = (name: string) => `../${name}/`;
5
-
6
- const getName = (name: string) => (MATADATA[name].name || name).replace('-', ' ');
7
-
8
- @customElement('gem-examples-nav')
9
- export class Nav extends GemElement {
10
- render() {
11
- return html`
12
- <style>
13
- :host {
14
- grid-area: nav;
15
- padding: 2em 0;
16
- overflow: auto;
17
- background: #666;
18
- color: white;
19
- }
20
- .header {
21
- margin-bottom: 1em;
22
- padding: 0 2em;
23
- }
24
- .name {
25
- font-size: 1.2em;
26
- }
27
- .version {
28
- font-family: monospace;
29
- }
30
- ol {
31
- margin: 0;
32
- padding: 0;
33
- }
34
- li {
35
- display: contents;
36
- }
37
- a {
38
- padding: 0.5em 2em;
39
- display: block;
40
- color: inherit;
41
- opacity: 0.8;
42
- line-height: 1.5;
43
- text-decoration: none;
44
- text-transform: capitalize;
45
- }
46
- a:hover {
47
- opacity: 1;
48
- }
49
- a.active {
50
- opacity: 1;
51
- background: #444;
52
- }
53
- </style>
54
- <a class="header" href="https://github.com/mantou132/gem" target="_blank">
55
- <div class="name">Gem Examples</div>
56
- <div class="version">version: ${version}</div>
57
- </a>
58
- <ol>
59
- ${EXAMPLES.sort((a, b) => ((MATADATA[a].order || 0) > (MATADATA[b].order || 0) ? 1 : -1)).map(
60
- (name) =>
61
- html`<li>
62
- <a class=${EXAMPLE === name ? 'active' : ''} href=${getGitPageUrl(name)}>
63
- <div>${getName(name)}</div>
64
- <div>${MATADATA[name].desc}</div>
65
- </a>
66
- </li>`,
67
- )}
68
- </ol>
69
- `;
70
- }
71
- }
@@ -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
- }