cyberia 3.2.5 → 3.2.9

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 (301) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +2 -2
  2. package/.github/workflows/release.cd.yml +1 -2
  3. package/CHANGELOG.md +351 -1
  4. package/CLI-HELP.md +40 -13
  5. package/Dockerfile +0 -4
  6. package/README.md +242 -497
  7. package/bin/build.js +19 -5
  8. package/bin/cyberia.js +1149 -240
  9. package/bin/deploy.js +570 -1
  10. package/bin/file.js +6 -0
  11. package/bin/index.js +1149 -240
  12. package/bin/vs.js +1 -1
  13. package/conf.js +67 -89
  14. package/deployment.yaml +4 -222
  15. package/hardhat/package-lock.json +32 -32
  16. package/hardhat/package.json +3 -3
  17. package/jsconfig.json +1 -1
  18. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  19. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  20. package/manifests/deployment/dd-cyberia-development/deployment.yaml +4 -222
  21. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  22. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  23. package/manifests/deployment/dd-test-development/deployment.yaml +136 -66
  24. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  25. package/package.json +23 -14
  26. package/proxy.yaml +10 -118
  27. package/scripts/k3s-node-setup.sh +2 -2
  28. package/scripts/nat-iptables.sh +103 -18
  29. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  30. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  31. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +76 -21
  32. package/src/api/core/core.controller.js +10 -10
  33. package/src/api/core/core.service.js +10 -10
  34. package/src/api/crypto/crypto.controller.js +8 -8
  35. package/src/api/crypto/crypto.service.js +8 -8
  36. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  37. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  38. package/src/api/cyberia-action/cyberia-action.router.js +27 -0
  39. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  40. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  41. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  42. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
  43. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +16 -16
  44. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  45. package/src/api/cyberia-entity/cyberia-entity.service.js +10 -10
  46. package/src/api/cyberia-instance/cyberia-fallback-world.js +19 -209
  47. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  48. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  49. package/src/api/cyberia-instance/cyberia-instance.service.js +22 -57
  50. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  51. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  52. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  53. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +216 -55
  54. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +4 -1
  55. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +18 -14
  56. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  57. package/src/api/cyberia-map/cyberia-map.service.js +10 -10
  58. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  59. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  60. package/src/api/cyberia-quest/cyberia-quest.router.js +27 -0
  61. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  62. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  63. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  64. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +27 -0
  65. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  66. package/src/api/default/default.controller.js +10 -10
  67. package/src/api/default/default.service.js +10 -10
  68. package/src/api/document/document.controller.js +12 -12
  69. package/src/api/document/document.model.js +10 -16
  70. package/src/api/file/file.controller.js +8 -8
  71. package/src/api/file/file.model.js +10 -10
  72. package/src/api/file/file.service.js +36 -36
  73. package/src/api/instance/instance.controller.js +10 -10
  74. package/src/api/instance/instance.model.js +4 -10
  75. package/src/api/instance/instance.service.js +10 -10
  76. package/src/api/ipfs/ipfs.controller.js +12 -12
  77. package/src/api/ipfs/ipfs.model.js +4 -13
  78. package/src/api/ipfs/ipfs.service.js +14 -28
  79. package/src/api/object-layer/object-layer.controller.js +12 -12
  80. package/src/api/object-layer/object-layer.model.js +4 -17
  81. package/src/api/object-layer/object-layer.service.js +12 -12
  82. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  83. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  84. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +18 -14
  85. package/src/api/test/test.controller.js +8 -8
  86. package/src/api/test/test.service.js +8 -8
  87. package/src/api/user/guest.service.js +99 -0
  88. package/src/api/user/user.controller.js +6 -6
  89. package/src/api/user/user.model.js +8 -13
  90. package/src/api/user/user.service.js +3 -20
  91. package/src/cli/cluster.js +61 -14
  92. package/src/cli/db.js +47 -2
  93. package/src/cli/deploy.js +67 -35
  94. package/src/cli/fs.js +79 -8
  95. package/src/cli/image.js +43 -1
  96. package/src/cli/index.js +26 -1
  97. package/src/cli/release.js +57 -1
  98. package/src/cli/repository.js +69 -31
  99. package/src/cli/run.js +415 -36
  100. package/src/cli/ssh.js +1 -1
  101. package/src/cli/static.js +43 -115
  102. package/src/client/Cryptokoyn.index.js +18 -21
  103. package/src/client/CyberiaPortal.index.js +19 -23
  104. package/src/client/Default.index.js +21 -33
  105. package/src/client/Itemledger.index.js +20 -26
  106. package/src/client/Underpost.index.js +19 -23
  107. package/src/client/components/core/404.js +4 -4
  108. package/src/client/components/core/500.js +4 -4
  109. package/src/client/components/core/Account.js +73 -60
  110. package/src/client/components/core/AgGrid.js +23 -33
  111. package/src/client/components/core/Alert.js +12 -13
  112. package/src/client/components/core/AppStore.js +1 -1
  113. package/src/client/components/core/Auth.js +35 -37
  114. package/src/client/components/core/Badge.js +7 -13
  115. package/src/client/components/core/BtnIcon.js +15 -17
  116. package/src/client/components/core/CalendarCore.js +42 -63
  117. package/src/client/components/core/Chat.js +13 -15
  118. package/src/client/components/core/ClientEvents.js +87 -0
  119. package/src/client/components/core/ColorPaletteElement.js +309 -0
  120. package/src/client/components/core/Content.js +17 -14
  121. package/src/client/components/core/Css.js +15 -71
  122. package/src/client/components/core/CssCore.js +12 -16
  123. package/src/client/components/core/D3Chart.js +4 -4
  124. package/src/client/components/core/Docs.js +64 -91
  125. package/src/client/components/core/DropDown.js +69 -91
  126. package/src/client/components/core/EventBus.js +92 -0
  127. package/src/client/components/core/EventsUI.js +14 -17
  128. package/src/client/components/core/FileExplorer.js +96 -228
  129. package/src/client/components/core/FullScreen.js +47 -75
  130. package/src/client/components/core/Input.js +24 -69
  131. package/src/client/components/core/Keyboard.js +25 -18
  132. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  133. package/src/client/components/core/LoadingAnimation.js +25 -31
  134. package/src/client/components/core/LogIn.js +41 -41
  135. package/src/client/components/core/LogOut.js +23 -14
  136. package/src/client/components/core/Modal.js +462 -178
  137. package/src/client/components/core/NotificationManager.js +14 -18
  138. package/src/client/components/core/Panel.js +54 -50
  139. package/src/client/components/core/PanelForm.js +25 -125
  140. package/src/client/components/core/Polyhedron.js +110 -214
  141. package/src/client/components/core/PublicProfile.js +39 -32
  142. package/src/client/components/core/Recover.js +48 -44
  143. package/src/client/components/core/Responsive.js +88 -32
  144. package/src/client/components/core/RichText.js +9 -18
  145. package/src/client/components/core/Router.js +24 -3
  146. package/src/client/components/core/SearchBox.js +37 -37
  147. package/src/client/components/core/SignUp.js +39 -30
  148. package/src/client/components/core/SocketIo.js +31 -2
  149. package/src/client/components/core/SocketIoHandler.js +6 -6
  150. package/src/client/components/core/ToggleSwitch.js +8 -20
  151. package/src/client/components/core/ToolTip.js +5 -17
  152. package/src/client/components/core/Translate.js +56 -59
  153. package/src/client/components/core/Validator.js +26 -16
  154. package/src/client/components/core/Wallet.js +15 -26
  155. package/src/client/components/core/Worker.js +163 -27
  156. package/src/client/components/core/windowGetDimensions.js +7 -7
  157. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  158. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  159. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  160. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  161. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  162. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  163. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  164. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  165. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  166. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  167. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  168. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  169. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  170. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +305 -61
  171. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  172. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  173. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  174. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  175. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  176. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  177. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  178. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  179. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  180. package/src/client/components/default/CssDefault.js +12 -12
  181. package/src/client/components/default/LogInDefault.js +6 -4
  182. package/src/client/components/default/LogOutDefault.js +6 -4
  183. package/src/client/components/default/RouterDefault.js +47 -0
  184. package/src/client/components/default/SettingsDefault.js +4 -4
  185. package/src/client/components/default/SignUpDefault.js +6 -4
  186. package/src/client/components/default/TranslateDefault.js +3 -3
  187. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  188. package/src/client/components/itemledger/CssItemledger.js +15 -15
  189. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  190. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  191. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  192. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  193. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  194. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  195. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  196. package/src/client/components/underpost/CssUnderpost.js +14 -14
  197. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  198. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  199. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  200. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  201. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  202. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  203. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  204. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  205. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  206. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  207. package/src/client/public/cyberia-docs/ARCHITECTURE.md +443 -0
  208. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +417 -0
  209. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +313 -0
  210. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +260 -0
  211. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  212. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  213. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  214. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  215. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  216. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  217. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  218. package/src/client/services/core/core.service.js +17 -49
  219. package/src/client/services/crypto/crypto.service.js +8 -13
  220. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  221. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  222. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  223. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  224. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  225. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  226. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  227. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  228. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  229. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  230. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  231. package/src/client/services/default/default.management.js +159 -267
  232. package/src/client/services/default/default.service.js +10 -16
  233. package/src/client/services/document/document.service.js +14 -19
  234. package/src/client/services/file/file.service.js +8 -13
  235. package/src/client/services/instance/instance.management.js +5 -5
  236. package/src/client/services/instance/instance.service.js +10 -15
  237. package/src/client/services/ipfs/ipfs.service.js +12 -18
  238. package/src/client/services/object-layer/object-layer.management.js +12 -12
  239. package/src/client/services/object-layer/object-layer.service.js +20 -26
  240. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  241. package/src/client/services/test/test.service.js +8 -13
  242. package/src/client/services/user/guest.service.js +86 -0
  243. package/src/client/services/user/user.management.js +5 -5
  244. package/src/client/services/user/user.service.js +14 -20
  245. package/src/client/ssr/body/404.js +3 -3
  246. package/src/client/ssr/body/500.js +3 -3
  247. package/src/client/ssr/body/CacheControl.js +5 -2
  248. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  249. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  250. package/src/client/ssr/head/PwaItemledger.js +197 -60
  251. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  252. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  253. package/src/client/ssr/offline/Maintenance.js +12 -11
  254. package/src/client/ssr/offline/NoNetworkConnection.js +3 -3
  255. package/src/client/ssr/pages/Test.js +2 -2
  256. package/src/client/sw/core.sw.js +212 -0
  257. package/src/grpc/cyberia/grpc-server.js +179 -67
  258. package/src/index.js +1 -1
  259. package/src/runtime/cyberia-client/Dockerfile +80 -0
  260. package/src/runtime/cyberia-server/Dockerfile +37 -0
  261. package/src/runtime/express/Dockerfile +4 -4
  262. package/src/runtime/lampp/Dockerfile +8 -7
  263. package/src/runtime/wp/Dockerfile +11 -17
  264. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  265. package/src/server/client-build-docs.js +45 -46
  266. package/src/server/client-build.js +334 -60
  267. package/src/server/client-formatted.js +47 -16
  268. package/src/server/conf.js +5 -4
  269. package/src/server/data-query.js +32 -20
  270. package/src/server/dns.js +22 -0
  271. package/src/server/ipfs-client.js +232 -91
  272. package/src/server/object-layer.js +1 -6
  273. package/src/server/process.js +13 -27
  274. package/src/server/semantic-layer-generator-floor.js +11 -51
  275. package/src/server/semantic-layer-generator-resource.js +259 -0
  276. package/src/server/semantic-layer-generator-skin.js +41 -171
  277. package/src/server/semantic-layer-generator.js +122 -14
  278. package/src/server/shape-generator.js +108 -0
  279. package/src/server/start.js +17 -3
  280. package/src/server/valkey.js +141 -235
  281. package/tsconfig.docs.json +15 -0
  282. package/typedoc.dd-cyberia.json +29 -0
  283. package/typedoc.json +29 -0
  284. package/WHITE-PAPER.md +0 -1540
  285. package/hardhat/README.md +0 -531
  286. package/hardhat/WHITE-PAPER.md +0 -1540
  287. package/jsdoc.dd-cyberia.json +0 -68
  288. package/jsdoc.json +0 -68
  289. package/src/api/object-layer/README.md +0 -672
  290. package/src/client/components/core/ColorPalette.js +0 -5267
  291. package/src/client/components/core/JoyStick.js +0 -80
  292. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  293. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  294. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  295. package/src/client/components/default/RoutesDefault.js +0 -49
  296. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  297. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  298. package/src/client/sw/default.sw.js +0 -127
  299. package/src/client/sw/template.sw.js +0 -84
  300. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  301. package/src/grpc/cyberia/README.md +0 -326
