@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,124 @@
1
+ const
2
+ m = require("mithril"),
3
+
4
+ defineWidget = require("../util/widgets/util.definewidget"),
5
+ { Empty, Icon } = require("../util/widgets/app.widgets"),
6
+ NaviBar = require("../util/navibar/util.navibar"),
7
+
8
+ Widgets = require("./Widgets");
9
+
10
+ function getLink(url, metadata) {
11
+ if (!url) return "";
12
+ if (url.startsWith("http")) return url;
13
+ if (url.startsWith("/")) return metadata.site.url + url;
14
+ return [metadata.canonical, url].join("/");
15
+ }
16
+
17
+ const
18
+
19
+ NaviOption = defineWidget(({ attrs }) => {
20
+
21
+ const
22
+ { link, metadata, id, relativeRoute } = attrs,
23
+ { title, icon, linkClass = icon ? "d-none d-sm-flex" : "", iconClass = "d-sm-none", url } = link,
24
+ el = (link.static || !link.url) ? "div" : "a";
25
+
26
+ return m(
27
+ ".naviholder.flexrow" + (url ? "[itemscope]" : ""),
28
+ {
29
+ class: (link.class || "") + (relativeRoute === url ? " accent" : "") + (attrs.link.separator ? " grows" : ""),
30
+ ...url
31
+ ? {
32
+ itemtype: "https://schema.org/SiteNavigationElement"
33
+ }
34
+ : {
35
+ role: "presentation"
36
+ }
37
+ },
38
+ [
39
+ m(
40
+ el + ".flexrow",
41
+ {
42
+ title: title || id,
43
+ ...url && { itemprop: "url", href: getLink(url, metadata) }
44
+ },
45
+ [
46
+ // icon
47
+ ...icon ? [m(Icon, { iconClass, icon })] : [],
48
+
49
+
50
+ // text
51
+ m(
52
+ link.static ? "b.ellipsis" : ".ellipsis",
53
+ { class: linkClass, itemprop: "name" },
54
+ link.separator ? "" : (title || id)
55
+ )
56
+
57
+ ])
58
+ ]);
59
+ }),
60
+ Frame = defineWidget(
61
+ ({ attrs }) => {
62
+
63
+ const
64
+ { metadata, pageMetadata, dynamicData, relativeRoute } = attrs,
65
+ widget = Widgets[pageMetadata.widget],
66
+ navibar = pageMetadata.navibar || metadata.navibar,
67
+ links = navibar?.links || pageMetadata.links;
68
+
69
+ return m(
70
+ ".flexcol.fullheight.docroot.ohidden.relative",
71
+ {
72
+ role: "presentation",
73
+ class: pageMetadata.class
74
+ },
75
+ [
76
+ ...pageMetadata.notitlebar ? [] : [m(
77
+ NaviBar,
78
+ { class: "titlebar", cdnModel: attrs.cdnModel, metadata, pageMetadata },
79
+ [
80
+ ...Object.keys(links)
81
+ .map((id) => m(NaviOption, {
82
+ id,
83
+ link: links[id],
84
+ metadata,
85
+ relativeRoute
86
+ })),
87
+
88
+ ...pageMetadata.displayTitle || navibar?.displayTitle
89
+ ? [m(".tititem.grows", pageMetadata.title)]
90
+ : dynamicData?.item?.meta
91
+ ? [m(".tititem.grows", dynamicData.item?.meta.title)]
92
+ : []
93
+ ]
94
+ )],
95
+
96
+ m(
97
+ ".screen.flexcol.grows.ohidden",
98
+ {
99
+ role: "presentation",
100
+ class: pageMetadata.class
101
+ },
102
+ widget
103
+ ? [
104
+ m(widget, {
105
+ cdnModel: attrs.cdnModel,
106
+ metadata,
107
+ pageMetadata,
108
+ dynamicData,
109
+ relativeRoute,
110
+ source: attrs.source
111
+ })
112
+ ]
113
+ : [
114
+ m(Empty, {
115
+ message: "Unknown widget " + pageMetadata.widget
116
+ })
117
+ ]
118
+ )
119
+ ]
120
+ );
121
+ }
122
+ );
123
+
124
+ module.exports = Frame;
@@ -0,0 +1,356 @@
1
+ const
2
+ m = require("mithril"),
3
+
4
+ Script = require("../util/sha"),
5
+
6
+ defineWidget = require("../util/widgets/util.definewidget"),
7
+
8
+ {tokenizeStrict, tokenizeObject} = require("../util/tokenizer"),
9
+ {createSnippet, createHtml} = require("./Snippets"),
10
+
11
+ FrameSet = require("./Frameset"),
12
+ FrameSimple = require("./Frameset-simple"),
13
+ TailWidget = require("./Tail"),
14
+
15
+ EXTENSION_HTML = "";
16
+
17
+ function getYouTubeImage(ref) {
18
+ return `https://i3.ytimg.com/vi/${ref}/hqdefault.jpg`;
19
+ }
20
+
21
+ const
22
+
23
+ resolveRelativeUrl = (relativeUrl, pageMetadata, metadata, base) => {
24
+ return relativeUrl
25
+ ? relativeUrl.indexOf("://") === -1
26
+ ? metadata.canonical + (base ? "/" + base : "") + "/" + relativeUrl
27
+ : relativeUrl
28
+ : undefined;
29
+ },
30
+
31
+ getPageImageUrl = (pageMetadata, metadata, base) => resolveRelativeUrl(
32
+ (pageMetadata.image || metadata.image)?.url,
33
+ pageMetadata,
34
+ metadata,
35
+ base
36
+ ),
37
+
38
+ getImage = (metadata, pageMetadata, dynamicData = {}) => {
39
+
40
+ return dynamicData?.item?.image || (
41
+ dynamicData?.item?.meta?.ytref
42
+ ? getYouTubeImage(dynamicData.item?.meta?.ytref)
43
+ : tokenizeStrict(pageMetadata.image.url, dynamicData)
44
+ ) || metadata.image.url;
45
+
46
+ },
47
+
48
+ findLinkMetadataTitle = (name, metadata) => (metadata["links.metadata"] && metadata["links.metadata"][name]?.title),
49
+
50
+ BreadCrumb = defineWidget(
51
+ ({attrs}) => {
52
+ const {metadata, pageMetadata, levels, base} = attrs;
53
+ return m.trust(
54
+ createSnippet("BreadCrumb", [
55
+
56
+ /* The main breadcrumb in METADATA.JSON - if this is a child publish */
57
+ ...metadata.breadcrumb
58
+ ? [
59
+ {
60
+ name: metadata.breadcrumb.name,
61
+ url: resolveRelativeUrl(metadata.breadcrumb.url, pageMetadata, metadata, base)
62
+ }
63
+ ] : [],
64
+
65
+ /* If a child page, add parent breadcrumb */
66
+ ...pageMetadata.mainpage
67
+ ? [
68
+ {
69
+ name: findLinkMetadataTitle(pageMetadata.mainpage, metadata) || pageMetadata.mainpage,
70
+ url: [metadata.canonical, pageMetadata.mainpage].join("/")
71
+ }
72
+
73
+ ]
74
+
75
+ /* if not, add the levels as breadcrumbs */
76
+ : levels.map(({name, link, submeta}) => (
77
+ {
78
+ name: submeta?.title || name,
79
+ url: `${metadata.canonical}/${link}/index`
80
+ }
81
+ )),
82
+
83
+ /* A breadcrumb in PAGE METADATA comes after the Main Page */
84
+ ...pageMetadata.breadcrumb
85
+ ? [
86
+ {
87
+ name: pageMetadata.breadcrumb.name,
88
+ url: resolveRelativeUrl(pageMetadata.breadcrumb.url, pageMetadata, metadata, base)
89
+ }
90
+ ] : []
91
+ ]));
92
+ }
93
+ ),
94
+
95
+ OpenGraph = defineWidget(({attrs}) => [
96
+ m("meta", {property: "og:url", content: attrs.canonical}),
97
+ m("meta", {property: "og:image", content: attrs.pageImage}),
98
+ m("meta", {property: "og:title", content: attrs.altTitle}),
99
+ m("meta", {property: "og:description", content: attrs.description}),
100
+ m("meta", {property: "og:updated_time", content: attrs.updatedTime}),
101
+ m("meta", {property: "og:site_name", content: attrs.site_name}),
102
+ ...attrs.type ? [m("meta", {property: "og:type", content: attrs.type})] : [],
103
+ ...attrs.section ? [m("meta", {property: "og:section", content: attrs.section})] : []
104
+ ]),
105
+ Page = defineWidget(({attrs, children}) => {
106
+
107
+ const
108
+ {metadata, pageMetadata, relativeRoute, levels, base} = attrs,
109
+ removeExtensions = relativeRoute.split(".md")
110
+ .join(""),
111
+ {canonical: forcedCanonical} = pageMetadata,
112
+ canonical = forcedCanonical && forcedCanonical.startsWith("/")
113
+ ? metadata.site.url + forcedCanonical
114
+ : [metadata.canonical, removeExtensions].join("/"),
115
+
116
+ pageImage = getPageImageUrl(pageMetadata, metadata, base),
117
+
118
+ next = pageMetadata.description || metadata.description || attrs.description || "",
119
+
120
+ updatedTime = new Date().toISOString(),
121
+ ogtype = pageMetadata.ogtype || metadata.ogtype,
122
+
123
+ {submeta} = pageMetadata,
124
+
125
+ title = pageMetadata.titleRaw
126
+ ? pageMetadata.title
127
+ : pageMetadata.title + " | " + (submeta?.title || metadata.title),
128
+
129
+ altTitle = pageMetadata.titleRaw
130
+ ? pageMetadata.title
131
+ : pageMetadata.title + " (" + (submeta?.title || metadata.title) + ")";
132
+
133
+ // console.warn("RR", relativeRoute, "BP", basePath, "lv", levels);
134
+
135
+ return m(
136
+ "html",
137
+ {
138
+ lang: "en",
139
+ class: "skinroot"
140
+ },
141
+ [
142
+ m("head", [
143
+ m("title", title),
144
+ m("meta", {name: "description", content: next.substring(0, 160)}),
145
+ ...metadata.meta.map((mt) => m("meta", mt)),
146
+
147
+ m("meta", {name: "organization", content: metadata.author.name}),
148
+
149
+ m(OpenGraph, {
150
+ canonical,
151
+ pageImage,
152
+ altTitle,
153
+ description: next,
154
+ updatedTime,
155
+ type: ogtype,
156
+ site_name: metadata.site.name,
157
+ section: base
158
+ }),
159
+
160
+ m(Script, {
161
+ script: [
162
+ "const SITE=" + JSON.stringify({...metadata.site, canonical: metadata.canonical}),
163
+ "const resetCookies = () => { window.localStorage.clear();window.location.href='/'; }",
164
+ "window.WIDGET=\"" + pageMetadata.widget + "\""
165
+ ].join(";")
166
+ }),
167
+
168
+ m("link", {rel: "canonical", href: canonical}),
169
+ ...metadata.fonts ? [m("link", {
170
+ rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=" + (metadata.fonts.map((family) => encodeURIComponent(family))
171
+ .join(","))
172
+ })] : [],
173
+ ...metadata.head.map((tag) => {
174
+ const
175
+ {t} = tag,
176
+ alttag = {...tag};
177
+
178
+ delete alttag.t;
179
+
180
+ return m(t, alttag);
181
+ }),
182
+
183
+ ...pageMetadata.snippet
184
+ ? [
185
+ m.trust(
186
+ createHtml(
187
+ tokenizeObject(
188
+ pageMetadata.snippet,
189
+ {
190
+ metadata
191
+ },
192
+ true,
193
+ true)))]
194
+ : metadata.snippet
195
+ ? [m.trust(createHtml(metadata.snippet))]
196
+ : [],
197
+
198
+ m(BreadCrumb, {
199
+ metadata,
200
+ pageMetadata,
201
+ levels,
202
+ base
203
+ }),
204
+
205
+ m("body", [
206
+ m("main", {
207
+ id: "main",
208
+ class: "flexcol",
209
+ "aria-label": title
210
+ }, [
211
+
212
+ ...pageMetadata.generateH1 ? [m("h1.gen", pageMetadata.title)] : [],
213
+
214
+ ...children,
215
+
216
+ ...attrs.metadata.footer && !pageMetadata.nofooter
217
+ ? [m(TailWidget, {class: "shadow-2", ...attrs.metadata.footer})]
218
+ : []
219
+
220
+ ]),
221
+
222
+ // cookies
223
+ ...attrs.footer ? [m.trust(attrs.footer)] : []
224
+
225
+ ])
226
+ ])
227
+ ]
228
+ );
229
+ }),
230
+ ItemPage = defineWidget(({attrs, children}) => {
231
+ const
232
+ {metadata, pageMetadata, dynamicData, levels, base} = attrs,
233
+ {item, relative: relativeRoute} = dynamicData,
234
+ {meta: itemMeta} = item,
235
+ firstImage = getImage(metadata, pageMetadata, dynamicData),
236
+ {canonical: forcedCanonical} = pageMetadata,
237
+
238
+ canonical = forcedCanonical && forcedCanonical.startsWith("/")
239
+ ? metadata.site.url + forcedCanonical
240
+ : [metadata.canonical, relativeRoute + EXTENSION_HTML].join("/"),
241
+
242
+ pageImage = firstImage.indexOf("://") === -1
243
+ ? metadata.canonical + (base ? "/" + base : "") + "/" + firstImage
244
+ : firstImage,
245
+
246
+ updatedTime = new Date().toISOString(),
247
+ ogtype = pageMetadata.ogtype || metadata.ogtype,
248
+ altTitle = itemMeta.title + " (" + metadata.title + " " + pageMetadata.title + ")";
249
+
250
+ if (!itemMeta.description) {
251
+ throw new Error("Item " + itemMeta.title + " does not have a description");
252
+ }
253
+
254
+ return m(
255
+ "html",
256
+ {
257
+ lang: "en",
258
+ class: "skinroot"
259
+ },
260
+ [
261
+ m("head", [
262
+
263
+ m("title", itemMeta.title + " | " + pageMetadata.title + " | " + metadata.title),
264
+ m("meta", {name: "description", content: itemMeta.description.substring(0, 160)}),
265
+
266
+ ...metadata.meta.map((mt) => m("meta", mt)),
267
+ m("meta", {name: "organization", content: metadata.author.name}),
268
+
269
+ m(OpenGraph, {
270
+ canonical,
271
+ pageImage,
272
+ altTitle,
273
+ description: itemMeta.description,
274
+ updatedTime,
275
+ site_name: metadata.site.name,
276
+ type: ogtype,
277
+ section: attrs.base
278
+ }),
279
+
280
+ m(Script, {
281
+ script: [
282
+ "const SITE=" + JSON.stringify(metadata.site),
283
+ "const ITEM=" + JSON.stringify(dynamicData),
284
+ "const resetCookies = () => { window.localStorage.clear();window.location.href='/'; }"
285
+ ].join(";")
286
+ }),
287
+
288
+ m("link", {rel: "canonical", href: canonical}),
289
+
290
+ ...metadata.head.map((tag) => {
291
+ const
292
+ {t} = tag,
293
+ alttag = {...tag};
294
+
295
+ delete alttag.t;
296
+
297
+ return m(t, alttag);
298
+ }),
299
+
300
+ ...pageMetadata.snippet
301
+ ? [
302
+ m.trust(
303
+ createHtml(
304
+ tokenizeObject(
305
+ pageMetadata.snippet,
306
+ {
307
+ item: dynamicData.item,
308
+ metadata
309
+ },
310
+ true,
311
+ true)))
312
+ ]
313
+ : [],
314
+
315
+ m(BreadCrumb, {
316
+ metadata,
317
+ pageMetadata,
318
+ levels,
319
+ base
320
+ }),
321
+
322
+ m("body", [
323
+ m(
324
+ "main",
325
+ {
326
+ id: "main",
327
+ class: "flexcol",
328
+ "aria-label": pageMetadata.title + " > " + itemMeta.title
329
+ },
330
+ [
331
+
332
+ m("h1.gen", itemMeta.title),
333
+
334
+ ...children,
335
+
336
+ ...attrs.metadata.footer
337
+ ? [
338
+ m(TailWidget, {class: "marg-1 marg-v no-marg-bottom", ...attrs.metadata.footer})]
339
+ : []
340
+ ]),
341
+ // fixed footer: cookies
342
+ ...attrs.footer ? [m.trust(attrs.footer)] : []
343
+ ])
344
+ ])
345
+ ]
346
+ );
347
+ });
348
+
349
+ const
350
+ Composition = defineWidget(({attrs}) => m(
351
+ attrs.dynamicData ? ItemPage : Page,
352
+ attrs,
353
+ m(attrs.metadata.site?.simplepages ? FrameSimple : FrameSet, attrs)
354
+ ));
355
+
356
+ module.exports = Composition;
@@ -0,0 +1,93 @@
1
+ const
2
+ m = require("mithril"),
3
+ RES_LOGIN_OVER = "frontpage-over.png",
4
+ RES_LOGO_BANNER = "logo-banner.png",
5
+ defineWidget = require("../util/widgets/util.definewidget");
6
+
7
+ const
8
+ UnsplashCollection = defineWidget(
9
+ ({attrs, children}) => {
10
+ const
11
+ image = attrs.images[Math.floor(Math.random() * attrs.images.length)];
12
+
13
+ return m(
14
+ ".flexcol.fullheight.flexcenter.flex-al-center.divimage.unsplash",
15
+ {
16
+ role: "presentation",
17
+ class: attrs.class || "w-50",
18
+ style: {backgroundImage: "url(" + image.urls.regular + ")"}
19
+ },
20
+ [
21
+ ...children,
22
+ ...image.user
23
+ ? [
24
+ m(".authorbox", {
25
+ "role": "presentation"
26
+ }, [
27
+ m("a", {
28
+ rel: "nofollow",
29
+ href: image.user?.links?.html,
30
+ target: "unsplash"
31
+ }, "Photo by " + image.user.name + " - unsplash.com")
32
+ ])
33
+ ] : []
34
+ ]
35
+ );
36
+ }
37
+ );
38
+
39
+ const
40
+ RightSide = defineWidget(
41
+ ({attrs, state, children}) => {
42
+
43
+ const
44
+ {cdnModel, site} = attrs,
45
+ {platform} = cdnModel,
46
+ operatorOverlay = site?.logo, // || platform.resources(RES_LOGIN_OVER),
47
+ operatorBanner = site?.banner; // platform.resources(RES_LOGO_BANNER);
48
+
49
+ return state.images ? m(
50
+ UnsplashCollection,
51
+ {
52
+ name: "login",
53
+ class: attrs.class || "grows",
54
+ images: state.images
55
+ },
56
+ [
57
+ ...operatorOverlay ? [
58
+ m("img", {
59
+ src: operatorOverlay,
60
+ class: "overlay w-50",
61
+ alt: attrs.ncsdom + " logo"
62
+ })] : [],
63
+ ...operatorBanner ? [
64
+ m("img.w-75", {src: operatorBanner, alt: attrs.ncsdom + " banner"})
65
+ ] : [],
66
+ ...children
67
+ ]
68
+ ) : [];
69
+ },
70
+
71
+ ({attrs, state}) => {
72
+ try {
73
+ state.images = require(attrs.source + "/images.json");
74
+ } catch (e) {
75
+ //
76
+ }
77
+ }
78
+ ),
79
+ Qr = defineWidget(
80
+ ({attrs}) => m(
81
+ "figure.qrcode",
82
+ {
83
+ id: "qr",
84
+ "aria-label": "QR Code to this page",
85
+ }
86
+ )
87
+ ),
88
+ DocRightSide = defineWidget(
89
+ ({attrs}) => m(RightSide, attrs, [
90
+ m(Qr, attrs)
91
+ ])
92
+ );
93
+ module.exports = DocRightSide;
@@ -0,0 +1,75 @@
1
+ const
2
+ SNIPPETS = {
3
+ Article: (title, images, date = new Date().toISOString(), author = undefined) => ({
4
+ "@context": "https://schema.org",
5
+ "@type": "Article",
6
+ headline: title,
7
+ ...images ? { image: images } : {},
8
+ datePublished: date,
9
+ dateModified: date,
10
+ ...author && {
11
+ author: [
12
+ {
13
+ "@type": "Person",
14
+ ...author
15
+ }
16
+ ]
17
+ }
18
+ }),
19
+ BreadCrumb: (routes = []) => (routes.length ? {
20
+ "@context": "https://schema.org",
21
+ "@type": "BreadcrumbList",
22
+ itemListElement: routes.map((route, idx) => ({
23
+ "@type": "ListItem",
24
+ position: 1 + idx,
25
+ name: route.name,
26
+ item: route.url
27
+ }))
28
+ } : undefined),
29
+ CreativeWork: (
30
+ name,
31
+ image,
32
+ author,
33
+ contentRating = undefined,
34
+ applicationName = undefined,
35
+ applicationImage = undefined,
36
+ downloadUrl = undefined
37
+ ) => ({
38
+ "@context": "https://schema.org",
39
+ "@type": "CreativeWork",
40
+ author,
41
+ ...contentRating && { contentRating },
42
+ image,
43
+ name
44
+ /*
45
+ ...applicationName && {
46
+ isPartOf: {
47
+ "@type": "SoftwareApplication",
48
+ name: applicationName,
49
+ image: applicationImage,
50
+ downloadUrl
51
+ }
52
+ }
53
+ */
54
+ })
55
+ };
56
+
57
+ function createHtml(snippedCode) {
58
+ return snippedCode ? `
59
+ <script type="application/ld+json">
60
+ ${JSON.stringify(snippedCode)}
61
+ </script>
62
+ ` : "";
63
+ }
64
+
65
+ function createSnippet(type, ...parameters) {
66
+ if (!SNIPPETS[type]) throw new Error("No " + type + " defined");
67
+ return createHtml(SNIPPETS[type](...parameters));
68
+ }
69
+
70
+ function getSnippet(type, ...parameters) {
71
+ if (!SNIPPETS[type]) throw new Error("No " + type + " defined");
72
+ return SNIPPETS[type](...parameters);
73
+ }
74
+
75
+ module.exports = { createSnippet, createHtml, getSnippet };
@@ -0,0 +1,11 @@
1
+ const m = require("mithril");
2
+
3
+ module.exports = {
4
+ view: ({attrs}) => m(".flexcol.w-100.pad-2.tail.al-center.flex-al-center", {class: attrs.class}, [
5
+ m(".cosa", m.trust(attrs.copyright)),
6
+ m(
7
+ ".flexrow.wrap.flexcenter",
8
+ ...attrs.links.map(({title, href, target}) => m("a.linker", {href, ...target && {target}}, title))
9
+ )
10
+ ])
11
+ };
@@ -0,0 +1,10 @@
1
+ const Widgets = {
2
+ FeatureList: require("../widgets.features/FeatureList"),
3
+ Client: require("../widgets.client/Client"),
4
+ Markdown: require("../widgets.markdown/Document"),
5
+ MarketItem: require("../widgets.market/MarketItem"),
6
+ HowTo: require("../widgets.howto/HowTo"),
7
+ Faq: require("../widgets.howto/Faq")
8
+ };
9
+
10
+ module.exports = Widgets;
@@ -0,0 +1,22 @@
1
+ const
2
+ m = require("mithril"),
3
+ defineWidget = require("../util/widgets/util.definewidget");
4
+
5
+ module.exports = defineWidget(
6
+ ({ attrs }) => {
7
+ const
8
+ {pageMetadata } = attrs,
9
+ { client, title } = pageMetadata,
10
+ data = Buffer.from(JSON.stringify(client))
11
+ .toString("base64");
12
+
13
+ return m(
14
+ "widget.flexcol.h-100.w-100.screen.client",
15
+ {
16
+ "data-info": data,
17
+ "data-title": title,
18
+ class: pageMetadata.class
19
+ }
20
+ );
21
+ }
22
+ );