@nebularstreams/statify 3.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 (193) hide show
  1. package/dist/.DS_Store +0 -0
  2. package/dist/website.simple/webfonts/fa-brands-400.woff2 +0 -0
  3. package/dist/website.simple/webfonts/fa-solid-900.eot +0 -0
  4. package/dist/website.simple/webfonts/fa-solid-900.svg +4649 -0
  5. package/dist/website.simple/webfonts/fa-solid-900.ttf +0 -0
  6. package/dist/website.simple/webfonts/fa-solid-900.woff +0 -0
  7. package/dist/website.simple/webfonts/fa-solid-900.woff2 +0 -0
  8. package/dist/website.simple/website.css +32 -0
  9. package/dist/website.simple/website.min.js +6 -0
  10. package/dist/website.software/webfonts/fa-brands-400.woff2 +0 -0
  11. package/dist/website.software/webfonts/fa-solid-900.eot +0 -0
  12. package/dist/website.software/webfonts/fa-solid-900.svg +4649 -0
  13. package/dist/website.software/webfonts/fa-solid-900.ttf +0 -0
  14. package/dist/website.software/webfonts/fa-solid-900.woff +0 -0
  15. package/dist/website.software/webfonts/fa-solid-900.woff2 +0 -0
  16. package/dist/website.software/website.css +32 -0
  17. package/dist/website.software/website.min.js +6 -0
  18. package/dist/website.worlds/webfonts/fa-brands-400.woff2 +0 -0
  19. package/dist/website.worlds/webfonts/fa-solid-900.eot +0 -0
  20. package/dist/website.worlds/webfonts/fa-solid-900.svg +4649 -0
  21. package/dist/website.worlds/webfonts/fa-solid-900.ttf +0 -0
  22. package/dist/website.worlds/webfonts/fa-solid-900.woff +0 -0
  23. package/dist/website.worlds/webfonts/fa-solid-900.woff2 +0 -0
  24. package/dist/website.worlds/website.css +32 -0
  25. package/dist/website.worlds/website.min.js +6 -0
  26. package/package.json +49 -0
  27. package/readme.md +105 -0
  28. package/src/publisher-lib.js +179 -0
  29. package/src/publisher-list.js +91 -0
  30. package/src/publisher.js +38 -0
  31. package/src/util/cdn/nobj.cdn.js +88 -0
  32. package/src/util/htmlroute.js +39 -0
  33. package/src/util/markdown/lib.showdown.icon.js +62 -0
  34. package/src/util/markdown/lib.showdown.yt.js +54 -0
  35. package/src/util/markdown/markdown.js +144 -0
  36. package/src/util/navibar/util.navibar.js +63 -0
  37. package/src/util/sha.js +20 -0
  38. package/src/util/tokenizer.js +234 -0
  39. package/src/util/widgets/NoticeWidget.js +30 -0
  40. package/src/util/widgets/app.widgets.js +70 -0
  41. package/src/util/widgets/util.definewidget.js +14 -0
  42. package/src/widgets/Cookies.js +55 -0
  43. package/src/widgets/Frameset-simple.js +114 -0
  44. package/src/widgets/Frameset.js +124 -0
  45. package/src/widgets/Page.js +356 -0
  46. package/src/widgets/RightSide.js +93 -0
  47. package/src/widgets/Snippets.js +75 -0
  48. package/src/widgets/Tail.js +11 -0
  49. package/src/widgets/Widgets.js +10 -0
  50. package/src/widgets.client/Client.js +22 -0
  51. package/src/widgets.features/FeatureList.js +364 -0
  52. package/src/widgets.features/Youtube.js +23 -0
  53. package/src/widgets.features/bootcol.js +29 -0
  54. package/src/widgets.features/css/feature.css +112 -0
  55. package/src/widgets.features/css/tail.css +4 -0
  56. package/src/widgets.howto/Faq.js +201 -0
  57. package/src/widgets.howto/HowTo.js +419 -0
  58. package/src/widgets.howto/Tiles.js +51 -0
  59. package/src/widgets.howto/script-contractable.js +31 -0
  60. package/src/widgets.markdown/Document.js +84 -0
  61. package/src/widgets.market/MarketItem.js +278 -0
  62. package/src/widgets.market/MarketItem.orig.js +268 -0
  63. package/src/widgets.market/MarketItem.strips.js +276 -0
  64. package/src/widgets.market/StoryLicenseWIdget.js +45 -0
  65. package/src/widgets.market/app.utils.js +238 -0
  66. package/src.website/css/app/animations.css +27 -0
  67. package/src.website/css/app/ismobile.css +7 -0
  68. package/src.website/css/app/style.css +51 -0
  69. package/src.website/css/app/style.fullheight.css +9 -0
  70. package/src.website/css/app/style.mdblocks.css +59 -0
  71. package/src.website/css/app/style.putosafari.css +3 -0
  72. package/src.website/css/bootstrap/bootstrap-tiny-core.css +47 -0
  73. package/src.website/css/bootstrap/bootstrap-tiny-media-columns.css +1276 -0
  74. package/src.website/css/bootstrap/bootstrap-tiny-media-custom.css +59 -0
  75. package/src.website/css/bootstrap/bootstrap-tiny-media-display.css +279 -0
  76. package/src.website/css/bootstrap/bootstrap-tiny-media-flex.css +881 -0
  77. package/src.website/css/bootstrap/bootstrap-tiny-media-fonts.css +39 -0
  78. package/src.website/css/bootstrap/bootstrap-tiny-media-paddings.css +1348 -0
  79. package/src.website/css/css-core/core.ext.css +65 -0
  80. package/src.website/css/css-core/frontpage.css +28 -0
  81. package/src.website/css/css-core/root.css +34 -0
  82. package/src.website/css/css-core/root.fullheight.css +12 -0
  83. package/src.website/css/css-core/ui.dialog.round.css +14 -0
  84. package/src.website/css/css-core/ui.navibar.css +28 -0
  85. package/src.website/css/css-core/ui.notifications.css +12 -0
  86. package/src.website/css/css-featurelist/feature.css +196 -0
  87. package/src.website/css/css-featurelist/tail.css +4 -0
  88. package/src.website/css/css-screens/doc.css +22 -0
  89. package/src.website/css/css-screens/screens-meta.css +3 -0
  90. package/src.website/css/css-unsplash/unsplash.css +32 -0
  91. package/src.website/css/css-videos/youtube.css +28 -0
  92. package/src.website/css/css-wiki/wiki.css +206 -0
  93. package/src.website/css/css-wiki/wiki.sidepane.css +16 -0
  94. package/src.website/css/fontawesome/fa-brands.css +18 -0
  95. package/src.website/css/fontawesome/fa-solid.css +16 -0
  96. package/src.website/css/fontawesome/fa.css +4359 -0
  97. package/src.website/css/skin/mierda.css +15 -0
  98. package/src.website/css/skin/skin.dark.css +85 -0
  99. package/src.website/css/skin/skin.light.css +27 -0
  100. package/src.website/css/skin/vars.font.css +8 -0
  101. package/src.website/css/skin/vars.sizes.css +4 -0
  102. package/src.website/package-lock.json +2160 -0
  103. package/src.website/package.json +28 -0
  104. package/src.website/public/webfonts/fa-brands-400.woff2 +0 -0
  105. package/src.website/public/webfonts/fa-solid-900.eot +0 -0
  106. package/src.website/public/webfonts/fa-solid-900.svg +4649 -0
  107. package/src.website/public/webfonts/fa-solid-900.ttf +0 -0
  108. package/src.website/public/webfonts/fa-solid-900.woff +0 -0
  109. package/src.website/public/webfonts/fa-solid-900.woff2 +0 -0
  110. package/src.website/rollup.simple.mjs +36 -0
  111. package/src.website/rollup.software.mjs +36 -0
  112. package/src.website/rollup.terser.mjs +24 -0
  113. package/src.website/rollup.worlds.mjs +36 -0
  114. package/src.website/src/app/app.style.mjs +36 -0
  115. package/src.website/src/app/index.mjs +118 -0
  116. package/src.website/src/config.js +8 -0
  117. package/src.website/src/core/cdnmodel.mjs +7 -0
  118. package/src.website/src/core/clientruntime.mjs +41 -0
  119. package/src.website/src/core.cookies/analytics.mjs +96 -0
  120. package/src.website/src/core.cookies/cookiemanager.mjs +128 -0
  121. package/src.website/src/core.cookies/css/cookies.css +80 -0
  122. package/src.website/src/core.cookies/css/nocookies.css +48 -0
  123. package/src.website/src/core.extra/css/contractable.css +12 -0
  124. package/src.website/src/core.extra/css/faq.css +42 -0
  125. package/src.website/src/core.extra/css/howto.css +81 -0
  126. package/src.website/src/core.extra/extra.document.mjs +83 -0
  127. package/src.website/src/core.extra/extra.faq.mjs +30 -0
  128. package/src.website/src/core.extra/extra.mjs +62 -0
  129. package/src.website/src/main.simple.mjs +4 -0
  130. package/src.website/src/main.software.mjs +10 -0
  131. package/src.website/src/main.worlds.mjs +9 -0
  132. package/src.website/src/support/ismobile.mjs +4 -0
  133. package/src.website/src/support/nonce.mjs +4 -0
  134. package/src.website/src/support/persistsettings.mjs +41 -0
  135. package/src.website/src/support/qrcode.mjs +1269 -0
  136. package/src.website/src/support/timeutils.mjs +237 -0
  137. package/src.website/src/widgets/index.mjs +22 -0
  138. package/src.website/src.widgets/widgets.market/index.mjs +11 -0
  139. package/src.website/src.widgets/widgets.market/widgets/market/DiscoverWidget.mjs +401 -0
  140. package/src.website/src.widgets/widgets.market/widgets/market/EmptyNew.mjs +28 -0
  141. package/src.website/src.widgets/widgets.market/widgets/market/MarketDetail.mjs +78 -0
  142. package/src.website/src.widgets/widgets.market/widgets/market/MarketItem.mjs +349 -0
  143. package/src.website/src.widgets/widgets.market/widgets/market/MarketWidget.mjs +437 -0
  144. package/src.website/src.widgets/widgets.market/widgets/market/StoryLicenseWidget.mjs +34 -0
  145. package/src.website/src.widgets/widgets.market/widgets/market/css/market.css +394 -0
  146. package/src.website/src.widgets/widgets.market/widgets/market/css/notice.css +6 -0
  147. package/src.website/src.widgets/widgets.market/widgets/navibar/NaviBarWidget.mjs +58 -0
  148. package/src.website/src.widgets/widgets.market/widgets/navibar/css/titlebar.css +68 -0
  149. package/src.website/src.widgets/widgets.market/widgets/navibar/css/ui.navibar.css +28 -0
  150. package/src.website/src.widgets/widgets.software/index.mjs +9 -0
  151. package/src.website/src.widgets/widgets.software/widgets/BootStrapColumnWidget.mjs +17 -0
  152. package/src.website/src.widgets/widgets.software/widgets/DownloadWidget.mjs +210 -0
  153. package/src.website/src.widgets/widgets.software/widgets/LicenseWidget.js +103 -0
  154. package/src.website/src.widgets/widgets.software/widgets/css/download/download.css +110 -0
  155. package/src.website/src.widgets/widgets.software/widgets/css/license/beta.css +28 -0
  156. package/src.website/src.widgets/widgets.software/widgets/css/license/button.css +30 -0
  157. package/src.website/src.widgets/widgets.software/widgets/css/license/front.css +46 -0
  158. package/src.website/src.widgets/widgets.software/widgets/css/license/licenses.css +13 -0
  159. package/src.website/src.widgets/widgets.software/widgets/css/license/overstate.css +15 -0
  160. package/src.website/src.widgets/widgets.software/widgets/css/license/story.css +8 -0
  161. package/src.website/src.widgets/widgets.software/widgets/css/license/toolbar.css +9 -0
  162. package/src.website/src.widgets/widgets.software/widgets/support/version.mjs +88 -0
  163. package/src.website/src.widgets/widgets.worlds/index.mjs +11 -0
  164. package/src.website/src.widgets/widgets.worlds/widgets/LocalBrowser.mjs +386 -0
  165. package/src.website/src.widgets/widgets.worlds/widgets/LocalLauncher.code.mjs +247 -0
  166. package/src.website/src.widgets/widgets.worlds/widgets/LocalLauncher.mjs +239 -0
  167. package/src.website/src.widgets/widgets.worlds/widgets/css/input.css +32 -0
  168. package/src.website/src.widgets/widgets.worlds/widgets/css/localprojects.css +188 -0
  169. package/templates/documentation/assets/docs.css +7 -0
  170. package/templates/documentation/assets/images/right.webp +0 -0
  171. package/templates/documentation/images.json +12 -0
  172. package/templates/documentation/metadata.json +120 -0
  173. package/templates/documentation/pages/cookies.md +25 -0
  174. package/templates/documentation/pages/index.md +13 -0
  175. package/templates/documentation/pages/privacy.md +50 -0
  176. package/templates/documentation/pages/tos.md +49 -0
  177. package/templates/landing/assets/res/carousel/image-1.webp +0 -0
  178. package/templates/landing/assets/res/carousel/image-2.webp +0 -0
  179. package/templates/landing/assets/res/carousel/image-3.webp +0 -0
  180. package/templates/landing/assets/res/custom.css +122 -0
  181. package/templates/landing/assets/res/logos/favicon.ico +0 -0
  182. package/templates/landing/assets/res/logos/favicon.png +0 -0
  183. package/templates/landing/assets/res/logos/logo.medallion.png +0 -0
  184. package/templates/landing/assets/res/logos/logo.white.png +0 -0
  185. package/templates/landing/assets/res/proj/banda-tech-client.webp +0 -0
  186. package/templates/landing/assets/res/proj/banda-tech-server.webp +0 -0
  187. package/templates/landing/assets/res/proj/proj-common-ground.webp +0 -0
  188. package/templates/landing/assets/res/proj/proj-fieldnote.webp +0 -0
  189. package/templates/landing/assets/res/proj/proj-tribes.webp +0 -0
  190. package/templates/landing/images.json +932 -0
  191. package/templates/landing/metadata.json +115 -0
  192. package/templates/landing/pages/index.json +268 -0
  193. package/tool/cli.js +183 -0
