@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,364 @@
1
+ const
2
+ m = require("mithril"),
3
+ defineWidget = require("../util/widgets/util.definewidget"),
4
+ {Icon} = require("../util/widgets/app.widgets"),
5
+ TailWidget = require("../widgets/Tail"),
6
+
7
+ BootCol = require("./bootcol"),
8
+ {YouTube} = require("./Youtube"),
9
+ {convert} = require("../util/markdown/markdown"),
10
+
11
+ Feature = defineWidget(
12
+ ({attrs, children}) => {
13
+ const {feature, metadata, relativeRoute} = attrs;
14
+ return m(
15
+ BootCol,
16
+ {
17
+ el: "li",
18
+ class: "col-12 always-grows " + (feature.bootstrapClass || "col-lg-6 col-xxl-4") + " " + (feature.class || " pad-1"),
19
+ subclass: feature.subclass || "feature text-al-center pad-4 shadow-2",
20
+ label: feature.title,
21
+ after: feature.items
22
+ ? feature.items.map((item) => m(ItemBody, {item, metadata, relativeRoute}))
23
+ : []
24
+ },
25
+ [
26
+ ...feature.subhead
27
+ ? [
28
+ m(".subhead.marg-1", feature.subhead)
29
+ ]
30
+ : [],
31
+ ...feature.icon
32
+ ? [m(Icon, feature)]
33
+ : feature.image
34
+ ? [
35
+ m(".imgicon.al-center", m("img.unitsize", {src: feature.image, alt: feature.title, class: feature.imageClass}))
36
+ ]
37
+ : [],
38
+ ...feature.title ? [
39
+ m("h3.marg-2", feature.title),
40
+ ] : [],
41
+ ...feature.text ? [
42
+ m(
43
+ ".body.marg-1",
44
+ {role: "presentation"},
45
+ m.trust(convert(
46
+ feature.text,
47
+ {
48
+ metadata,
49
+ relativeRoute
50
+ }
51
+ ).html)
52
+ ),
53
+ ] : [],
54
+ ...children,
55
+
56
+ ...feature.links
57
+ ? [
58
+ m("nav.linkbox", feature.links.map((link) => m("a.paralink.tag", {
59
+ href: link.href,
60
+ class: link.class,
61
+ ...link.target && {target: link.target}
62
+ }, link.text))),
63
+ " "
64
+ ]
65
+ : []
66
+
67
+ ]
68
+ );
69
+ }
70
+ ),
71
+
72
+ FeatureLeft = defineWidget(
73
+ ({attrs, children}) => {
74
+ const {feature, metadata, relativeRoute} = attrs;
75
+ return m(
76
+ BootCol,
77
+ {
78
+ el: "li",
79
+ class: "col-12 always-grows " + (feature.bootstrapClass || "col-lg-6 col-xxl-4") + " " + (feature.class || "pad-1"),
80
+ subclass: feature.subclass || "feature pad-4 shadow-2",
81
+ label: feature.title,
82
+ after: feature.items
83
+ ? feature.items.map((item) => m(ItemBody, {item, metadata, relativeRoute}))
84
+ : []
85
+ },
86
+ [
87
+ m(".flexrow.titleblock", [
88
+
89
+ ...feature.icon
90
+ ? [m(Icon, feature)]
91
+ : feature.image
92
+ ? [
93
+ m(".imgicon.al-center", m("img.unitsize", {src: feature.image, alt: feature.title, class: feature.imageClass}))
94
+ ]
95
+ : [],
96
+
97
+ m(".flexcol.grows.titleholder", [
98
+ ...feature.subhead
99
+ ? [
100
+ m(".subhead.marg-1", feature.subhead)
101
+ ]
102
+ : [],
103
+ ...feature.title ? [
104
+ m("h3.marg-2", feature.title)
105
+ ] : [],
106
+ ])]),
107
+
108
+ ...feature.text ? [
109
+ m(
110
+ ".body.marg-1",
111
+ {role: "presentation"},
112
+ m.trust(convert(
113
+ feature.text,
114
+ {
115
+ metadata,
116
+ relativeRoute
117
+ }
118
+ ).html)
119
+ ),
120
+ ] : [],
121
+
122
+ ...children,
123
+
124
+ ...feature.links
125
+ ? [
126
+ m("nav.linkbox", feature.links.map((link) => m("a.paralink.tag", {
127
+ href: link.href,
128
+ class: link.class,
129
+ ...link.target && {target: link.target}
130
+ }, link.text))),
131
+ " "
132
+ ]
133
+ : []
134
+
135
+ ]
136
+ );
137
+ }
138
+ ),
139
+ Video = defineWidget(
140
+ ({attrs}) => m("video", {
141
+ src: attrs.video.url + ".mp4",
142
+ poster: attrs.video.url + ".png",
143
+ loop: !!attrs.video.loop,
144
+ autoplay: !!attrs.video.autoplay,
145
+ controls: true,
146
+ muted: !!attrs.video.autoplay
147
+ })
148
+ ),
149
+ ItemBody = defineWidget(
150
+ ({attrs}) => {
151
+ const {item, metadata, relativeRoute} = attrs;
152
+ return (
153
+ item.image
154
+ ? m(
155
+ ".item-image.obsimage",
156
+ {class: item.class || "pad-4", role: "presentation", "aria-label": item.alt, "data-title": item.title},
157
+ item.el === "div"
158
+ ? m(".img", {title: item.alt, style: {backgroundImage: `url(${item.image})`}, class: item.imageClass || "w-100"})
159
+ : m("img", {alt: item.alt, src: item.image, class: item.imageClass || "w-100"})
160
+ )
161
+ : Array.isArray(item.imageCarousel)
162
+ ? m(
163
+ ".item-image-carousel",
164
+ {class: item.class || "pad-4", role: "presentation", "aria-label": item.alt, "data-title": item.title, "data-total": item.imageCarousel.length, "data-time": item.time || 5},
165
+ item.imageCarousel.map(({url, alt}, index) => item.el === "div"
166
+ ? m(".img" + (index ? "" : ".active"), {title: item.alt, style: {backgroundImage: `url(${url})`}, class: item.imageClass || "w-100"})
167
+ : m("img", {alt: alt || item.alt, src: url, class: (index ? "" : "active ") + (item.imageClass || "w-100")})
168
+ )
169
+ )
170
+ : item.cards
171
+ ? m("ul.item-cards.flexrow.wrap", {class: item.itemClass}, item.cards.map(
172
+ (feature) => (
173
+ m(
174
+ feature.left ? FeatureLeft : Feature,
175
+ {
176
+ feature: {
177
+ size: item.iconSize || 3,
178
+ class: item.cardsClass || "pad-2 screen",
179
+ bootstrapClass: item.bootstrapClass || undefined,
180
+ ...feature
181
+ },
182
+ metadata,
183
+ relativeRoute
184
+ },
185
+ []
186
+ )
187
+ )
188
+ ))
189
+ : item.video
190
+ ? m(
191
+ ".item-video.obsvideo",
192
+ {class: item.class, "aria-label": item.video.title},
193
+ m(Video, {
194
+ video: item.video
195
+ })
196
+ )
197
+ : item.youtube
198
+ ? m(YouTube, {
199
+ class: item.youtube.class,
200
+ videoItem: item.youtube
201
+ })
202
+ : item.link
203
+ ? m("a.paralink", {
204
+ href: item.link.href,
205
+ class: item.link.class,
206
+ ...item.link.target && {target: item.link.target}
207
+ }, item.link.text)
208
+
209
+ : m(
210
+ item.el || ".paragraph",
211
+ {
212
+ class: item.class || "",
213
+ "aria-label": item.label,
214
+ ...item.el ? {} : {role: "presentation"}
215
+ },
216
+ m.trust(
217
+ item.el
218
+ ? item.text
219
+ : convert(
220
+ item.text,
221
+ {
222
+ metadata,
223
+ relativeRoute
224
+ }
225
+ ).html
226
+ )
227
+ )
228
+ );
229
+ }
230
+ ),
231
+
232
+ ItemTile = defineWidget(
233
+ ({attrs}) => {
234
+ const {tile, metadata, relativeRoute} = attrs;
235
+ return m(
236
+ ".titler",
237
+ {
238
+ class: tile.class || "flexcol grows",
239
+ role: "presentation"
240
+ },
241
+ tile.items.map((item) => m(ItemBody, {item, metadata, relativeRoute}))
242
+ );
243
+ }
244
+ ),
245
+
246
+ FeatureList = defineWidget(
247
+ ({attrs, state}) => {
248
+ const
249
+ {pageMetadata, metadata, relativeRoute} = attrs,
250
+ {features, title} = pageMetadata,
251
+ navibar = metadata.navibar || pageMetadata.navibar;
252
+
253
+ return m(
254
+ "ul.feature-list.flexrow.h-100.w-100.wrap.scrolly",
255
+ {
256
+ ...navibar?.autoHide && {id: "scrolltracker"},
257
+ "aria-label": title,
258
+ class: features.containerClass
259
+ },
260
+ [
261
+
262
+ m(
263
+ BootCol,
264
+ {
265
+ el: "li",
266
+ label: pageMetadata.title,
267
+ class: "col-12 screen feature-title" + " " + (features.title.containerClass || features.containerClass || "pad-1"),
268
+ subclass: (features.mainClass || "text-al-center") + " " + (features.class ? features.class : "pad-6")
269
+ },
270
+ [
271
+ m(ItemTile, {tile: features.title, metadata, relativeRoute})
272
+ ]
273
+ ),
274
+
275
+ ...features.youtube
276
+ ? [
277
+ m(YouTube, {
278
+ el: "li",
279
+ class: "feature-video obsvideo fully" + (features.youtube?.class || ""),
280
+ role: "presentation",
281
+ videoItem: features.youtube
282
+ })
283
+ ] : [],
284
+
285
+ ...features.video
286
+ ? [
287
+ m(
288
+ "li.feature-video.obsvideo.fully",
289
+ {class: pageMetadata.class + (features.video.class ? " " + features.video.class : ""), "aria-label": features.video.title},
290
+ m(Video, {
291
+ video: features.video
292
+ })
293
+ )
294
+ ]
295
+ : [],
296
+
297
+ ...features.cards
298
+ ? features.cards.map((card) => m(
299
+ BootCol,
300
+ {
301
+ el: "li",
302
+ label: card.title,
303
+ class: "lighter col-12 screen feature-card " + (card.containerClass || "pad-1"),
304
+ subclass: (features.mainClass || "text-al-center") + " " + (card.subclass ? card.subclass : "pad-6")
305
+ },
306
+ [
307
+ m(ItemTile, {tile: card, metadata, relativeRoute})
308
+ ]
309
+ ))
310
+ : [],
311
+
312
+ ...features.items
313
+ ? features.items.map(
314
+ (feature) => (
315
+ feature.card
316
+ ? m(ItemTile, {tile: feature, metadata, relativeRoute})
317
+ : m(
318
+ feature.left ? FeatureLeft : Feature,
319
+ {
320
+ feature: {
321
+ size: features.iconSize || 3,
322
+ ...feature,
323
+ class: features.itemsClass || "pad-2 screen"
324
+ },
325
+ metadata,
326
+ relativeRoute
327
+ },
328
+ []
329
+ )
330
+ )
331
+ )
332
+ : [],
333
+
334
+ ...features.footer
335
+ ? [
336
+ m(
337
+ BootCol,
338
+ {
339
+ el: "li",
340
+ class: "feature-footer lighter col-12 screen " + (features.footer.outerClass || "pad-1"),
341
+ subclass: "text-al-center pad-6 " + (features.footer.containerClass || ""),
342
+ label: features.footer.title || "Footer"
343
+ },
344
+ [
345
+ m(ItemTile, {tile: features.footer, metadata, relativeRoute})
346
+ ]
347
+ )
348
+ ] : [],
349
+
350
+ ...pageMetadata.footer
351
+ ? [
352
+ m(
353
+ "li",
354
+ {"aria-label": pageMetadata.footer.title || "footer", class: "page-footer col-12"},
355
+ m(TailWidget, {el: "li", class: pageMetadata.footerClass || "shadow-2", ...pageMetadata.footer})
356
+ )
357
+ ]
358
+ : []
359
+ ]
360
+ );
361
+ }
362
+ );
363
+
364
+ module.exports = FeatureList;
@@ -0,0 +1,23 @@
1
+ const m = require("mithril");
2
+
3
+ function getYouTubeImage(ref) {
4
+ return `https://i3.ytimg.com/vi/${ref}/hqdefault.jpg`;
5
+ }
6
+
7
+ const YouTube = {
8
+ view: ({ attrs }) => m((attrs.el || "") + ".youtube.relative", {
9
+ class: attrs.class,
10
+ title: attrs.videoItem.title
11
+ }, [
12
+ m(".previewHolder.absolute.w-100.h-100", { role: "presentation" }, [
13
+ m("iframe", {
14
+ allowFullscreen: true,
15
+ class: "absolute w-100 h-100",
16
+ "data-img": attrs.image || getYouTubeImage(attrs.videoItem.ref),
17
+ "data-src": "https://www.youtube.com/embed/" + attrs.videoItem.ref + "?rel=0&modestbranding=1"
18
+ })
19
+ ])
20
+ ])
21
+ };
22
+
23
+ module.exports = { YouTube, getYouTubeImage };
@@ -0,0 +1,29 @@
1
+ const m = require("mithril");
2
+
3
+ module.exports = {
4
+ view: ({ attrs, children }) => {
5
+
6
+ const
7
+
8
+ xild = m((attrs.iel || "") + ".grows", {
9
+ id: attrs.htmlid,
10
+ role: "presentation",
11
+ class: (attrs.rows ? "flexrow wrap" : "flexcol") + " " + (attrs.subclass || "")
12
+ }, children);
13
+
14
+ return attrs.simple
15
+ ? xild
16
+ : m(
17
+ (attrs.el || "") + ".flexcol",
18
+ {
19
+ class: attrs.class || "col-12.container",
20
+ ...attrs.label && { "aria-label": attrs.label }
21
+
22
+ },
23
+ [
24
+ xild,
25
+ ...(attrs.after||[])
26
+ ]
27
+ );
28
+ }
29
+ };
@@ -0,0 +1,112 @@
1
+ .screen .feature {
2
+ background: var(--window-background-hi);
3
+ border-radius: 0.25rem;
4
+ }
5
+
6
+ .screen.fullrow {
7
+ height: 100%;
8
+ }
9
+
10
+ .screen.fullrow > div {
11
+ flex-grow: 1;
12
+ justify-content: center;
13
+ }
14
+
15
+ .screen .motto {
16
+ color: white;
17
+ }
18
+
19
+ .screen .features h1 {
20
+ width: 100%;
21
+ font-size: 1.5rem;
22
+ padding: 0.5rem;
23
+ background: rgba(0, 0, 0, 0.1);
24
+ border-bottom: solid 1px;
25
+ border-top: solid 1px;
26
+ }
27
+
28
+ .screen .features .body {
29
+ font-weight: normal;
30
+ }
31
+
32
+ .screen .imgicon {
33
+ margin: -0.15rem;
34
+ }
35
+
36
+ .screen .shot > img {
37
+ box-shadow: 0 0 2px var(--shadow-color);
38
+ border-radius: 0.25rem;
39
+ }
40
+
41
+ .paragraph.attrib-1 {
42
+ font-weight: bold;
43
+ }
44
+
45
+ .screen .attrib-1, .screen .attrib-2 {
46
+ font-size: 75%;
47
+ width: 100%;
48
+ }
49
+
50
+ .obsvideo video {
51
+ width: 100%;
52
+ }
53
+
54
+ a.paralink.accentbutton {
55
+ background: var(--accent);
56
+ color: var(--text-over-accent);
57
+ padding: 0.5rem;
58
+ border-radius: 0.25rem;
59
+ }
60
+
61
+ .obsvideo.fully {
62
+ order: -1;
63
+ margin: 0;
64
+ padding: 0;
65
+ width: 100%;
66
+ }
67
+
68
+ .story {
69
+ order: 100;
70
+ }
71
+
72
+ .youtube.obsvideo.fully {
73
+ order: -1;
74
+ height: calc(100vw * 9 / 16);
75
+ margin-bottom: 0.25rem;
76
+ }
77
+
78
+ .youtube .previewWindow,
79
+ .youtube .previewHolder {
80
+ pointer-events: all !important;
81
+ }
82
+
83
+ .youtube .emptywidget {
84
+ position: absolute;
85
+ top: 0;
86
+ left: 0;
87
+ right: 0;
88
+ bottom: 0;
89
+ color: white;
90
+ pointer-events: none;
91
+ }
92
+
93
+ .youtube.video_ready .previewWindow {
94
+ opacity: 1;
95
+ }
96
+
97
+ .paragraph.nodownload {
98
+ border: solid 1px var(--border-color);
99
+ padding: 1rem;
100
+ margin-top: 1rem;
101
+ background: var(--accent-light);
102
+ border-radius: 0.25rem;
103
+ }
104
+
105
+ .obsvideo.inner {
106
+ margin: 1rem;
107
+ border-radius: 0.5rem !important;
108
+ overflow: hidden;
109
+ background: black;
110
+ color: white;
111
+ text-align: center;
112
+ }
@@ -0,0 +1,4 @@
1
+ .tail a {
2
+ color: white;
3
+ text-decoration: none;
4
+ }