@@ -0,0 +1,309 @@
1
+ const PALETTE_COLUMNS = [
2
+ { name: 'Red', hue: 0 },
3
+ { name: 'Orange', hue: 28 },
4
+ { name: 'Yellow', hue: 52 },
5
+ { name: 'Green', hue: 132 },
6
+ { name: 'Cyan', hue: 182 },
7
+ { name: 'Blue', hue: 224 },
8
+ { name: 'Violet', hue: 278 },
9
+ ];
10
+
11
+ const PALETTE_LIGHTNESS = [92, 82, 72, 60, 48, 36, 24];
12
+ const PALETTE_GRAYSCALE_LIGHTNESS = [100, 84, 68, 52, 36, 18, 0];
13
+ const PALETTE_SATURATION = 82;
14
+
15
+ function clampChannel(value) {
16
+ return Math.max(0, Math.min(255, Math.round(value)));
17
+ }
18
+
19
+ function hslToHex(hue, saturation, lightness) {
20
+ const s = saturation / 100;
21
+ const l = lightness / 100;
22
+ const chroma = (1 - Math.abs(2 * l - 1)) * s;
23
+ const segment = hue / 60;
24
+ const second = chroma * (1 - Math.abs((segment % 2) - 1));
25
+ const match = l - chroma / 2;
26
+
27
+ let red = 0;
28
+ let green = 0;
29
+ let blue = 0;
30
+
31
+ if (segment >= 0 && segment < 1) {
32
+ red = chroma;
33
+ green = second;
34
+ } else if (segment < 2) {
35
+ red = second;
36
+ green = chroma;
37
+ } else if (segment < 3) {
38
+ green = chroma;
39
+ blue = second;
40
+ } else if (segment < 4) {
41
+ green = second;
42
+ blue = chroma;
43
+ } else if (segment < 5) {
44
+ red = second;
45
+ blue = chroma;
46
+ } else {
47
+ red = chroma;
48
+ blue = second;
49
+ }
50
+
51
+ const r = clampChannel((red + match) * 255)
52
+ .toString(16)
53
+ .padStart(2, '0');
54
+ const g = clampChannel((green + match) * 255)
55
+ .toString(16)
56
+ .padStart(2, '0');
57
+ const b = clampChannel((blue + match) * 255)
58
+ .toString(16)
59
+ .padStart(2, '0');
60
+ return `#${r}${g}${b}`.toUpperCase();
61
+ }
62
+
63
+ function normalizeHex(value) {
64
+ const raw = String(value || '')
65
+ .trim()
66
+ .replace('#', '');
67
+ if (/^[\da-fA-F]{3}$/.test(raw)) {
68
+ return `#${raw
69
+ .split('')
70
+ .map((char) => char + char)
71
+ .join('')}`.toUpperCase();
72
+ }
73
+ if (/^[\da-fA-F]{6}$/.test(raw)) {
74
+ return `#${raw}`.toUpperCase();
75
+ }
76
+ return null;
77
+ }
78
+
79
+ function buildPaletteRows() {
80
+ return PALETTE_LIGHTNESS.map((lightness, rowIndex) => {
81
+ const colorSwatches = PALETTE_COLUMNS.map((column) => ({
82
+ name: `${column.name} ${rowIndex + 1}`,
83
+ value: hslToHex(column.hue, PALETTE_SATURATION, lightness),
84
+ }));
85
+ const grayscaleLightness = PALETTE_GRAYSCALE_LIGHTNESS[rowIndex] ?? 0;
86
+ const grayscaleName =
87
+ rowIndex === 0 ? 'White' : rowIndex === PALETTE_LIGHTNESS.length - 1 ? 'Black' : `Gray ${rowIndex}`;
88
+ return [
89
+ ...colorSwatches,
90
+ {
91
+ name: grayscaleName,
92
+ value: hslToHex(0, 0, grayscaleLightness),
93
+ },
94
+ ];
95
+ });
96
+ }
97
+
98
+ const PALETTE_ROWS = buildPaletteRows();
99
+
100
+ class ColorPaletteElement extends HTMLElement {
101
+ constructor() {
102
+ super();
103
+ this.attachShadow({ mode: 'open' });
104
+ this._value = '#FF0000';
105
+ this._disabled = false;
106
+ this._handleClick = this._handleClick.bind(this);
107
+ }
108
+
109
+ static get observedAttributes() {
110
+ return ['value', 'disabled'];
111
+ }
112
+
113
+ attributeChangedCallback(name, _oldValue, newValue) {
114
+ if (name === 'value') {
115
+ this._setValue(newValue, { reflect: false, emit: false });
116
+ return;
117
+ }
118
+ if (name === 'disabled') {
119
+ this._disabled = newValue !== null;
120
+ this._updateSelection();
121
+ }
122
+ }
123
+
124
+ connectedCallback() {
125
+ this.render();
126
+ this.shadowRoot.addEventListener('click', this._handleClick);
127
+ this._setValue(this.getAttribute('value') || this._value, { reflect: false, emit: false });
128
+ }
129
+
130
+ disconnectedCallback() {
131
+ this.shadowRoot.removeEventListener('click', this._handleClick);
132
+ }
133
+
134
+ get value() {
135
+ return this._value;
136
+ }
137
+
138
+ set value(value) {
139
+ this._setValue(value, { reflect: true, emit: false });
140
+ }
141
+
142
+ _setValue(value, { reflect, emit } = { reflect: true, emit: false }) {
143
+ const normalized = normalizeHex(value);
144
+ if (!normalized) {
145
+ return;
146
+ }
147
+ const changed = normalized !== this._value;
148
+ this._value = normalized;
149
+ if (reflect && this.getAttribute('value') !== normalized) {
150
+ this.setAttribute('value', normalized);
151
+ }
152
+ this._updateSelection();
153
+ if (emit && changed) {
154
+ const detail = { value: normalized, hex: normalized };
155
+ this.dispatchEvent(new CustomEvent('colorchange', { detail }));
156
+ this.dispatchEvent(new CustomEvent('change', { detail }));
157
+ }
158
+ }
159
+
160
+ _handleClick(event) {
161
+ const swatch = event.target.closest('button[data-color]');
162
+ if (!swatch || this._disabled) {
163
+ return;
164
+ }
165
+ this._setValue(swatch.dataset.color, { reflect: true, emit: true });
166
+ }
167
+
168
+ _updateSelection() {
169
+ if (!this.shadowRoot) {
170
+ return;
171
+ }
172
+ const swatches = this.shadowRoot.querySelectorAll('button[data-color]');
173
+ swatches.forEach((swatch) => {
174
+ const selected = swatch.dataset.color === this._value;
175
+ swatch.toggleAttribute('data-selected', selected);
176
+ swatch.setAttribute('aria-pressed', selected ? 'true' : 'false');
177
+ swatch.disabled = this._disabled;
178
+ });
179
+
180
+ const currentValue = this.shadowRoot.querySelector('.current-value');
181
+ if (currentValue) {
182
+ currentValue.textContent = this._value;
183
+ }
184
+ const currentSwatch = this.shadowRoot.querySelector('.current-swatch');
185
+ if (currentSwatch) {
186
+ currentSwatch.style.background = this._value;
187
+ }
188
+ }
189
+
190
+ render() {
191
+ const gridMarkup = PALETTE_ROWS.map(
192
+ (row) => `
193
+ <div class="swatch-row">
194
+ ${row
195
+ .map(
196
+ (swatch) => `
197
+ <button
198
+ type="button"
199
+ class="swatch"
200
+ data-color="${swatch.value}"
201
+ title="${swatch.name} ${swatch.value}"
202
+ aria-label="${swatch.name} ${swatch.value}"
203
+ style="background:${swatch.value};"
204
+ ></button>
205
+ `,
206
+ )
207
+ .join('')}
208
+ </div>
209
+ `,
210
+ ).join('');
211
+
212
+ this.shadowRoot.innerHTML = `
213
+ <style>
214
+ :host {
215
+ display: block;
216
+ width: 100%;
217
+ }
218
+
219
+ .palette {
220
+ display: grid;
221
+ gap: 10px;
222
+ font-family: monospace;
223
+ color: #d7d7d7;
224
+ }
225
+
226
+ .grid {
227
+ display: grid;
228
+ gap: 6px;
229
+ }
230
+
231
+ .swatch-row {
232
+ display: grid;
233
+ grid-template-columns: repeat(8, minmax(0, 1fr));
234
+ gap: 6px;
235
+ }
236
+
237
+ .swatch {
238
+ appearance: none;
239
+ border: 2px solid rgba(255, 255, 255, 0.16);
240
+ border-radius: 8px;
241
+ cursor: pointer;
242
+ display: block;
243
+ min-height: 24px;
244
+ padding: 0;
245
+ position: relative;
246
+ transition: transform 120ms ease, border-color 120ms ease, box-shadow 120ms ease;
247
+ width: 100%;
248
+ }
249
+
250
+ .swatch:hover {
251
+ transform: translateY(-1px);
252
+ border-color: rgba(255, 255, 255, 0.5);
253
+ }
254
+
255
+ .swatch[data-selected] {
256
+ border-color: #ffffff;
257
+ box-shadow: 0 0 0 2px rgba(28, 28, 28, 0.7), 0 0 0 4px rgba(255, 255, 255, 0.45);
258
+ }
259
+
260
+ .swatch[data-selected]::after {
261
+ content: '';
262
+ position: absolute;
263
+ inset: 6px;
264
+ border: 1px solid rgba(0, 0, 0, 0.45);
265
+ border-radius: 5px;
266
+ }
267
+
268
+ .current {
269
+ align-items: center;
270
+ display: flex;
271
+ gap: 8px;
272
+ font-size: 12px;
273
+ }
274
+
275
+ .current-swatch {
276
+ border: 1px solid rgba(255, 255, 255, 0.24);
277
+ border-radius: 6px;
278
+ height: 18px;
279
+ width: 18px;
280
+ }
281
+
282
+ .current-label {
283
+ color: #9f9f9f;
284
+ text-transform: uppercase;
285
+ }
286
+
287
+ .swatch:disabled {
288
+ cursor: default;
289
+ opacity: 0.55;
290
+ transform: none;
291
+ }
292
+ </style>
293
+ <div class="palette">
294
+ <div class="grid">${gridMarkup}</div>
295
+ <div class="current">
296
+ <div class="current-swatch"></div>
297
+ <div><span class="current-label">Selected</span> <span class="current-value"></span></div>
298
+ </div>
299
+ </div>
300
+ `;
301
+ this._updateSelection();
302
+ }
303
+ }
304
+
305
+ if (!customElements.get('color-palette')) {
306
+ customElements.define('color-palette', ColorPaletteElement);
307
+ }
308
+
309
+ export { ColorPaletteElement };
@@ -32,7 +32,7 @@ const attachMarkdownLinkHandlers = (containerSelector) => {
32
32
  id: `external-link-${s4()}`,
33
33
  html: async () => html`
34
34
  <div class="in section-mp" style="text-align: center; padding: 20px;">
35
- <p>${Translate.Render('external-link-warning')}</p>
35
+ <p>${Translate.instance('external-link-warning')}</p>
36
36
  <p style="word-break: break-all; margin-top: 10px;"><strong>${href}</strong></p>
37
37
  </div>
38
38
  `,
@@ -55,8 +55,8 @@ const attachMarkdownLinkHandlers = (containerSelector) => {
55
55
  });