@@ -0,0 +1,237 @@
1
+ /* eslint-disable no-nested-ternary */
2
+ /**
3
+ * Miscellaneous Time related utils
4
+ * @module app.utils
5
+ */
6
+
7
+ /* global ObjectAssign */
8
+
9
+ // noinspection NpmUsedModulesInstalled
10
+ const
11
+ m = require("mithril");
12
+
13
+ function decodeTimeInterval(datems) {
14
+ const date = new Date(datems);
15
+ let seconds = Math.floor((Date.now() - date) / 1000);
16
+ let unit = "second";
17
+ let direction = "ago";
18
+ if (seconds < 0) {
19
+ seconds = -seconds;
20
+ direction = "from now";
21
+ }
22
+ let value = seconds;
23
+ if (seconds >= 31536000) {
24
+ value = Math.floor(seconds / 31536000);
25
+ unit = "year";
26
+ } else if (seconds >= 86400) {
27
+ value = Math.floor(seconds / 86400);
28
+ unit = "day";
29
+ } else if (seconds >= 3600) {
30
+ value = Math.floor(seconds / 3600);
31
+ unit = "hour";
32
+ } else if (seconds >= 60) {
33
+ value = Math.floor(seconds / 60);
34
+ unit = "minute";
35
+ }
36
+ if (value !== 1) {
37
+ unit += "s";
38
+ }
39
+ return {
40
+ value, unit, direction, future: direction !== "ago"
41
+ };
42
+ }
43
+
44
+ /**
45
+ * Gets an english expression for a date difference
46
+ * @param {number} datems Date in ms
47
+ * @param options
48
+ * @return {string} Expression of difference from now ("5 minutes ago")
49
+ * @public
50
+ * @static
51
+ */
52
+
53
+ function getTimeInterval(datems, options = {}) {
54
+
55
+ const {
56
+ direction, value, unit, future
57
+ } = decodeTimeInterval(datems);
58
+
59
+ const lit = `${value} ${unit}`;
60
+
61
+ return options.short
62
+ ? `${value} ${unit}`
63
+ : (
64
+ options.onlyfuture
65
+ ? (
66
+ future
67
+ ? (options.prefixFuture || "in ") + lit
68
+ : options.pastMessage
69
+ )
70
+ : `${value} ${unit} ${direction}`
71
+ );
72
+ }
73
+
74
+ function splitDuration(ms, len = 3) {
75
+
76
+ let offsecs = Math.floor(ms / 1000);
77
+ if (offsecs < 60 || len < 1) return {secs: offsecs};
78
+
79
+ let mins = Math.floor(offsecs / 60);
80
+
81
+ let
82
+ days = 0,
83
+ hours = 0;
84
+
85
+ offsecs %= 60;
86
+
87
+ if (mins >= 60 && len > 1) {
88
+ hours = Math.floor(mins / 60);
89
+ if (hours >= 24 && len > 2) {
90
+ days = Math.floor(hours / 24);
91
+ hours %= 24;
92
+ }
93
+ mins %= 60;
94
+ }
95
+ return {
96
+ days,
97
+ hours,
98
+ mins,
99
+ secs: offsecs
100
+ };
101
+ }
102
+
103
+ /**
104
+ * Gets a hours, muinutes, seconds expression
105
+ * @param {number} ms Date in ms
106
+ * @param {Array=} separators Separators to use
107
+ * @public
108
+ * @static
109
+ * @return {string} The expression, like 10h15m10s
110
+ */
111
+
112
+ function getDuration(ms, separators) {
113
+
114
+ separators = separators || ["s", "m ", "h ", "d "];
115
+
116
+ const
117
+ [ss, sm, sh, sd] = separators,
118
+ len = separators.length,
119
+
120
+ {
121
+ days, hours, mins, secs
122
+ } = splitDuration(ms, len > 0 ? len - 1 : 0);
123
+
124
+ return [
125
+ ...days ? [days + sd] : [],
126
+ ...(hours || days) ? [hours + sh] : [],
127
+ ...(mins || hours || days) ? [mins + sm] : [],
128
+ (secs + ss)
129
+ ].join(" ");
130
+
131
+ }
132
+
133
+ /**
134
+ * Gets the system time string for a Date
135
+ * @param {number} ms Date in ms
136
+ * @public
137
+ * @static
138
+ * @return {string} System Locale time expression
139
+ */
140
+
141
+ function getTime(ms) {
142
+ const d = new Date(ms);
143
+ return d.toLocaleTimeString("de"); // TODO
144
+ }
145
+
146
+ function getFormattedTime(startTime, asWidget, widgetTitle, classe) {
147
+ // decide what to print in starttime cell
148
+ const measure = getTimeInterval(startTime);
149
+
150
+ // scheduled processes will print the finish time as the start time, and the start time as "expected"
151
+ return asWidget
152
+ ? m("span.padh.numsmall" + (classe || ""), {"data-title": widgetTitle}, measure)
153
+ : measure;
154
+ }
155
+
156
+ function getStartTime(process, asWidget, ProcessListData) {
157
+ // decide what to print in starttime cell
158
+ const measure = getTime(process.startTime);
159
+ let widgetTitle;
160
+
161
+ if (asWidget) {
162
+ switch (process.status) {
163
+ case ProcessListData.ST_SCHEDULED:
164
+ widgetTitle = "scheduled at";
165
+ break;
166
+ default:
167
+ widgetTitle = "started at";
168
+ }
169
+ }
170
+
171
+ // scheduled processes will print the finish time as the start time, and the start time as "expected"
172
+ return asWidget
173
+ ? m("span.padh.numsmall", {"data-title": widgetTitle}, measure)
174
+ : measure;
175
+ }
176
+
177
+ // decide what to print in finishtime cell
178
+ function getFinishTime(process, asWidget, ProcessListData) {
179
+
180
+ let measure;
181
+ let widgetTitle;
182
+
183
+ switch (process.status) {
184
+ case ProcessListData.ST_SCHEDULED:
185
+ measure = getTime(process.startTime);
186
+ widgetTitle = "scheduled at";
187
+ break;
188
+ case ProcessListData.ST_TERMINATED:
189
+ widgetTitle = "finish time";
190
+ measure = "---";
191
+ break;
192
+ default:
193
+ measure = process.status !== ProcessListData.ST_RUNNING
194
+ ? getDuration(process.finishTime - process.startTime)
195
+ : getDuration(new Date().valueOf() - process.startTime);
196
+ widgetTitle = process.status !== ProcessListData.ST_RUNNING ? "ran for" : "running for";
197
+ }
198
+ return asWidget
199
+ ? m("span.padh.numsmall", {"data-title": widgetTitle}, measure)
200
+ : measure;
201
+
202
+ }
203
+
204
+ const REGEXP = /^[A-Za-z0-9_-]+$/;
205
+
206
+ /**
207
+ * Whether a string is alphanumeric
208
+ * @param {string} str string to check
209
+ * @public
210
+ * @static
211
+ * @return {boolean} Whether
212
+ */
213
+
214
+ function isAlphanumeric(str) {
215
+ return !!(str.match(REGEXP));
216
+ }
217
+
218
+ const
219
+ TimeUtils = {
220
+ getTimeInterval,
221
+ decodeTimeInterval,
222
+ getDuration,
223
+ splitDuration,
224
+ getFormattedTime,
225
+ getFinishTime,
226
+ getStartTime,
227
+ getTime
228
+ },
229
+ /**
230
+ * String Utilities
231
+ */
232
+ StringUtils = {
233
+ isAlphanumeric
234
+ };
235
+
236
+ export default TimeUtils;
237
+ export {StringUtils};
@@ -0,0 +1,22 @@
1
+ import m from "mithril";
2
+ import {defineWidget} from "@nebularstreams/libmui";
3
+
4
+ const WIDGETSLIBRARY = {};
5
+
6
+ function install(widgets) {
7
+ Object.assign(WIDGETSLIBRARY, ...widgets);
8
+ }
9
+
10
+ const
11
+ InstancedWidget = (decode) => WIDGETSLIBRARY[decode.widget]
12
+ ? defineWidget(
13
+ ({attrs, state}) => m(WIDGETSLIBRARY[decode.widget], {
14
+ ...attrs,
15
+ static: decode.attrs,
16
+ state
17
+ }))
18
+ : undefined;
19
+
20
+
21
+ export default WIDGETSLIBRARY;
22
+ export {install, InstancedWidget};
@@ -0,0 +1,11 @@
1
+ import {TemplateMarket, AccessoryMarket} from "./widgets/market/MarketWidget.mjs";
2
+ import {WorldMarket, WorldAccessoriesMarket} from "./widgets/market/DiscoverWidget.mjs";
3
+
4
+ const WidgetLibrary = {
5
+ TemplateMarket,
6
+ AccessoryMarket,
7
+ WorldMarket,
8
+ WorldAccessoriesMarket
9
+ };
10
+
11
+ export default WidgetLibrary;
@@ -0,0 +1,401 @@
1
+ import m from "mithril";
2
+ import {defineWidget, Selector, NoticeWidget} from "@nebularstreams/libmui";
3
+ import Empty from "./EmptyNew.mjs";
4
+ import NaviBarWidget from "../navibar/NaviBarWidget.mjs"
5
+ import {TemplateItem, TemplateInstall} from "./MarketItem.mjs";
6
+
7
+ import {stag} from "../../../../src/core.cookies/analytics.mjs";
8
+ import CdnModel from "../../../../src/core/cdnmodel.mjs"
9
+
10
+ const
11
+ {platform} = CdnModel,
12
+ {listPath} = platform,
13
+
14
+ DEFAULT_TYPE = "world",
15
+ DEFAULT_MAX_FEATURED = 2,
16
+
17
+ FEATURECLASS = "col-12 col-md-6 col-lg-4 col-xxl-3",
18
+ window_setTimeout = window.setTimeout,
19
+ window_clearTimeout = window.clearTimeout;
20
+
21
+ function _insertItem(all, category, item) {
22
+ category = category.toLowerCase()
23
+ .trim();
24
+ if (category) {
25
+ if (!all[category]) {
26
+ all[category] = [];
27
+ }
28
+ all[category].push(item);
29
+ }
30
+ }
31
+
32
+ // noinspection JSUnusedLocalSymbols
33
+ const
34
+
35
+ CategoryWidget = defineWidget(
36
+ ({attrs, state}) => state.catkeys
37
+ .map((cat) => m("li.tag.category.grows.fabf.fa-tag", {
38
+ "aria-label": "category " + cat,
39
+ class: attrs.state.category === cat ? "accent" : "",
40
+ onclick: () => {
41
+ if (attrs.state.category === cat) {
42
+ delete attrs.state.category;
43
+ } else {
44
+ attrs.state.category = cat;
45
+ }
46
+ m.redraw();
47
+ }
48
+ }, cat)),
49
+
50
+ ({attrs, state}) => {
51
+
52
+ const
53
+ {items} = attrs,
54
+ templateValues = Object.values(items || {}),
55
+
56
+ getCategories = (templateValues) => templateValues.reduce((all, item) => {
57
+ const tags = (item.meta?.tags || "").split(" ");
58
+ for (const tag of tags) _insertItem(all, tag, item);
59
+ if (item.ext?.subtype) _insertItem(all, item.ext?.subtype, item);
60
+ return all;
61
+ }, {}),
62
+ categories = getCategories(templateValues);
63
+
64
+ Object.assign(state, {
65
+ categories,
66
+ catkeys: Object.keys(categories)
67
+ .sort()
68
+ });
69
+ attrs.state.categories = state.categories;
70
+ }
71
+ ),
72
+
73
+ PlatformEntityListWidget = defineWidget(
74
+ ({
75
+ attrs,
76
+ state
77
+ }) => (
78
+ state.data
79
+ ? state.empty
80
+ ? m(Empty, {
81
+ icon: attrs.icon,
82
+ size: 2,
83
+ message: attrs.message
84
+ })
85
+ : state.item
86
+ ? m(TemplateInstall, {
87
+ item: state.item,
88
+ class: attrs.itemClass || ("pad-2" + FEATURECLASS),
89
+ innerClass: attrs.innerClass || "growgrid graytrx shadow-2 bg-window-hi",
90
+ titleClass: attrs.titleClass || "",
91
+ onCancel: () => {
92
+ state.item = null;
93
+ m.redraw();
94
+ }
95
+ })
96
+ : m(
97
+ "ul.flexrow.wrap.grows.scrolly.templatestories.h-100.fadein",
98
+ {
99
+ "aria-label": attrs.label
100
+ },
101
+ [
102
+ ...attrs.header ? [m(NoticeWidget, attrs.header)] : [],
103
+ m(CategoryWidget, {
104
+ key: "cats",
105
+ state,
106
+ items: state.data.items
107
+ }),
108
+ m(".flexbreak", {key: "cosa"})
109
+ ].concat(
110
+ (state.category ? state.categories[state.category] : state.data.items)
111
+ .map((item) => m(TemplateItem, {
112
+ key: item.id,
113
+ item,
114
+ templates: 3,
115
+ isOnline: "Enter this world",
116
+ class: attrs.itemClass || ("pad-2 " + FEATURECLASS),
117
+ innerClass: attrs.innerClass || "growgrid graytrx shadow-2 bg-window-hi",
118
+ titleClass: attrs.titleClass || "",
119
+ onclick: () => {
120
+ state.item = item;
121
+ m.redraw();
122
+ }
123
+ }))
124
+ )
125
+ )
126
+ : state.loading
127
+ ? m(Empty, {
128
+ icon: "sync.fa-spin",
129
+ size: 2
130
+ })
131
+ : m(Empty, {
132
+ icon: attrs.icon,
133
+ size: 4,
134
+ message: attrs.message
135
+ })
136
+ ),
137
+ ({
138
+ attrs,
139
+ state
140
+ }) => {
141
+ state.loading = true;
142
+ m.request({
143
+ url: listPath(attrs.type, attrs.name)
144
+ })
145
+ .then((data) => {
146
+ state.data = data;
147
+ state.empty = !data.items.length;
148
+ state.loading = false;
149
+ m.redraw();
150
+ })
151
+ .catch((e) => {
152
+ state.error = e;
153
+ state.loading = false;
154
+ m.redraw();
155
+ });
156
+ }
157
+ ),
158
+
159
+ details = (item, BASE = undefined) => {
160
+ // window.location.href = `/${item.type}/${item.id}`;
161
+ window.location.href = item.ext?.url || `/${item.type}/${item.id}`;
162
+ },
163
+
164
+ PlatformEntityMasterList = defineWidget(
165
+ ({attrs, state}) => (
166
+ state.data
167
+ ? state.empty
168
+ ? m(Empty, {
169
+ icon: attrs.icon,
170
+ size: 4,
171
+ message: attrs.message
172
+ })
173
+ : m(
174
+ "ul.flexrow.wrap.grows.scrolly.templatestories.h-100.fadein",
175
+ {
176
+ "aria-label": attrs.label
177
+ },
178
+ [
179
+ ...attrs.header ? [m(NoticeWidget, attrs.header)] : [],
180
+ m(CategoryWidget, {
181
+ key: "cats",
182
+ state,
183
+ items: state.data.items
184
+ }),
185
+ m(".flexbreak", {key: "cosa"})
186
+ ].concat(
187
+ (state.category ? state.categories[state.category] : state.data.items)
188
+ .sort((a, b) => (a.creationTime < b.creationTime ? 1 : -1))
189
+ .map((item, index) => m(TemplateItem, {
190
+ key: item.id,
191
+ item,
192
+ ...attrs.featured && index < (Math.min(attrs.featured, DEFAULT_MAX_FEATURED))
193
+ ? {
194
+ featured: true,
195
+ templates: 3,
196
+ class: "fadein pad-2 " + (attrs.params?.featureClass || FEATURECLASS) + " featured"
197
+ }
198
+ : {
199
+ featured: false,
200
+ class: "fadein pad-2 " + (attrs.params?.featureClass || FEATURECLASS)
201
+ },
202
+
203
+ innerClass: attrs.params?.innerClass || "growgrid graytrx shadow-1",
204
+ titleClass: attrs.params?.titleClass || "",
205
+ noTitleIcon: attrs.params?.noTitleIcon,
206
+ noTitleChannel: attrs.params?.noTitleChannel,
207
+ itemClass: attrs.params?.itemClass || "",
208
+ imageClass: attrs.params?.imageClass || "",
209
+ shortPath: !!attrs.params?.shortPath,
210
+ onclick: () => {
211
+ window_clearTimeout(state.timer);
212
+ state.timer = window_setTimeout(
213
+ () => details(item, attrs.params?.htmlRoot),
214
+ 200
215
+ );
216
+ }
217
+ }))
218
+ )
219
+ )
220
+ : m(Empty, state.loading
221
+ ? {
222
+ icon: "sync.fa-spin",
223
+ size: 2
224
+ }
225
+ : {
226
+ icon: attrs.icon,
227
+ size: 4,
228
+ message: attrs.message
229
+ })
230
+ ),
231
+ ({attrs, state}) => {
232
+ state.loading = true;
233
+ m.request({
234
+ url: listPath(attrs.type, attrs.name)
235
+ })
236
+ .then((data) => {
237
+ state.data = data;
238
+ state.empty = !data.items.length;
239
+ state.loading = false;
240
+ m.redraw();
241
+ })
242
+ .catch((e) => {
243
+ state.error = e;
244
+ state.loading = false;
245
+ m.redraw();
246
+ });
247
+ }
248
+ );
249
+
250
+ const
251
+ WorldMarket = defineWidget(
252
+ ({attrs}) => m(
253
+ ".market.flexcol.ohidden.fullheight.skinroot.w-100",
254
+ {
255
+ class: attrs.state.dark ? "dark" : ""
256
+ },
257
+ [
258
+ m(Selector, {
259
+ class: "grows w-100 market",
260
+ toolbarClass: "pad-2 bg-window-hi shadow-2 subbar",
261
+ bodyClass: "relative",
262
+ hideonly: true,
263
+ items: [
264
+ {
265
+ text: "all",
266
+ widget: PlatformEntityMasterList,
267
+ attrs: {
268
+ label: attrs.static.entityLabel || "List of Worlds",
269
+ params: attrs.static,
270
+ featured: attrs.featured || 0,
271
+ key: "all",
272
+ type: attrs.static.entityType || DEFAULT_TYPE,
273
+ name: attrs.static.listName || "all",
274
+ icon: attrs.itemIcon || "object-ungroup",
275
+ message: [attrs.emptyMessage || "World List is not available at the moment", "Please try again later"].join("\n"),
276
+ ...attrs.static.headerTip && {
277
+ header: {
278
+ "key": "marika",
279
+ "class": "grows font-125 notihead",
280
+ "icon": "lightbulb",
281
+ "text": attrs.static.headerTip
282
+ }
283
+ }
284
+ }
285
+ }
286
+
287
+ /*
288
+ {
289
+ text: "720p",
290
+ widget: PlatformEntityMasterList,
291
+ attrs: {
292
+ label: "List of Templates for 720p",
293
+ featured: 2,
294
+ key: "720",
295
+ type: DEFAULT_TYPE,
296
+ params: attrs.static,
297
+ name: "720",
298
+ icon: "object-ungroup",
299
+ message: ["Template List is not available at the moment", "Please try again later"].join("\n")
300
+ }
301
+ },
302
+ {
303
+ text: "1080p",
304
+ widget: PlatformEntityMasterList,
305
+ attrs: {
306
+ label: "List of Templates for 1080p",
307
+ featured: 2,
308
+ key: "1080",
309
+ type: DEFAULT_TYPE,
310
+ name: "1080",
311
+ params: attrs.static,
312
+ icon: "object-ungroup",
313
+ message: ["Template List is not available at the moment", "Please try again later"].join("\n")
314
+ }
315
+ }
316
+
317
+ */
318
+ ]
319
+ })
320
+ ]
321
+ ),
322
+ () => stag("Market")
323
+ ),
324
+ KeyWrapper = defineWidget(
325
+ ({children}) => [children]
326
+ ),
327
+ RouteSelector = defineWidget(
328
+ ({attrs}) => {
329
+ const
330
+ {routes, current, default: defaultValue} = attrs,
331
+ currentRoute = current ? routes[current] || routes[defaultValue] : routes[defaultValue];
332
+
333
+ return [
334
+ m(NaviBarWidget, {label: attrs.toolbarLabel, class: attrs.toolbarClass, subbar: true}, Object.values(attrs.routes)
335
+ .map(({caption, link, key}) =>
336
+ m(m.route.Link, {href: link, class: current === key ? "accent" : ""}, caption)
337
+ )),
338
+ m(KeyWrapper, [
339
+ m(
340
+ currentRoute.widget,
341
+ currentRoute.attrs
342
+ )
343
+ ])
344
+ ];
345
+ }
346
+ ),
347
+ WorldAccessoriesMarket = defineWidget(
348
+ ({attrs}) => m(
349
+ ".market.flexcol.ohidden.fullheight.skinroot.w-100",
350
+ {
351
+ class: attrs.state.dark ? "dark" : ""
352
+ },
353
+ [
354
+ m(RouteSelector, {
355
+ class: "grows w-100 market",
356
+ toolbarClass: "justify-content-around pad-2 bg-window-hi shadow-2 subbar",
357
+ toolbarLabel: "Accessory Type Selector",
358
+ current: attrs.subtype,
359
+ default: "gadgets",
360
+ routes: {
361
+ /*
362
+ worlds: {
363
+ key: "worlds",
364
+ caption: "worlds",
365
+ link: "/worlds",
366
+ widget: PlatformEntityMasterList,
367
+ attrs: {
368
+ label: "List of 3D worlds",
369
+ key: "worlds",
370
+ type: "worlds",
371
+ name: "all",
372
+ icon: "border-none",
373
+ params: attrs.static,
374
+ message: ["3D Worlds are not available at the moment", "Please try again later"].join("\n")
375
+ }
376
+ },
377
+
378
+ */
379
+ library: {
380
+ key: "library",
381
+ caption: "resources",
382
+ link: "/library",
383
+ widget: PlatformEntityMasterList,
384
+ attrs: {
385
+ label: "List of 3D Resources",
386
+ key: "library",
387
+ type: "library",
388
+ name: "all",
389
+ icon: "border-none",
390
+ params: attrs.static,
391
+ message: ["3D Resources are not available at the moment", "Please try again later"].join("\n")
392
+ }
393
+ }
394
+ }
395
+ })
396
+ ]
397
+ ),
398
+ () => stag("AccessoryMarket")
399
+ );
400
+
401
+ export {WorldMarket, WorldAccessoriesMarket};
@@ -0,0 +1,28 @@
1
+ import m from "mithril";
2
+ import {defineWidget, Empty} from "@nebularstreams/libmui";
3
+
4
+ const
5
+ NewEmptyWidget = defineWidget(
6
+ ({attrs, children}) => {
7
+
8
+ const
9
+ messages = (attrs.message || "").split("\n")
10
+ .filter((msg) => !!msg),
11
+ message = messages.length ? messages.shift() : undefined;
12
+
13
+ return m(
14
+ Empty,
15
+ {
16
+ icon: attrs.icon,
17
+ size: attrs.size,
18
+ message
19
+ },
20
+ [
21
+ ...messages.map((msg) => m("p", msg)),
22
+ ...children
23
+ ]
24
+ );
25
+ }
26
+ );
27
+
28
+ export default NewEmptyWidget;