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.
Files changed (204) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +661 -0
  3. data/README.md +598 -0
  4. data/exe/mayu +33 -0
  5. data/lib/mayu/app_metrics.rb +93 -0
  6. data/lib/mayu/banner.rb +12 -0
  7. data/lib/mayu/client/README.md +17 -0
  8. data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js +1 -0
  9. data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.br +0 -0
  10. data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.map +1 -0
  11. data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.map.br +0 -0
  12. data/lib/mayu/client/dist/custom-elements/mayu-alert-cd7ad2a4.js +1 -0
  13. data/lib/mayu/client/dist/custom-elements/mayu-alert-cd7ad2a4.js.map +1 -0
  14. data/lib/mayu/client/dist/custom-elements/mayu-disconnected-9f349f46.js +1 -0
  15. data/lib/mayu/client/dist/custom-elements/mayu-disconnected-9f349f46.js.map +1 -0
  16. data/lib/mayu/client/dist/custom-elements/mayu-exception-63df4e8c.js +1 -0
  17. data/lib/mayu/client/dist/custom-elements/mayu-exception-63df4e8c.js.map +1 -0
  18. data/lib/mayu/client/dist/custom-elements/mayu-ping-c498c2a6.js +1 -0
  19. data/lib/mayu/client/dist/custom-elements/mayu-ping-c498c2a6.js.map +1 -0
  20. data/lib/mayu/client/dist/custom-elements/mayu-progress-bar-eb3e1ac8.js +1 -0
  21. data/lib/mayu/client/dist/custom-elements/mayu-progress-bar-eb3e1ac8.js.map +1 -0
  22. data/lib/mayu/client/dist/entries.json +3 -0
  23. data/lib/mayu/client/dist/main-4b49dbc4.js +1 -0
  24. data/lib/mayu/client/dist/main-4b49dbc4.js.br +0 -0
  25. data/lib/mayu/client/dist/main-4b49dbc4.js.map +1 -0
  26. data/lib/mayu/client/dist/main-4b49dbc4.js.map.br +0 -0
  27. data/lib/mayu/client/package.json +39 -0
  28. data/lib/mayu/client/rollup.config.js +81 -0
  29. data/lib/mayu/client/src/DecompressionStream.ts +15 -0
  30. data/lib/mayu/client/src/DecompressionStreamPolyfill.ts +43 -0
  31. data/lib/mayu/client/src/MimeTypes.ts +4 -0
  32. data/lib/mayu/client/src/NodeTree.ts +445 -0
  33. data/lib/mayu/client/src/custom-elements/mayu-alert.html +137 -0
  34. data/lib/mayu/client/src/custom-elements/mayu-alert.ts +62 -0
  35. data/lib/mayu/client/src/custom-elements/mayu-disconnected.html +134 -0
  36. data/lib/mayu/client/src/custom-elements/mayu-disconnected.ts +51 -0
  37. data/lib/mayu/client/src/custom-elements/mayu-exception.html +79 -0
  38. data/lib/mayu/client/src/custom-elements/mayu-exception.ts +28 -0
  39. data/lib/mayu/client/src/custom-elements/mayu-log.html +70 -0
  40. data/lib/mayu/client/src/custom-elements/mayu-log.ts +42 -0
  41. data/lib/mayu/client/src/custom-elements/mayu-ping.html +36 -0
  42. data/lib/mayu/client/src/custom-elements/mayu-ping.ts +53 -0
  43. data/lib/mayu/client/src/custom-elements/mayu-progress-bar.html +44 -0
  44. data/lib/mayu/client/src/custom-elements/mayu-progress-bar.ts +40 -0
  45. data/lib/mayu/client/src/custom-elements/types.d.ts +4 -0
  46. data/lib/mayu/client/src/global.d.ts +26 -0
  47. data/lib/mayu/client/src/h.ts +27 -0
  48. data/lib/mayu/client/src/logger.ts +56 -0
  49. data/lib/mayu/client/src/main.ts +271 -0
  50. data/lib/mayu/client/src/serializeEvent.ts +90 -0
  51. data/lib/mayu/client/src/stream.ts +175 -0
  52. data/lib/mayu/client/src/types.ts +1 -0
  53. data/lib/mayu/client/src/utils.ts +71 -0
  54. data/lib/mayu/client/tsconfig.json +18 -0
  55. data/lib/mayu/colors.rb +34 -0
  56. data/lib/mayu/commands/base.rb +22 -0
  57. data/lib/mayu/commands/build.rb +82 -0
  58. data/lib/mayu/commands.rb +53 -0
  59. data/lib/mayu/component/base.rb +177 -0
  60. data/lib/mayu/component/handler_ref.rb +99 -0
  61. data/lib/mayu/component/helpers.rb +93 -0
  62. data/lib/mayu/component/interface.rb +18 -0
  63. data/lib/mayu/component/wrapper.rb +165 -0
  64. data/lib/mayu/component.rb +54 -0
  65. data/lib/mayu/configuration.rb +195 -0
  66. data/lib/mayu/disable_sorbet.rb +23 -0
  67. data/lib/mayu/environment.rb +151 -0
  68. data/lib/mayu/event_stream.rb +158 -0
  69. data/lib/mayu/fetch.rb +88 -0
  70. data/lib/mayu/html.rb +53 -0
  71. data/lib/mayu/html.yaml +767 -0
  72. data/lib/mayu/message_cipher.rb +172 -0
  73. data/lib/mayu/message_cipher.test.rb +16 -0
  74. data/lib/mayu/metrics/collector.rb +161 -0
  75. data/lib/mayu/metrics/exporter.rb +47 -0
  76. data/lib/mayu/metrics/reporter.rb +187 -0
  77. data/lib/mayu/metrics.rb +82 -0
  78. data/lib/mayu/ref_counter.rb +57 -0
  79. data/lib/mayu/resources/README.md +14 -0
  80. data/lib/mayu/resources/asset.rb +71 -0
  81. data/lib/mayu/resources/assets.rb +76 -0
  82. data/lib/mayu/resources/dependency_graph.rb +306 -0
  83. data/lib/mayu/resources/dot_exporter.rb +167 -0
  84. data/lib/mayu/resources/generators/base.rb +18 -0
  85. data/lib/mayu/resources/generators/copy_file.rb +26 -0
  86. data/lib/mayu/resources/generators/image.rb +106 -0
  87. data/lib/mayu/resources/generators/write_file.rb +39 -0
  88. data/lib/mayu/resources/hot_swap/file_watcher.rb +69 -0
  89. data/lib/mayu/resources/hot_swap.rb +46 -0
  90. data/lib/mayu/resources/mermaid_exporter.rb +210 -0
  91. data/lib/mayu/resources/registry.rb +190 -0
  92. data/lib/mayu/resources/resolver/base.rb +32 -0
  93. data/lib/mayu/resources/resolver/filesystem.rb +94 -0
  94. data/lib/mayu/resources/resolver/static.rb +27 -0
  95. data/lib/mayu/resources/resolver.rb +13 -0
  96. data/lib/mayu/resources/resource.rb +150 -0
  97. data/lib/mayu/resources/transformers/__test__/css/adjacent_selectors.in.css +3 -0
  98. data/lib/mayu/resources/transformers/__test__/css/adjacent_selectors.out.css +6 -0
  99. data/lib/mayu/resources/transformers/__test__/css/attributes.in.css +3 -0
  100. data/lib/mayu/resources/transformers/__test__/css/attributes.out.css +6 -0
  101. data/lib/mayu/resources/transformers/__test__/css/composes.in.css +6 -0
  102. data/lib/mayu/resources/transformers/__test__/css/composes.out.css +10 -0
  103. data/lib/mayu/resources/transformers/__test__/css/element_selectors.in.css +3 -0
  104. data/lib/mayu/resources/transformers/__test__/css/element_selectors.out.css +6 -0
  105. data/lib/mayu/resources/transformers/__test__/css/has.in.css +7 -0
  106. data/lib/mayu/resources/transformers/__test__/css/has.out.css +10 -0
  107. data/lib/mayu/resources/transformers/__test__/css/media_queries.in.css +8 -0
  108. data/lib/mayu/resources/transformers/__test__/css/media_queries.out.css +12 -0
  109. data/lib/mayu/resources/transformers/__test__/css/pseudo_classes.in.css +5 -0
  110. data/lib/mayu/resources/transformers/__test__/css/pseudo_classes.out.css +6 -0
  111. data/lib/mayu/resources/transformers/__test__/haml/README.md +10 -0
  112. data/lib/mayu/resources/transformers/__test__/haml/case.haml +8 -0
  113. data/lib/mayu/resources/transformers/__test__/haml/case.rb +15 -0
  114. data/lib/mayu/resources/transformers/__test__/haml/class_names.haml +13 -0
  115. data/lib/mayu/resources/transformers/__test__/haml/class_names.rb +26 -0
  116. data/lib/mayu/resources/transformers/__test__/haml/comments.haml +5 -0
  117. data/lib/mayu/resources/transformers/__test__/haml/comments.rb +5 -0
  118. data/lib/mayu/resources/transformers/__test__/haml/css.haml +3 -0
  119. data/lib/mayu/resources/transformers/__test__/haml/css.rb +11 -0
  120. data/lib/mayu/resources/transformers/__test__/haml/dashes.haml +3 -0
  121. data/lib/mayu/resources/transformers/__test__/haml/dashes.rb +11 -0
  122. data/lib/mayu/resources/transformers/__test__/haml/early_return.haml +4 -0
  123. data/lib/mayu/resources/transformers/__test__/haml/early_return.rb +9 -0
  124. data/lib/mayu/resources/transformers/__test__/haml/early_return2.haml +3 -0
  125. data/lib/mayu/resources/transformers/__test__/haml/early_return2.rb +6 -0
  126. data/lib/mayu/resources/transformers/__test__/haml/handlers.haml +6 -0
  127. data/lib/mayu/resources/transformers/__test__/haml/handlers.rb +12 -0
  128. data/lib/mayu/resources/transformers/__test__/haml/if_else.haml +6 -0
  129. data/lib/mayu/resources/transformers/__test__/haml/if_else.rb +12 -0
  130. data/lib/mayu/resources/transformers/__test__/haml/interpolation.haml +8 -0
  131. data/lib/mayu/resources/transformers/__test__/haml/interpolation.rb +11 -0
  132. data/lib/mayu/resources/transformers/__test__/haml/object_ref_as_key.haml +1 -0
  133. data/lib/mayu/resources/transformers/__test__/haml/object_ref_as_key.rb +5 -0
  134. data/lib/mayu/resources/transformers/__test__/haml/props.haml +4 -0
  135. data/lib/mayu/resources/transformers/__test__/haml/props.rb +11 -0
  136. data/lib/mayu/resources/transformers/__test__/haml/slots.haml +5 -0
  137. data/lib/mayu/resources/transformers/__test__/haml/slots.rb +9 -0
  138. data/lib/mayu/resources/transformers/__test__/haml/slots_dynamic.haml +3 -0
  139. data/lib/mayu/resources/transformers/__test__/haml/slots_dynamic.rb +9 -0
  140. data/lib/mayu/resources/transformers/__test__/haml/slots_fallback.haml +3 -0
  141. data/lib/mayu/resources/transformers/__test__/haml/slots_fallback.rb +5 -0
  142. data/lib/mayu/resources/transformers/__test__/haml/spacing.haml +5 -0
  143. data/lib/mayu/resources/transformers/__test__/haml/spacing.rb +14 -0
  144. data/lib/mayu/resources/transformers/__test__/haml/spacing2.haml +10 -0
  145. data/lib/mayu/resources/transformers/__test__/haml/spacing2.rb +11 -0
  146. data/lib/mayu/resources/transformers/__test__/haml/spacing3.haml +3 -0
  147. data/lib/mayu/resources/transformers/__test__/haml/spacing3.rb +10 -0
  148. data/lib/mayu/resources/transformers/css/rouge_lexer.rb +841 -0
  149. data/lib/mayu/resources/transformers/css.rb +100 -0
  150. data/lib/mayu/resources/transformers/css.test.rb +87 -0
  151. data/lib/mayu/resources/transformers/haml.rb +984 -0
  152. data/lib/mayu/resources/transformers/haml.test.rb +114 -0
  153. data/lib/mayu/resources/types/README.md +36 -0
  154. data/lib/mayu/resources/types/base.rb +35 -0
  155. data/lib/mayu/resources/types/component.rb +198 -0
  156. data/lib/mayu/resources/types/image.rb +169 -0
  157. data/lib/mayu/resources/types/javascript.rb +50 -0
  158. data/lib/mayu/resources/types/nil.rb +23 -0
  159. data/lib/mayu/resources/types/stylesheet.rb +119 -0
  160. data/lib/mayu/resources/types/svg.rb +69 -0
  161. data/lib/mayu/resources/types.rb +37 -0
  162. data/lib/mayu/routes.rb +170 -0
  163. data/lib/mayu/routing/builder.rb +108 -0
  164. data/lib/mayu/routing/matcher.rb +58 -0
  165. data/lib/mayu/routing/routes.rb +85 -0
  166. data/lib/mayu/routing.rb +17 -0
  167. data/lib/mayu/server/app.rb +494 -0
  168. data/lib/mayu/server/controller.rb +152 -0
  169. data/lib/mayu/server/errors.rb +110 -0
  170. data/lib/mayu/server/file_server.rb +140 -0
  171. data/lib/mayu/server.rb +63 -0
  172. data/lib/mayu/session.rb +358 -0
  173. data/lib/mayu/state/README.md +6 -0
  174. data/lib/mayu/state/action_creator.rb +191 -0
  175. data/lib/mayu/state/action_wrapper.rb +30 -0
  176. data/lib/mayu/state/loader.rb +220 -0
  177. data/lib/mayu/state/store.rb +82 -0
  178. data/lib/mayu/state.rb +8 -0
  179. data/lib/mayu/state.test.rb +97 -0
  180. data/lib/mayu/utils.rb +114 -0
  181. data/lib/mayu/vdom/children.rb +117 -0
  182. data/lib/mayu/vdom/component_marshaler.rb +53 -0
  183. data/lib/mayu/vdom/css_attributes.rb +131 -0
  184. data/lib/mayu/vdom/descriptor.rb +151 -0
  185. data/lib/mayu/vdom/descriptor.test.rb +26 -0
  186. data/lib/mayu/vdom/dom.rb +239 -0
  187. data/lib/mayu/vdom/h.rb +22 -0
  188. data/lib/mayu/vdom/id_generator.rb +55 -0
  189. data/lib/mayu/vdom/interfaces.rb +186 -0
  190. data/lib/mayu/vdom/marshalling.rb +78 -0
  191. data/lib/mayu/vdom/reconciliation.rb +205 -0
  192. data/lib/mayu/vdom/reconciliation.test.rb +56 -0
  193. data/lib/mayu/vdom/special_elements.rb +108 -0
  194. data/lib/mayu/vdom/update_context.rb +180 -0
  195. data/lib/mayu/vdom/vdom.perf.test.rb +146 -0
  196. data/lib/mayu/vdom/vnode.rb +266 -0
  197. data/lib/mayu/vdom/vtree.rb +672 -0
  198. data/lib/mayu/vdom/vtree.test.rb +68 -0
  199. data/lib/mayu/vdom.rb +8 -0
  200. data/lib/mayu/vdom.test.rb +73 -0
  201. data/lib/mayu/version.rb +6 -0
  202. data/lib/mayu.rb +8 -0
  203. data/mayu-live.gemspec +70 -0
  204. 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,4 @@
1
+ declare module "*.html" {
2
+ const value: string;
3
+ export default value;
4
+ }
@@ -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();