56
56
  };
57
57
 
58
- const Content = {
59
- Render: async function (options = { idModal: '', titleIcon: '' }) {
58
+ class Content {
59
+ static async instance(options = { idModal: '', titleIcon: '' }) {
60
60
  const { idModal } = options;
61
61
  setTimeout(async () => {
62
62
  try {
@@ -140,12 +140,15 @@ const Content = {
140
140
  htmls(`.content-render-${idModal}`, ``);
141
141
 
142
142
  // Pass file IDs to RenderFile - it will fetch blobs as needed
143
- if (md) await this.RenderFile({ idModal, file: md, id: md._id });
144
- if (file) await this.RenderFile({ idModal, file, id: file._id });
143
+ if (md) await Content.RenderFile({ idModal, file: md, id: md._id });
144
+ if (file) await Content.RenderFile({ idModal, file, id: file._id });
145
145
  Modal.Data[idModal].onObserverListener[`main-content-observer`]();
146
146
  } catch (error) {
147
147
  htmls(`.content-render-${idModal}`, '');
148
- htmls(`.error-${idModal}`, html`<i class="fas fa-exclamation-circle"></i> ${Translate.Render(error.message)}`);
148
+ htmls(
149
+ `.error-${idModal}`,
150
+ html`<i class="fas fa-exclamation-circle"></i> ${Translate.instance(error.message)}`,
151
+ );
149
152
  s(`.error-${idModal}`).classList.remove('hide');
150
153
  }
151
154
  s(`.ssr-shimmer-content-${idModal}`).classList.add('hide');
@@ -164,14 +167,14 @@ const Content = {
164
167
  ${imageShimmer()}
165
168
  </div>
166
169
  <div class="abs center error-${idModal} hide"></div>`;
167
- },
170
+ }
168
171
 
169
172
  /**
170
173
  * Helper function to get file content
171
174
  * Supports both legacy format (with buffer data) and new format (metadata only)
172
175
  * For new format, fetches content from blob endpoint
173
176
  */
174
- getFileContent: async function (file, options = {}) {
177
+ static async getFileContent(file, options = {}) {
175
178
  // If custom URL provided, use it
176
179
  if (options.url) {
177
180
  return await CoreService.getRaw({ url: options.url });
@@ -197,9 +200,9 @@ const Content = {
197
200
  }
198
201
 
199
202
  throw new Error('No file content available');
200
- },
203
+ }
201
204
 
202
- RenderFile: async function (
205
+ static async RenderFile(
203
206
  options = {
204
207
  file: {
205
208
  _id: '',
@@ -308,13 +311,13 @@ ${JSON.stringify(JSON.parse(content), null, 4)}</pre
308
311
  if (ext === 'md') {
309
312
  attachMarkdownLinkHandlers(container);
310
313
  }
311
- },
314
+ }
312
315
 
313
316
  /**
314
317
  * Generate appropriate URL for file display
315
318
  * Prefers blob endpoint for new metadata-only format
316
319
  */
317
- urlFactory: async function (options) {
320
+ static async urlFactory(options) {
318
321
  // If custom URL provided, use it
319
322
  if (options.url) {
320
323
  return options.url;
@@ -340,7 +343,7 @@ ${JSON.stringify(JSON.parse(content), null, 4)}</pre
340
343
  }
341
344
 
342
345
  return null;
343
- },
344
- };
346
+ }
347
+ }
345
348
 
346
349
  export { Content, attachMarkdownLinkHandlers };