mayu-live 0.0.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.
- checksums.yaml +7 -0
- data/COPYING +661 -0
- data/README.md +598 -0
- data/exe/mayu +33 -0
- data/lib/mayu/app_metrics.rb +93 -0
- data/lib/mayu/banner.rb +12 -0
- data/lib/mayu/client/README.md +17 -0
- data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js +1 -0
- data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.br +0 -0
- data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.map +1 -0
- data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.map.br +0 -0
- data/lib/mayu/client/dist/custom-elements/mayu-alert-cd7ad2a4.js +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-alert-cd7ad2a4.js.map +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-disconnected-9f349f46.js +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-disconnected-9f349f46.js.map +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-exception-63df4e8c.js +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-exception-63df4e8c.js.map +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-ping-c498c2a6.js +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-ping-c498c2a6.js.map +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-progress-bar-eb3e1ac8.js +1 -0
- data/lib/mayu/client/dist/custom-elements/mayu-progress-bar-eb3e1ac8.js.map +1 -0
- data/lib/mayu/client/dist/entries.json +3 -0
- data/lib/mayu/client/dist/main-4b49dbc4.js +1 -0
- data/lib/mayu/client/dist/main-4b49dbc4.js.br +0 -0
- data/lib/mayu/client/dist/main-4b49dbc4.js.map +1 -0
- data/lib/mayu/client/dist/main-4b49dbc4.js.map.br +0 -0
- data/lib/mayu/client/package.json +39 -0
- data/lib/mayu/client/rollup.config.js +81 -0
- data/lib/mayu/client/src/DecompressionStream.ts +15 -0
- data/lib/mayu/client/src/DecompressionStreamPolyfill.ts +43 -0
- data/lib/mayu/client/src/MimeTypes.ts +4 -0
- data/lib/mayu/client/src/NodeTree.ts +445 -0
- data/lib/mayu/client/src/custom-elements/mayu-alert.html +137 -0
- data/lib/mayu/client/src/custom-elements/mayu-alert.ts +62 -0
- data/lib/mayu/client/src/custom-elements/mayu-disconnected.html +134 -0
- data/lib/mayu/client/src/custom-elements/mayu-disconnected.ts +51 -0
- data/lib/mayu/client/src/custom-elements/mayu-exception.html +79 -0
- data/lib/mayu/client/src/custom-elements/mayu-exception.ts +28 -0
- data/lib/mayu/client/src/custom-elements/mayu-log.html +70 -0
- data/lib/mayu/client/src/custom-elements/mayu-log.ts +42 -0
- data/lib/mayu/client/src/custom-elements/mayu-ping.html +36 -0
- data/lib/mayu/client/src/custom-elements/mayu-ping.ts +53 -0
- data/lib/mayu/client/src/custom-elements/mayu-progress-bar.html +44 -0
- data/lib/mayu/client/src/custom-elements/mayu-progress-bar.ts +40 -0
- data/lib/mayu/client/src/custom-elements/types.d.ts +4 -0
- data/lib/mayu/client/src/global.d.ts +26 -0
- data/lib/mayu/client/src/h.ts +27 -0
- data/lib/mayu/client/src/logger.ts +56 -0
- data/lib/mayu/client/src/main.ts +271 -0
- data/lib/mayu/client/src/serializeEvent.ts +90 -0
- data/lib/mayu/client/src/stream.ts +175 -0
- data/lib/mayu/client/src/types.ts +1 -0
- data/lib/mayu/client/src/utils.ts +71 -0
- data/lib/mayu/client/tsconfig.json +18 -0
- data/lib/mayu/colors.rb +34 -0
- data/lib/mayu/commands/base.rb +22 -0
- data/lib/mayu/commands/build.rb +82 -0
- data/lib/mayu/commands.rb +53 -0
- data/lib/mayu/component/base.rb +177 -0
- data/lib/mayu/component/handler_ref.rb +99 -0
- data/lib/mayu/component/helpers.rb +93 -0
- data/lib/mayu/component/interface.rb +18 -0
- data/lib/mayu/component/wrapper.rb +165 -0
- data/lib/mayu/component.rb +54 -0
- data/lib/mayu/configuration.rb +195 -0
- data/lib/mayu/disable_sorbet.rb +23 -0
- data/lib/mayu/environment.rb +151 -0
- data/lib/mayu/event_stream.rb +158 -0
- data/lib/mayu/fetch.rb +88 -0
- data/lib/mayu/html.rb +53 -0
- data/lib/mayu/html.yaml +767 -0
- data/lib/mayu/message_cipher.rb +172 -0
- data/lib/mayu/message_cipher.test.rb +16 -0
- data/lib/mayu/metrics/collector.rb +161 -0
- data/lib/mayu/metrics/exporter.rb +47 -0
- data/lib/mayu/metrics/reporter.rb +187 -0
- data/lib/mayu/metrics.rb +82 -0
- data/lib/mayu/ref_counter.rb +57 -0
- data/lib/mayu/resources/README.md +14 -0
- data/lib/mayu/resources/asset.rb +71 -0
- data/lib/mayu/resources/assets.rb +76 -0
- data/lib/mayu/resources/dependency_graph.rb +306 -0
- data/lib/mayu/resources/dot_exporter.rb +167 -0
- data/lib/mayu/resources/generators/base.rb +18 -0
- data/lib/mayu/resources/generators/copy_file.rb +26 -0
- data/lib/mayu/resources/generators/image.rb +106 -0
- data/lib/mayu/resources/generators/write_file.rb +39 -0
- data/lib/mayu/resources/hot_swap/file_watcher.rb +69 -0
- data/lib/mayu/resources/hot_swap.rb +46 -0
- data/lib/mayu/resources/mermaid_exporter.rb +210 -0
- data/lib/mayu/resources/registry.rb +190 -0
- data/lib/mayu/resources/resolver/base.rb +32 -0
- data/lib/mayu/resources/resolver/filesystem.rb +94 -0
- data/lib/mayu/resources/resolver/static.rb +27 -0
- data/lib/mayu/resources/resolver.rb +13 -0
- data/lib/mayu/resources/resource.rb +150 -0
- data/lib/mayu/resources/transformers/__test__/css/adjacent_selectors.in.css +3 -0
- data/lib/mayu/resources/transformers/__test__/css/adjacent_selectors.out.css +6 -0
- data/lib/mayu/resources/transformers/__test__/css/attributes.in.css +3 -0
- data/lib/mayu/resources/transformers/__test__/css/attributes.out.css +6 -0
- data/lib/mayu/resources/transformers/__test__/css/composes.in.css +6 -0
- data/lib/mayu/resources/transformers/__test__/css/composes.out.css +10 -0
- data/lib/mayu/resources/transformers/__test__/css/element_selectors.in.css +3 -0
- data/lib/mayu/resources/transformers/__test__/css/element_selectors.out.css +6 -0
- data/lib/mayu/resources/transformers/__test__/css/has.in.css +7 -0
- data/lib/mayu/resources/transformers/__test__/css/has.out.css +10 -0
- data/lib/mayu/resources/transformers/__test__/css/media_queries.in.css +8 -0
- data/lib/mayu/resources/transformers/__test__/css/media_queries.out.css +12 -0
- data/lib/mayu/resources/transformers/__test__/css/pseudo_classes.in.css +5 -0
- data/lib/mayu/resources/transformers/__test__/css/pseudo_classes.out.css +6 -0
- data/lib/mayu/resources/transformers/__test__/haml/README.md +10 -0
- data/lib/mayu/resources/transformers/__test__/haml/case.haml +8 -0
- data/lib/mayu/resources/transformers/__test__/haml/case.rb +15 -0
- data/lib/mayu/resources/transformers/__test__/haml/class_names.haml +13 -0
- data/lib/mayu/resources/transformers/__test__/haml/class_names.rb +26 -0
- data/lib/mayu/resources/transformers/__test__/haml/comments.haml +5 -0
- data/lib/mayu/resources/transformers/__test__/haml/comments.rb +5 -0
- data/lib/mayu/resources/transformers/__test__/haml/css.haml +3 -0
- data/lib/mayu/resources/transformers/__test__/haml/css.rb +11 -0
- data/lib/mayu/resources/transformers/__test__/haml/dashes.haml +3 -0
- data/lib/mayu/resources/transformers/__test__/haml/dashes.rb +11 -0
- data/lib/mayu/resources/transformers/__test__/haml/early_return.haml +4 -0
- data/lib/mayu/resources/transformers/__test__/haml/early_return.rb +9 -0
- data/lib/mayu/resources/transformers/__test__/haml/early_return2.haml +3 -0
- data/lib/mayu/resources/transformers/__test__/haml/early_return2.rb +6 -0
- data/lib/mayu/resources/transformers/__test__/haml/handlers.haml +6 -0
- data/lib/mayu/resources/transformers/__test__/haml/handlers.rb +12 -0
- data/lib/mayu/resources/transformers/__test__/haml/if_else.haml +6 -0
- data/lib/mayu/resources/transformers/__test__/haml/if_else.rb +12 -0
- data/lib/mayu/resources/transformers/__test__/haml/interpolation.haml +8 -0
- data/lib/mayu/resources/transformers/__test__/haml/interpolation.rb +11 -0
- data/lib/mayu/resources/transformers/__test__/haml/object_ref_as_key.haml +1 -0
- data/lib/mayu/resources/transformers/__test__/haml/object_ref_as_key.rb +5 -0
- data/lib/mayu/resources/transformers/__test__/haml/props.haml +4 -0
- data/lib/mayu/resources/transformers/__test__/haml/props.rb +11 -0
- data/lib/mayu/resources/transformers/__test__/haml/slots.haml +5 -0
- data/lib/mayu/resources/transformers/__test__/haml/slots.rb +9 -0
- data/lib/mayu/resources/transformers/__test__/haml/slots_dynamic.haml +3 -0
- data/lib/mayu/resources/transformers/__test__/haml/slots_dynamic.rb +9 -0
- data/lib/mayu/resources/transformers/__test__/haml/slots_fallback.haml +3 -0
- data/lib/mayu/resources/transformers/__test__/haml/slots_fallback.rb +5 -0
- data/lib/mayu/resources/transformers/__test__/haml/spacing.haml +5 -0
- data/lib/mayu/resources/transformers/__test__/haml/spacing.rb +14 -0
- data/lib/mayu/resources/transformers/__test__/haml/spacing2.haml +10 -0
- data/lib/mayu/resources/transformers/__test__/haml/spacing2.rb +11 -0
- data/lib/mayu/resources/transformers/__test__/haml/spacing3.haml +3 -0
- data/lib/mayu/resources/transformers/__test__/haml/spacing3.rb +10 -0
- data/lib/mayu/resources/transformers/css/rouge_lexer.rb +841 -0
- data/lib/mayu/resources/transformers/css.rb +100 -0
- data/lib/mayu/resources/transformers/css.test.rb +87 -0
- data/lib/mayu/resources/transformers/haml.rb +984 -0
- data/lib/mayu/resources/transformers/haml.test.rb +114 -0
- data/lib/mayu/resources/types/README.md +36 -0
- data/lib/mayu/resources/types/base.rb +35 -0
- data/lib/mayu/resources/types/component.rb +198 -0
- data/lib/mayu/resources/types/image.rb +169 -0
- data/lib/mayu/resources/types/javascript.rb +50 -0
- data/lib/mayu/resources/types/nil.rb +23 -0
- data/lib/mayu/resources/types/stylesheet.rb +119 -0
- data/lib/mayu/resources/types/svg.rb +69 -0
- data/lib/mayu/resources/types.rb +37 -0
- data/lib/mayu/routes.rb +170 -0
- data/lib/mayu/routing/builder.rb +108 -0
- data/lib/mayu/routing/matcher.rb +58 -0
- data/lib/mayu/routing/routes.rb +85 -0
- data/lib/mayu/routing.rb +17 -0
- data/lib/mayu/server/app.rb +494 -0
- data/lib/mayu/server/controller.rb +152 -0
- data/lib/mayu/server/errors.rb +110 -0
- data/lib/mayu/server/file_server.rb +140 -0
- data/lib/mayu/server.rb +63 -0
- data/lib/mayu/session.rb +358 -0
- data/lib/mayu/state/README.md +6 -0
- data/lib/mayu/state/action_creator.rb +191 -0
- data/lib/mayu/state/action_wrapper.rb +30 -0
- data/lib/mayu/state/loader.rb +220 -0
- data/lib/mayu/state/store.rb +82 -0
- data/lib/mayu/state.rb +8 -0
- data/lib/mayu/state.test.rb +97 -0
- data/lib/mayu/utils.rb +114 -0
- data/lib/mayu/vdom/children.rb +117 -0
- data/lib/mayu/vdom/component_marshaler.rb +53 -0
- data/lib/mayu/vdom/css_attributes.rb +131 -0
- data/lib/mayu/vdom/descriptor.rb +151 -0
- data/lib/mayu/vdom/descriptor.test.rb +26 -0
- data/lib/mayu/vdom/dom.rb +239 -0
- data/lib/mayu/vdom/h.rb +22 -0
- data/lib/mayu/vdom/id_generator.rb +55 -0
- data/lib/mayu/vdom/interfaces.rb +186 -0
- data/lib/mayu/vdom/marshalling.rb +78 -0
- data/lib/mayu/vdom/reconciliation.rb +205 -0
- data/lib/mayu/vdom/reconciliation.test.rb +56 -0
- data/lib/mayu/vdom/special_elements.rb +108 -0
- data/lib/mayu/vdom/update_context.rb +180 -0
- data/lib/mayu/vdom/vdom.perf.test.rb +146 -0
- data/lib/mayu/vdom/vnode.rb +266 -0
- data/lib/mayu/vdom/vtree.rb +672 -0
- data/lib/mayu/vdom/vtree.test.rb +68 -0
- data/lib/mayu/vdom.rb +8 -0
- data/lib/mayu/vdom.test.rb +73 -0
- data/lib/mayu/version.rb +6 -0
- data/lib/mayu.rb +8 -0
- data/mayu-live.gemspec +70 -0
- metadata +612 -0
@@ -0,0 +1,134 @@
|
|
1
|
+
<style>
|
2
|
+
@keyframes show-dialog {
|
3
|
+
0% {
|
4
|
+
opacity: 0;
|
5
|
+
scale: 0;
|
6
|
+
}
|
7
|
+
90% {
|
8
|
+
scale: 1.1;
|
9
|
+
}
|
10
|
+
100% {
|
11
|
+
opacity: 1;
|
12
|
+
scale: 1;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
@keyframes hide-dialog {
|
17
|
+
from {
|
18
|
+
scale: 1;
|
19
|
+
}
|
20
|
+
to {
|
21
|
+
scale: 0;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
@keyframes show-backdrop {
|
26
|
+
0% {
|
27
|
+
opacity: 0;
|
28
|
+
}
|
29
|
+
100% {
|
30
|
+
opacity: 1;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
@keyframes hide-backdrop {
|
35
|
+
0% {
|
36
|
+
opacity: 1;
|
37
|
+
}
|
38
|
+
100% {
|
39
|
+
opacity: 0;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
dialog {
|
44
|
+
all: initial;
|
45
|
+
display: block;
|
46
|
+
border: 3px solid #c00;
|
47
|
+
border-radius: 3px;
|
48
|
+
position: fixed;
|
49
|
+
top: 50%;
|
50
|
+
left: 50%;
|
51
|
+
translate: -50% -50%;
|
52
|
+
margin: 0;
|
53
|
+
background: #fff;
|
54
|
+
font-size: 1rem;
|
55
|
+
box-shadow: #0000003f 0px 54px 55px, #0000001e 0px -12px 30px,
|
56
|
+
#0000001e 0px 4px 6px, #0000002b 0px 12px 13px, #00000016 0px -3px 5px;
|
57
|
+
user-select: none;
|
58
|
+
}
|
59
|
+
dialog[open] {
|
60
|
+
animation-delay: 0s;
|
61
|
+
animation-duration: 300ms;
|
62
|
+
animation-iteration-count: 1;
|
63
|
+
animation-name: show-dialog;
|
64
|
+
animation-play-state: running;
|
65
|
+
animation-timing-function: ease;
|
66
|
+
}
|
67
|
+
dialog:not([open]) {
|
68
|
+
animation-delay: 0s;
|
69
|
+
animation-duration: 300ms;
|
70
|
+
animation-iteration-count: 1;
|
71
|
+
animation-name: hide-dialog;
|
72
|
+
animation-play-state: running;
|
73
|
+
animation-timing-function: ease;
|
74
|
+
}
|
75
|
+
|
76
|
+
dialog::backdrop {
|
77
|
+
backdrop-filter: brightness(50%) blur(5px);
|
78
|
+
}
|
79
|
+
dialog[open]::backdrop {
|
80
|
+
animation-delay: 0s;
|
81
|
+
animation-duration: 300ms;
|
82
|
+
animation-iteration-count: 1;
|
83
|
+
animation-name: show-backdrop;
|
84
|
+
animation-play-state: running;
|
85
|
+
animation-timing-function: ease;
|
86
|
+
}
|
87
|
+
dialog:not([open])::backdrop {
|
88
|
+
animation-delay: 0s;
|
89
|
+
animation-duration: 300ms;
|
90
|
+
animation-iteration-count: 1;
|
91
|
+
animation-name: hide-backdrop;
|
92
|
+
animation-play-state: running;
|
93
|
+
animation-timing-function: ease;
|
94
|
+
}
|
95
|
+
|
96
|
+
h1 {
|
97
|
+
all: initial;
|
98
|
+
display: block;
|
99
|
+
font-family: system-ui;
|
100
|
+
font-size: 1.5em;
|
101
|
+
margin: 1rem;
|
102
|
+
}
|
103
|
+
|
104
|
+
p {
|
105
|
+
all: initial;
|
106
|
+
display: block;
|
107
|
+
font-family: system-ui;
|
108
|
+
font-size: 1em;
|
109
|
+
margin: 1rem;
|
110
|
+
}
|
111
|
+
|
112
|
+
a {
|
113
|
+
all: revert;
|
114
|
+
}
|
115
|
+
|
116
|
+
#reason:empty {
|
117
|
+
display: none;
|
118
|
+
}
|
119
|
+
|
120
|
+
#reason::before {
|
121
|
+
content: "Reason: ";
|
122
|
+
font-weight: bold;
|
123
|
+
}
|
124
|
+
</style>
|
125
|
+
<dialog>
|
126
|
+
<h1>Connection lost</h1>
|
127
|
+
<p id="reason"></p>
|
128
|
+
<p>Please check your internet connection.</p>
|
129
|
+
<p>
|
130
|
+
<a href="javascript:document.location.reload()" autofocus
|
131
|
+
>Reload the page</a
|
132
|
+
>
|
133
|
+
</p>
|
134
|
+
</dialog>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import html from "./mayu-disconnected.html";
|
2
|
+
|
3
|
+
const template = document.createElement("template");
|
4
|
+
template.innerHTML = html;
|
5
|
+
|
6
|
+
class MayuDisconnected extends HTMLElement {
|
7
|
+
dialog?: HTMLDialogElement;
|
8
|
+
reason?: HTMLParagraphElement;
|
9
|
+
|
10
|
+
static observedAttributes = ["reason"];
|
11
|
+
|
12
|
+
constructor() {
|
13
|
+
super();
|
14
|
+
|
15
|
+
if (!this.shadowRoot) {
|
16
|
+
this.attachShadow({ mode: "open" });
|
17
|
+
}
|
18
|
+
|
19
|
+
this.shadowRoot!.appendChild(
|
20
|
+
template.content.cloneNode(true)
|
21
|
+
) as DocumentFragment;
|
22
|
+
|
23
|
+
this.dialog = this.shadowRoot!.querySelector("dialog") as HTMLDialogElement;
|
24
|
+
this.reason = this.shadowRoot!.getElementById(
|
25
|
+
"reason"
|
26
|
+
) as HTMLParagraphElement;
|
27
|
+
}
|
28
|
+
|
29
|
+
connectedCallback() {
|
30
|
+
this.dialog!.showModal();
|
31
|
+
}
|
32
|
+
|
33
|
+
attributeChangedCallback(name: string, oldValue: string, newValue: string) {
|
34
|
+
switch (name) {
|
35
|
+
case "reason":
|
36
|
+
if (!this.reason) break;
|
37
|
+
this.reason.textContent = String(newValue);
|
38
|
+
break;
|
39
|
+
default:
|
40
|
+
break;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
disconnectedCallback() {
|
45
|
+
this.dialog?.close();
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
window.customElements.define("mayu-disconnected", MayuDisconnected);
|
50
|
+
|
51
|
+
export default MayuDisconnected;
|
@@ -0,0 +1,79 @@
|
|
1
|
+
<style>
|
2
|
+
dialog {
|
3
|
+
position: fixed;
|
4
|
+
width: 80vw;
|
5
|
+
top: 50%;
|
6
|
+
left: 50%;
|
7
|
+
transform: translate(-50%, -50%);
|
8
|
+
z-index: 10001;
|
9
|
+
background: #fff;
|
10
|
+
border: 5px solid #c00;
|
11
|
+
border-radius: 3px;
|
12
|
+
font-family: monospace;
|
13
|
+
overflow: hidden;
|
14
|
+
font-size: 0.9rem;
|
15
|
+
display: flex;
|
16
|
+
flex-direction: column;
|
17
|
+
margin: 0;
|
18
|
+
padding: 0;
|
19
|
+
box-shadow: #0000003f 0px 54px 55px, #0000001e 0px -12px 30px,
|
20
|
+
#0000001e 0px 4px 6px, #0000002b 0px 12px 13px, #00000016 0px -3px 5px;
|
21
|
+
}
|
22
|
+
|
23
|
+
dialog::backdrop {
|
24
|
+
backdrop-filter: brightness(30%) blur(5px);
|
25
|
+
}
|
26
|
+
|
27
|
+
header {
|
28
|
+
display: flex;
|
29
|
+
align-items: center;
|
30
|
+
background: #c00;
|
31
|
+
color: #fff;
|
32
|
+
text-shadow: 0 0 15px #fff, 0 0 2px #000;
|
33
|
+
padding-bottom: 5px;
|
34
|
+
}
|
35
|
+
|
36
|
+
header > button {
|
37
|
+
flex: 0;
|
38
|
+
background: transparent;
|
39
|
+
font-size: 2em;
|
40
|
+
font-weight: bold;
|
41
|
+
opacity: 0.5;
|
42
|
+
border: 0;
|
43
|
+
cursor: pointer;
|
44
|
+
}
|
45
|
+
|
46
|
+
header > button:hover {
|
47
|
+
opacity: 1;
|
48
|
+
}
|
49
|
+
|
50
|
+
h1 {
|
51
|
+
font-size: 1.2em;
|
52
|
+
margin: 0;
|
53
|
+
padding: 0;
|
54
|
+
flex: 1;
|
55
|
+
}
|
56
|
+
|
57
|
+
main {
|
58
|
+
overflow-y: scroll;
|
59
|
+
flex: 1;
|
60
|
+
}
|
61
|
+
|
62
|
+
pre {
|
63
|
+
white-space: pre-wrap;
|
64
|
+
margin: 1rem;
|
65
|
+
flex: 1;
|
66
|
+
overflow: hidden;
|
67
|
+
}
|
68
|
+
</style>
|
69
|
+
<dialog>
|
70
|
+
<header>
|
71
|
+
<h1>
|
72
|
+
<slot name="title"></slot>
|
73
|
+
</h1>
|
74
|
+
<button onclick="console.log(this.getRootNode().host.remove())">⨉</button>
|
75
|
+
</header>
|
76
|
+
<main>
|
77
|
+
<pre><slot name="backtrace"></slot></pre>
|
78
|
+
</main>
|
79
|
+
</dialog>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import html from "./mayu-exception.html";
|
2
|
+
|
3
|
+
const template = document.createElement("template");
|
4
|
+
template.innerHTML = html;
|
5
|
+
|
6
|
+
class MayuException extends HTMLElement {
|
7
|
+
dialog?: HTMLDialogElement;
|
8
|
+
|
9
|
+
connectedCallback() {
|
10
|
+
if (!this.shadowRoot) {
|
11
|
+
this.attachShadow({ mode: "open" });
|
12
|
+
}
|
13
|
+
|
14
|
+
this.shadowRoot!.appendChild(template.content.cloneNode(true));
|
15
|
+
|
16
|
+
this.dialog = this.shadowRoot!.querySelector("dialog") as HTMLDialogElement;
|
17
|
+
|
18
|
+
this.dialog!.showModal();
|
19
|
+
}
|
20
|
+
|
21
|
+
disconnectedCallback() {
|
22
|
+
this.dialog?.close();
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
window.customElements.define("mayu-exception", MayuException);
|
27
|
+
|
28
|
+
export default MayuException;
|
@@ -0,0 +1,70 @@
|
|
1
|
+
<style>
|
2
|
+
.mayu-log {
|
3
|
+
position: fixed;
|
4
|
+
bottom: 0;
|
5
|
+
right: 0;
|
6
|
+
max-width: 80vw;
|
7
|
+
z-index: 10000;
|
8
|
+
background: #ccc;
|
9
|
+
border: 0 solid #0003;
|
10
|
+
border-width: 1px 0 0 1px;
|
11
|
+
font-size: 0.9em;
|
12
|
+
padding: 0.2em 0.5em;
|
13
|
+
border-top-left-radius: 3px;
|
14
|
+
color: #000;
|
15
|
+
font-family: monospace;
|
16
|
+
transition: background 500ms 0s ease-in-out;
|
17
|
+
display: flex;
|
18
|
+
}
|
19
|
+
.wrapper {
|
20
|
+
flex: 1;
|
21
|
+
max-height: 80vh;
|
22
|
+
overflow-y: auto;
|
23
|
+
}
|
24
|
+
table {
|
25
|
+
border-collapse: collapse;
|
26
|
+
}
|
27
|
+
tbody {
|
28
|
+
}
|
29
|
+
tbody td {
|
30
|
+
vertical-align: top;
|
31
|
+
}
|
32
|
+
th,
|
33
|
+
td {
|
34
|
+
white-space: nowrap;
|
35
|
+
border: 1px solid #0006;
|
36
|
+
text-align: left;
|
37
|
+
padding: 0.5em;
|
38
|
+
}
|
39
|
+
pre {
|
40
|
+
white-space: pre-wrap;
|
41
|
+
margin: 0;
|
42
|
+
overflow: auto;
|
43
|
+
}
|
44
|
+
summary {
|
45
|
+
cursor: pointer;
|
46
|
+
user-select: none;
|
47
|
+
text-align: right;
|
48
|
+
}
|
49
|
+
summary:hover {
|
50
|
+
text-decoration: underline;
|
51
|
+
}
|
52
|
+
</style>
|
53
|
+
<details class="mayu-log">
|
54
|
+
<summary>toggle log</summary>
|
55
|
+
<div>
|
56
|
+
<button class="clear-button" type="button">Clear</button>
|
57
|
+
</div>
|
58
|
+
<div class="wrapper">
|
59
|
+
<table>
|
60
|
+
<thead>
|
61
|
+
<tr>
|
62
|
+
<th>Id</th>
|
63
|
+
<th>Event</th>
|
64
|
+
<th>Payload</th>
|
65
|
+
</tr>
|
66
|
+
</thead>
|
67
|
+
<tbody class="log"></tbody>
|
68
|
+
</table>
|
69
|
+
</div>
|
70
|
+
</details>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import html from "./mayu-log.html";
|
2
|
+
import h from "../h";
|
3
|
+
import { stringifyJSON } from "../utils";
|
4
|
+
|
5
|
+
const template = document.createElement("template");
|
6
|
+
template.innerHTML = html;
|
7
|
+
|
8
|
+
class LogComponent extends HTMLElement {
|
9
|
+
log?: HTMLTableSectionElement;
|
10
|
+
|
11
|
+
connectedCallback() {
|
12
|
+
if (!this.shadowRoot) {
|
13
|
+
this.attachShadow({ mode: "open" });
|
14
|
+
}
|
15
|
+
|
16
|
+
this.shadowRoot!.appendChild(
|
17
|
+
template.content.cloneNode(true)
|
18
|
+
) as DocumentFragment;
|
19
|
+
|
20
|
+
this.log = this.shadowRoot!.querySelector(
|
21
|
+
".log"
|
22
|
+
) as HTMLTableSectionElement;
|
23
|
+
|
24
|
+
(
|
25
|
+
this.shadowRoot!.querySelector(".clear-button") as HTMLButtonElement
|
26
|
+
).addEventListener("click", () => {
|
27
|
+
this.log!.innerHTML = "";
|
28
|
+
});
|
29
|
+
}
|
30
|
+
|
31
|
+
addEntry(id: string, event: string, payload: any) {
|
32
|
+
this.log!.appendChild(
|
33
|
+
h("tr", [
|
34
|
+
h("td", [id]),
|
35
|
+
h("td", [event]),
|
36
|
+
h("td", [h("pre", [stringifyJSON(payload)])]),
|
37
|
+
])
|
38
|
+
);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
export default LogComponent;
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<style>
|
2
|
+
.mayu-ping {
|
3
|
+
position: fixed;
|
4
|
+
bottom: 0;
|
5
|
+
left: 0;
|
6
|
+
z-index: 10000;
|
7
|
+
background: #0003;
|
8
|
+
border: 0 solid #0003;
|
9
|
+
border-width: 1px 1px 0 0;
|
10
|
+
font-size: 0.9em;
|
11
|
+
padding: 0.2em 0.5em;
|
12
|
+
border-top-right-radius: 3px;
|
13
|
+
pointer-events: none;
|
14
|
+
text-shadow: 0 0 2px #000, 0 0 2px #000, 0 0 2px #000, 0 0 2px #000,
|
15
|
+
0 0 2px #000, 0 0 2px #000, 0 0 2px #000, 0 0 2px #000, 0 0 2px #000,
|
16
|
+
0 0 2px #000;
|
17
|
+
color: #fff;
|
18
|
+
font-weight: bold;
|
19
|
+
font-family: monospace;
|
20
|
+
transition: background 500ms 0s ease-in-out;
|
21
|
+
}
|
22
|
+
.status-disconnected {
|
23
|
+
background: #d0060699;
|
24
|
+
}
|
25
|
+
.status-connected {
|
26
|
+
background: #44f70899;
|
27
|
+
}
|
28
|
+
.status-transferring {
|
29
|
+
background: #0866f799;
|
30
|
+
}
|
31
|
+
</style>
|
32
|
+
<div class="mayu-ping">
|
33
|
+
Ping:
|
34
|
+
<span class="ping">N/A</span>
|
35
|
+
(<span class="region">N/A</span>)
|
36
|
+
</div>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
import html from "./mayu-ping.html";
|
2
|
+
|
3
|
+
const template = document.createElement("template");
|
4
|
+
template.innerHTML = html;
|
5
|
+
|
6
|
+
class MayuPing extends HTMLElement {
|
7
|
+
div?: HTMLDivElement;
|
8
|
+
ping?: HTMLSpanElement;
|
9
|
+
region?: HTMLSpanElement;
|
10
|
+
|
11
|
+
static observedAttributes = ["ping", "region", "status"];
|
12
|
+
|
13
|
+
connectedCallback() {
|
14
|
+
if (!this.shadowRoot) {
|
15
|
+
this.attachShadow({ mode: "open" });
|
16
|
+
}
|
17
|
+
|
18
|
+
this.shadowRoot!.appendChild(
|
19
|
+
template.content.cloneNode(true)
|
20
|
+
) as DocumentFragment;
|
21
|
+
|
22
|
+
this.div = this.shadowRoot!.querySelector(".mayu-ping") as HTMLDivElement;
|
23
|
+
this.ping = this.shadowRoot!.querySelector(".ping") as HTMLSpanElement;
|
24
|
+
this.region = this.shadowRoot!.querySelector(".region") as HTMLSpanElement;
|
25
|
+
}
|
26
|
+
|
27
|
+
attributeChangedCallback(name: string, oldValue: string, newValue: string) {
|
28
|
+
switch (name) {
|
29
|
+
case "ping":
|
30
|
+
if (!this.ping) break;
|
31
|
+
this.ping.textContent = newValue;
|
32
|
+
break;
|
33
|
+
case "region":
|
34
|
+
if (!this.region) break;
|
35
|
+
this.region.textContent = newValue;
|
36
|
+
break;
|
37
|
+
case "status":
|
38
|
+
if (!this.div) break;
|
39
|
+
|
40
|
+
if (oldValue && oldValue !== newValue) {
|
41
|
+
this.div!.classList.remove(`status-${oldValue}`);
|
42
|
+
}
|
43
|
+
if (newValue) {
|
44
|
+
this.div!.classList.add(`status-${newValue}`);
|
45
|
+
}
|
46
|
+
break;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
window.customElements.define("mayu-ping", MayuPing);
|
52
|
+
|
53
|
+
export default MayuPing;
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<style>
|
2
|
+
@keyframes indeterminateAnimation {
|
3
|
+
0% {
|
4
|
+
transform: translateX(0) scaleX(0);
|
5
|
+
}
|
6
|
+
40% {
|
7
|
+
transform: translateX(0) scaleX(0.6);
|
8
|
+
}
|
9
|
+
100% {
|
10
|
+
transform: translateX(100%) scaleX(0.3);
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
.progress {
|
15
|
+
position: fixed;
|
16
|
+
top: 0;
|
17
|
+
left: 0;
|
18
|
+
right: 0;
|
19
|
+
width: 100%;
|
20
|
+
height: 5px;
|
21
|
+
display: block;
|
22
|
+
z-index: 10000;
|
23
|
+
background: transparent;
|
24
|
+
border: 0;
|
25
|
+
pointer-events: none;
|
26
|
+
}
|
27
|
+
|
28
|
+
.progress[hidden] {
|
29
|
+
display: none;
|
30
|
+
}
|
31
|
+
|
32
|
+
.value {
|
33
|
+
height: 100%;
|
34
|
+
width: 100%;
|
35
|
+
background: #0866f7;
|
36
|
+
box-shadow: 0 0 3px #000;
|
37
|
+
border-radius: 2px;
|
38
|
+
animation: indeterminateAnimation 1500ms infinite linear;
|
39
|
+
transform-origin: 0% 50%;
|
40
|
+
}
|
41
|
+
</style>
|
42
|
+
<div class="progress" hidden>
|
43
|
+
<div class="value"></div>
|
44
|
+
</div>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import html from "./mayu-progress-bar.html";
|
2
|
+
|
3
|
+
const template = document.createElement("template");
|
4
|
+
template.innerHTML = html;
|
5
|
+
|
6
|
+
class MayuProgressBar extends HTMLElement {
|
7
|
+
progress: HTMLDivElement | null = null;
|
8
|
+
|
9
|
+
static observedAttributes = ["progress"];
|
10
|
+
|
11
|
+
connectedCallback() {
|
12
|
+
const shadowRoot = this.attachShadow({ mode: "open" });
|
13
|
+
|
14
|
+
shadowRoot.appendChild(
|
15
|
+
template.content.cloneNode(true)
|
16
|
+
) as DocumentFragment;
|
17
|
+
|
18
|
+
this.progress = shadowRoot.querySelector(".progress")!;
|
19
|
+
}
|
20
|
+
|
21
|
+
attributeChangedCallback(name: string, oldValue: string, newValue: string) {
|
22
|
+
if (name === "progress") {
|
23
|
+
switch (Number(newValue)) {
|
24
|
+
case 0:
|
25
|
+
this.progress!.removeAttribute("hidden");
|
26
|
+
break;
|
27
|
+
case 100:
|
28
|
+
this.progress!.setAttribute("hidden", "");
|
29
|
+
break;
|
30
|
+
default:
|
31
|
+
this.progress!.removeAttribute("hidden");
|
32
|
+
break;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
window.customElements.define("mayu-progress-bar", MayuProgressBar);
|
39
|
+
|
40
|
+
export default MayuProgressBar;
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import type Mayu from "./Mayu.js";
|
2
|
+
|
3
|
+
declare global {
|
4
|
+
interface Node {
|
5
|
+
__MAYU_ID: number;
|
6
|
+
}
|
7
|
+
|
8
|
+
interface Navigation extends EventTarget {}
|
9
|
+
|
10
|
+
interface NavigateEvent extends Event {
|
11
|
+
transitionWhile: (promise: Promise<any>) => void;
|
12
|
+
}
|
13
|
+
|
14
|
+
interface Window {
|
15
|
+
Mayu: Mayu;
|
16
|
+
navigation?: Navigation;
|
17
|
+
}
|
18
|
+
|
19
|
+
class DecompressionStream extends TransformStream<Uint8Array, Uint8Array> {
|
20
|
+
constructor(format: string);
|
21
|
+
}
|
22
|
+
|
23
|
+
interface Document {
|
24
|
+
adoptedStyleSheets: any[];
|
25
|
+
}
|
26
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
export default function h(
|
2
|
+
type: string,
|
3
|
+
children: any[] = [],
|
4
|
+
attrs: Record<string, any> = {}
|
5
|
+
) {
|
6
|
+
const el = document.createElement(type);
|
7
|
+
|
8
|
+
for (const [key, value] of Object.entries(attrs)) {
|
9
|
+
if (value) {
|
10
|
+
if (value === true) {
|
11
|
+
el.setAttribute(key, key);
|
12
|
+
} else {
|
13
|
+
el.setAttribute(key, value);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
children.forEach((child) => {
|
19
|
+
if ((child as any) instanceof Node) {
|
20
|
+
el.appendChild(child);
|
21
|
+
} else if (child) {
|
22
|
+
el.appendChild(document.createTextNode(String(child)));
|
23
|
+
}
|
24
|
+
});
|
25
|
+
|
26
|
+
return el;
|
27
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
export function createSilentLogger() {
|
2
|
+
const noop = (..._args: any[]) => {};
|
3
|
+
|
4
|
+
return {
|
5
|
+
info: noop,
|
6
|
+
log: noop,
|
7
|
+
warn: noop,
|
8
|
+
error: noop,
|
9
|
+
success: noop,
|
10
|
+
group: noop,
|
11
|
+
groupEnd: noop,
|
12
|
+
};
|
13
|
+
}
|
14
|
+
|
15
|
+
function generateStyle(color: string) {
|
16
|
+
return [
|
17
|
+
`background: ${color}`,
|
18
|
+
`border: 1px solid rgba(0, 0, 0, 0.5)`,
|
19
|
+
`border-radius: 2px`,
|
20
|
+
`padding: 0 2px`,
|
21
|
+
`color: #000`,
|
22
|
+
`font-weight: bold`,
|
23
|
+
].join(";");
|
24
|
+
}
|
25
|
+
|
26
|
+
export function createLogger(prefix = "mayu/") {
|
27
|
+
return {
|
28
|
+
info: console.info.bind(
|
29
|
+
console,
|
30
|
+
`%c${prefix}info`,
|
31
|
+
generateStyle("#35baf6")
|
32
|
+
),
|
33
|
+
log: console.info.bind(console, `%c${prefix}log`, generateStyle("#ccc")),
|
34
|
+
error: console.error.bind(
|
35
|
+
console,
|
36
|
+
`%c${prefix}error`,
|
37
|
+
generateStyle("#f6685e")
|
38
|
+
),
|
39
|
+
warn: console.warn.bind(
|
40
|
+
console,
|
41
|
+
`%c${prefix}warn`,
|
42
|
+
generateStyle("#ffc107")
|
43
|
+
),
|
44
|
+
success: console.info.bind(
|
45
|
+
console,
|
46
|
+
`%c${prefix}success`,
|
47
|
+
generateStyle("#a2cf6e")
|
48
|
+
),
|
49
|
+
group: console.group.bind(console),
|
50
|
+
groupEnd: console.groupEnd.bind(console),
|
51
|
+
};
|
52
|
+
}
|
53
|
+
|
54
|
+
const SILENT = false;
|
55
|
+
|
56
|
+
export default SILENT ? createSilentLogger() : createLogger();
|