@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,239 @@
1
+ import m from "mithril";
2
+ import {defineWidget, InputWidget, ButtonNew, Empty, NoticeWidget} from "@nebularstreams/libmui";
3
+
4
+ const
5
+ DEFAULT_HEADER_CONFIG = {
6
+ icon: "plug",
7
+ text: "Connect to Nebular World Editor to test your worlds",
8
+ size: 2,
9
+ class: "configbox"
10
+ };
11
+
12
+ let
13
+ CREDENTIALS_AVAILABLE = false,
14
+ EDITOR_AVAILABLE = false,
15
+
16
+ PORT = 8888,
17
+ DATA = [0, 0, 0, 0];
18
+
19
+ async function init() {
20
+
21
+ EDITOR_AVAILABLE = false;
22
+
23
+ const
24
+ ip = window.localStorage.getItem("editorIp"),
25
+ port = window.localStorage.getItem("editorPort") || "8888";
26
+
27
+ if (ip) {
28
+
29
+ let available = true;
30
+
31
+ ip.split(".")
32
+ .forEach((n, index) => {
33
+ const g = parseInt(n, 10);
34
+ if (g >= 0 && g < 255) DATA[index] = g; else available = false;
35
+ });
36
+
37
+ PORT = parseInt(port, 10) || 8888;
38
+
39
+ CREDENTIALS_AVAILABLE = available;
40
+ } else {
41
+ CREDENTIALS_AVAILABLE = false;
42
+ }
43
+
44
+ }
45
+
46
+ function persistAddress() {
47
+ if (DATA && PORT) {
48
+ window.localStorage.setItem("editorIp", DATA.join("."));
49
+ window.localStorage.setItem("editorPort", PORT);
50
+ CREDENTIALS_AVAILABLE = true;
51
+ }
52
+ }
53
+
54
+ async function connect(state) {
55
+
56
+ if ((DATA[0] < 10 || DATA[0] > 192) || (DATA[3] === 0 || DATA[3] > 253)) {
57
+ EDITOR_AVAILABLE = false;
58
+ } else {
59
+
60
+ try {
61
+
62
+ state.portalUrl = `https://${DATA.join(".")}:${PORT}`;
63
+
64
+ persistAddress();
65
+ EDITOR_AVAILABLE = true;
66
+
67
+ window.open(state.portalUrl, "editor");
68
+
69
+ } catch (e) {
70
+ EDITOR_AVAILABLE = false;
71
+ }
72
+ }
73
+
74
+ }
75
+
76
+ function cool() {
77
+ return DATA[0] >= 0 && DATA[1] >= 0 && DATA[2] >= 0 && DATA[3] >= 0 && PORT >= 8000;
78
+ }
79
+
80
+ const
81
+ ConfigScreen = defineWidget(
82
+ ({attrs}) =>
83
+ m(".flexcol.w-max.h-100.createscreen", attrs.state?.loading ? [
84
+ m(Empty, {icon: "sync.fa-spin", size: 2})
85
+ ] : [
86
+ m(".header", attrs.header),
87
+ m(".subheader", (attrs.subheaders || []).map((td) => m(".subline", td))),
88
+ m(ConfigDialog, attrs),
89
+ m(".instructions", (attrs.instructions || []).map((td) => m(".instruction", td)))
90
+ ])
91
+ ),
92
+ ConfigDialog = defineWidget(
93
+ ({attrs}) => {
94
+ const state = attrs.state;
95
+ return m(
96
+ NoticeWidget,
97
+ attrs.headerDialog,
98
+ [
99
+ m(".flexrow.gap-2.ipinput", [
100
+ m(InputWidget, {
101
+ type: "number",
102
+ min: 0,
103
+ max: 255,
104
+ hint: "192",
105
+ value: DATA[0],
106
+ oninput: () => {
107
+ },
108
+ onchange: (val) => {
109
+ DATA[0] = val;
110
+ }
111
+ }),
112
+ m(InputWidget, {
113
+ type: "number",
114
+ min: 0,
115
+ max: 255,
116
+ hint: "0",
117
+ value: DATA[1],
118
+ oninput: () => {
119
+ },
120
+ onchange: (val) => {
121
+ DATA[1] = val;
122
+ }
123
+ }),
124
+ m(InputWidget, {
125
+ type: "number",
126
+ min: 0,
127
+ max: 255,
128
+ hint: "0",
129
+ value: DATA[2],
130
+ oninput: () => {
131
+ },
132
+ onchange: (val) => {
133
+ DATA[2] = val;
134
+ }
135
+ }),
136
+ m(InputWidget, {
137
+ type: "number",
138
+ min: 0,
139
+ max: 255,
140
+ hint: "0",
141
+ value: DATA[3],
142
+ oninput: () => {
143
+ },
144
+ onchange: (val) => {
145
+ DATA[3] = val;
146
+ }
147
+ }),
148
+ m(InputWidget, {
149
+ type: "number",
150
+ min: 9000,
151
+ max: 9999,
152
+ hint: "9999",
153
+ value: PORT,
154
+ oninput: () => {
155
+ },
156
+ onchange: (val) => {
157
+ PORT = val;
158
+ }
159
+ })
160
+ ]),
161
+ ...cool()
162
+ ? [
163
+ m(ButtonNew, {
164
+ class: "accentbutton connectbutton",
165
+ text: "connect to Nebular World Editor",
166
+ onClick: () => {
167
+
168
+ state.error = null;
169
+ state.loading = true;
170
+ m.redraw();
171
+
172
+ connect(state)
173
+ .finally(() => {
174
+ state.loading = false;
175
+ m.redraw();
176
+ });
177
+ }
178
+ }
179
+ )
180
+ ]
181
+ : [],
182
+ ...state.error
183
+ ? [
184
+ m(NoticeWidget, {
185
+ icon: "explamation-triangle",
186
+ text: [
187
+ "Cannot connect to Nebular World Editor",
188
+ "Please make sure that your computer is in the same network as your VT Glasses, that Nebular World Application is started and that you have correctly entered the IP Address and Port above.",
189
+ "Don't have Nebular World Editor installed? You then need to download it here!"
190
+ ]
191
+ }, [
192
+ m(ButtonNew, {
193
+ icon: "download",
194
+ class: "accentbutton",
195
+ text: "Download Nebular World Editor",
196
+ onClick: () => m.route.set("download")
197
+ })
198
+ ])
199
+ ] : []
200
+ ]
201
+ );
202
+
203
+ }
204
+ );
205
+
206
+ const LocalLauncher = defineWidget(
207
+ ({attrs, state}) => {
208
+
209
+ return state.uninit
210
+ ? m("ul.flexrow.wrap.grows.h-100", m(Empty, {
211
+ icon: "sync.fa-spin",
212
+ size: 3
213
+ }))
214
+ // user supplied credentials
215
+ : m(ConfigScreen, {
216
+ state,
217
+ header: attrs.static.header || "Bring Your Ideas To Life!",
218
+ subheaders: attrs.static.subheaders || ["Step into the next level by creating your own immersive world.", "Connect to the Nebular World Editor to start building your adventure!"],
219
+ headerDialog: attrs.static.headerDialog || DEFAULT_HEADER_CONFIG,
220
+ instructions: attrs.static.instructions || [
221
+ "How to Connect",
222
+ "Open the Nebular World Editor on your computer",
223
+ "Locate the IP address displayed in the editor",
224
+ "Enter the IP address and port number below",
225
+ "Click Connect to display your local projects."
226
+ ]
227
+ });
228
+ },
229
+ ({state}) => {
230
+ state.uninit = true;
231
+ init(state)
232
+ .then(() => {
233
+ state.uninit = false;
234
+ m.redraw();
235
+ });
236
+ }
237
+ );
238
+
239
+ export default LocalLauncher;
@@ -0,0 +1,32 @@
1
+ .textfield input {
2
+ height: 2rem;
3
+ bordeR: solid 1px var(--border-color);
4
+ background: var(--inputs);
5
+ padding: 0 0.25rem;
6
+ color: var(--text);
7
+ outline: none !Important;
8
+ border-radius: 0.25rem;
9
+ }
10
+
11
+ .textfield input.withicon {
12
+ padding-right: 3.5rem;
13
+ }
14
+
15
+ .textfield input.withicon-2 {
16
+ padding-right: 3rem;
17
+ }
18
+
19
+ .input-static.withdrag {
20
+ cursor: ns-resize;
21
+ border: solid 1px var(--border-color);
22
+ padding: 0.25rem;
23
+ }
24
+
25
+ .witharia:before {
26
+ content: attr(aria-label);
27
+ display: block;
28
+ font-variant: all-small-caps;
29
+ /*font-size: 1rem;*/
30
+ line-height: 100%;
31
+ width: 100%;
32
+ }
@@ -0,0 +1,188 @@
1
+
2
+ .project > .inner, .newproject > .inner {
3
+ align-items: center;
4
+ aspect-ratio: 16 / 9;
5
+ background: var(--placeholder);
6
+ border: 1px solid var(--border-color);
7
+ border-radius: 0.25rem;
8
+ cursor: pointer;
9
+ justify-content: center;
10
+ background-size: cover;
11
+ background-position: center;
12
+ background-repeat: no-repeat;
13
+ position: relative;
14
+ }
15
+
16
+ .project:active {
17
+ transform: scale(0.9);
18
+ }
19
+
20
+ .promonotice {
21
+ margin: 1rem 0;
22
+ text-align: center;
23
+ width: 100%;
24
+ display: flex;
25
+ flex-direction: column;
26
+ font-weight: bold;
27
+ }
28
+
29
+ .project {
30
+ padding: 0.75rem 1.5rem;
31
+ }
32
+
33
+ .newproject {
34
+ padding: 0.75rem 1.5rem;
35
+ }
36
+
37
+ /*
38
+ .inner > div {
39
+ background: rgba(0, 0, 0, .5);
40
+ border: 1px solid var(--border-color);
41
+ border-radius: 0.25rem;
42
+ margin: 0.1rem;
43
+ padding: 0 0.5rem;
44
+ align-items: center;
45
+ }
46
+ */
47
+
48
+ .projectlist {
49
+ margin: 0;
50
+ padding: 1.5rem;
51
+ align-items: flex-start;
52
+ }
53
+
54
+ .newprojectlist,
55
+ .projectlist {
56
+ align-items: flex-start;
57
+ margin: 0;
58
+ padding: 1.5rem;
59
+ }
60
+
61
+ .newprojectlist {
62
+ align-content: center;
63
+ justify-content: center;
64
+ }
65
+
66
+ .newproject:hover {
67
+ background: var(--window-background-lo);
68
+ }
69
+
70
+ .newproject,
71
+ .project {
72
+ padding: 1.5rem 1.5rem;
73
+ border-radius: 1rem;
74
+ transition: all 0.5s ease-in-out;
75
+ cursor: pointer;
76
+ }
77
+
78
+ .linedetail.long.flexcol {
79
+ margin-top: 1rem;
80
+ font-size: 1.25rem;
81
+ }
82
+
83
+ .microheader.flexrow {
84
+ background: transparent;
85
+ border-bottom: 1px solid var(--border-color);
86
+ cursor: pointer;
87
+ font-variant: all-small-caps;
88
+ font-weight: 700;
89
+ padding: 0.25rem;
90
+ text-align: center;
91
+ border-left: 0;
92
+ border-right: 0;
93
+ border-top: 0;
94
+ }
95
+
96
+ .microheader .accent {
97
+ color: var(--accent);
98
+ text-decoration: underline;
99
+ }
100
+
101
+ .templatestories {
102
+ margin: 0;
103
+ }
104
+
105
+ button {
106
+ cursor: pointer;
107
+ }
108
+
109
+ .lineinfo {
110
+ font-variant: all-small-caps;
111
+ height: 1.5rem;
112
+ }
113
+
114
+ button.transp {
115
+ background: transparent;
116
+ color: var(--text);
117
+ border: none;
118
+ }
119
+
120
+ .lineinfo {
121
+ font-variant: all-small-caps;
122
+ }
123
+
124
+ .gap-2 {
125
+ gap: 0.5rem;
126
+ }
127
+
128
+ .configbox .noticetext {
129
+ border-bottom: solid;
130
+ margin-bottom: 0.25rem;
131
+ }
132
+
133
+ .configbox .noticetitle {
134
+ place-content: center;
135
+ }
136
+
137
+ .configbox {
138
+ background: var(--window-background);
139
+ align-self: center;
140
+ border-radius: 0.5rem;
141
+ gap: 0.5rem;
142
+ font-size: 1rem;
143
+ width: 30rem;
144
+ }
145
+
146
+ /*
147
+ .configbox .ipinput input {
148
+ font-size: 2rem;
149
+ width: 6rem !important;
150
+ text-align: center;
151
+ padding: 1rem 0;
152
+ }
153
+ */
154
+
155
+ .configbox .ipinput input {
156
+ font-size: 4rem;
157
+ text-align: center;
158
+ padding: 1rem 0;
159
+ height: auto;
160
+ background: transparent;
161
+ border: 0;
162
+ }
163
+
164
+ .configbox button.connectbutton {
165
+ background: var(--accent);
166
+ font-size: 1.25rem;
167
+ color: var(--text-over-accent);
168
+ }
169
+
170
+ .createscreen {
171
+ justify-content: center;
172
+ align-items: center;
173
+ gap: 1rem;
174
+ }
175
+
176
+ .createscreen .instructions {
177
+ font-size: 0.75rem;
178
+ }
179
+
180
+ .createscreen .header {
181
+ color: var(--accent);
182
+ font-size: 2rem;
183
+ }
184
+
185
+ .createscreen .subheader {
186
+ font-size: 1.25rem;
187
+ text-align: center;
188
+ }
@@ -0,0 +1,7 @@
1
+ :root {
2
+ --accent: #ff8800;
3
+ }
4
+
5
+ .skinroot.dark, .skinroot.light {
6
+ --accent: #ff8800;
7
+ }
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "id": "right-image",
4
+ "urls": {
5
+ "raw": "images/right.webp",
6
+ "full": "images/right.webp",
7
+ "small": "images/right.webp",
8
+ "regular": "images/right.webp",
9
+ "thumb": "right.webp"
10
+ }
11
+ }
12
+ ]
@@ -0,0 +1,120 @@
1
+ {
2
+ "title": "Brightfield Labs Documentation",
3
+ "description": "Guides, policies, and reference material from Brightfield Labs",
4
+ "canonical": "https://example.com/docs",
5
+ "image": "https://example.com/res/brand-mark.png",
6
+ "ogtype": "article",
7
+ "site": {
8
+ "name": "Brightfield Labs",
9
+ "url": "https://example.com",
10
+ "domain": "example.com",
11
+ "cookiesPage": "cookies",
12
+ "simplepages": true
13
+ },
14
+ "author": {
15
+ "@type": "Organization",
16
+ "name": "Brightfield Labs",
17
+ "url": "https://example.com",
18
+ "logo": "https://example.com/res/brand-mark.png"
19
+ },
20
+ "publisher": {
21
+ "@type": "Organization",
22
+ "name": "Brightfield Labs",
23
+ "url": "https://example.com",
24
+ "logo": "https://example.com/res/brand-mark.png"
25
+ },
26
+ "head": [
27
+ {
28
+ "t": "link",
29
+ "rel": "icon",
30
+ "type": "image/png",
31
+ "href": "/res/favicon.png"
32
+ },
33
+ {
34
+ "t": "link",
35
+ "rel": "stylesheet",
36
+ "href": "/website.css"
37
+ },
38
+ {
39
+ "t": "link",
40
+ "rel": "stylesheet",
41
+ "href": "/docs.css"
42
+ },
43
+ {
44
+ "t": "link",
45
+ "rel": "apple-touch-icon",
46
+ "href": "/res/favicon.png"
47
+ },
48
+ {
49
+ "t": "link",
50
+ "rel": "preload",
51
+ "href": "/webfonts/fa-solid-900.woff2",
52
+ "as": "font",
53
+ "type": "font/woff2",
54
+ "crossorigin": true
55
+ },
56
+ {
57
+ "t": "link",
58
+ "rel": "preload",
59
+ "href": "/webfonts/fa-brands-400.woff2",
60
+ "as": "font",
61
+ "type": "font/woff2",
62
+ "crossorigin": true
63
+ },
64
+ {
65
+ "t": "script",
66
+ "src": "/website.min.js"
67
+ }
68
+ ],
69
+ "meta": [
70
+ {
71
+ "charSet": "utf-8"
72
+ },
73
+ {
74
+ "name": "robots",
75
+ "content": "all"
76
+ },
77
+ {
78
+ "lang": "en"
79
+ },
80
+ {
81
+ "name": "viewport",
82
+ "content": "width=device-width, maximum-scale=5, user-scalable=yes, initial-scale=1"
83
+ },
84
+ {
85
+ "name": "theme-color",
86
+ "content": "#ffffff"
87
+ },
88
+ {
89
+ "name": "mobile-web-app-capable",
90
+ "content": "yes"
91
+ },
92
+ {
93
+ "name": "apple-mobile-web-app-capable",
94
+ "content": "yes"
95
+ },
96
+ {
97
+ "name": "apple-mobile-web-app-status-bar-style",
98
+ "content": "white"
99
+ }
100
+ ],
101
+ "links": {
102
+ "documents": {
103
+ "static": true,
104
+ "icon": "file",
105
+ "class": "grows"
106
+ }
107
+ },
108
+ "breadcrumb": {
109
+ "name": "Documentation",
110
+ "url": "https://example.com/docs/index"
111
+ },
112
+ "links.doc": {
113
+ "documents": {
114
+ "static": true,
115
+ "class": "inter",
116
+ "icon": "file-alt"
117
+ }
118
+ },
119
+ "links.metadata": {}
120
+ }
@@ -0,0 +1,25 @@
1
+ # Cookies and Local Storage
2
+
3
+ **Example policy — replace before publishing. Last updated: September 17, 2026.**
4
+
5
+ This page explains how the Brightfield Labs website uses cookies and browser storage.
6
+
7
+ ## What we store
8
+
9
+ The website does not use advertising or third-party tracking cookies. It stores only preferences requested by the visitor.
10
+
11
+ | Storage key | Purpose | Duration |
12
+ | --- | --- | --- |
13
+ | `brightfield.preferences` | Remembers theme and policy-notice choices | Until changed or deleted |
14
+
15
+ This information remains in the visitor's browser and is not used to create an advertising profile.
16
+
17
+ ## Managing stored data
18
+
19
+ Visitors can remove local preferences through their browser's privacy or site-data settings. Removing them resets the saved theme and may display the policy notice again.
20
+
21
+ If optional analytics or other cookies are introduced, this policy and the website's consent controls should be updated before those technologies are enabled.
22
+
23
+ ## Contact
24
+
25
+ Questions about this example policy can be sent to [privacy@example.com](mailto:privacy@example.com).
@@ -0,0 +1,13 @@
1
+ # Documentation
2
+
3
+ Welcome to the Brightfield Labs documentation center. Use this template for product guides, company policies, technical references, or any other structured content.
4
+
5
+ ## Company Policies
6
+
7
+ * [Terms of Service](tos.md)
8
+ * [Privacy Policy](privacy.md)
9
+ * [Cookies and Local Storage](cookies.md)
10
+
11
+ ## Getting Started
12
+
13
+ Add Markdown files anywhere inside the `pages` folder. Subfolders become sections, and ordinary assets such as stylesheets and downloads are copied into the generated site.
@@ -0,0 +1,50 @@
1
+ # Privacy Policy
2
+
3
+ **Example policy — obtain appropriate legal review before publishing. Last updated: September 17, 2026.**
4
+
5
+ This policy describes how **Brightfield Labs** (**we**, **us**, or **our**) handles personal information when someone visits **example.com** or contacts us.
6
+
7
+ ## Information we process
8
+
9
+ We aim to collect only the information needed to operate and protect the website, communicate with visitors, and provide requested services.
10
+
11
+ This may include:
12
+
13
+ * ordinary technical request data, such as IP address, browser information, requested pages, and timestamps;
14
+ * preferences stored locally in the visitor's browser;
15
+ * contact details and message content supplied when someone writes to us; and
16
+ * information required to provide a service requested by a customer.
17
+
18
+ We do not sell personal information or use website visitor information to create advertising profiles.
19
+
20
+ ## Why we use information
21
+
22
+ We may use information to operate and secure the website, prevent abuse, respond to enquiries, deliver requested services, meet legal obligations, and protect our rights. The appropriate legal basis depends on the context and applicable law.
23
+
24
+ ## Cookies and local storage
25
+
26
+ The website may store limited preferences in the visitor's browser. See our [Cookies and Local Storage Policy](cookies.md) for details.
27
+
28
+ ## Service providers and transfers
29
+
30
+ Trusted providers may process information when they host, maintain, deliver, or secure the website. We expect providers to handle information under suitable contractual and legal safeguards, including safeguards for international transfers where required.
31
+
32
+ ## Retention and security
33
+
34
+ We retain information only as long as reasonably necessary for its purpose, legal obligations, security, and dispute resolution. We use reasonable technical and organizational safeguards, although no internet service can guarantee absolute security.
35
+
36
+ ## Individual rights
37
+
38
+ Depending on location, individuals may have rights to access, correct, delete, restrict, or receive a copy of their personal information, or to object to certain processing. Identity verification may be required before a request is completed.
39
+
40
+ ## Changes
41
+
42
+ We may update this policy as the website, our practices, or applicable requirements change. The revision date above identifies the latest version.
43
+
44
+ ## Contact
45
+
46
+ **Brightfield Labs**
47
+ 100 Example Street
48
+ Sample City, EX 10000
49
+
50
+ Email: [privacy@example.com](mailto:privacy@example.com)