@awesomeness-js/server 1.0.2 → 1.1.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 (130) hide show
  1. package/README.md +61 -0
  2. package/build/build.js +7 -0
  3. package/build/postBuild.js +7 -0
  4. package/example-.awesomeness/componentLocations.js +15 -0
  5. package/example-.awesomeness/config.js +5 -21
  6. package/example-site/example.awesomenessjs.com/api/readme.md +1 -0
  7. package/example-site/example.awesomenessjs.com/components/example/index.js +3 -0
  8. package/example-site/example.awesomenessjs.com/components/notCommonExample/_.css +1 -0
  9. package/example-site/example.awesomenessjs.com/components/notCommonExample/index.js +3 -0
  10. package/example-site/example.awesomenessjs.com/pages/_md/_info.js +15 -0
  11. package/example-site/example.awesomenessjs.com/pages/_md/css/example.css +4 -0
  12. package/example-site/example.awesomenessjs.com/pages/_md/drafts/example.md +32 -0
  13. package/example-site/example.awesomenessjs.com/pages/_md/getBlogData.js +117 -0
  14. package/example-site/example.awesomenessjs.com/pages/_md/getData.js +36 -0
  15. package/example-site/example.awesomenessjs.com/pages/_md/js/callToAction.js +43 -0
  16. package/example-site/example.awesomenessjs.com/pages/_md/js/init.js +88 -0
  17. package/example-site/example.awesomenessjs.com/pages/_md/meta.template.md +33 -0
  18. package/example-site/example.awesomenessjs.com/pages/_md/pages/mission.md +345 -0
  19. package/example-site/example.awesomenessjs.com/pages/_template/_info.js +9 -0
  20. package/example-site/example.awesomenessjs.com/pages/_template/css/_.css +4 -0
  21. package/example-site/example.awesomenessjs.com/pages/_template/getData.js +6 -0
  22. package/example-site/example.awesomenessjs.com/pages/_template/js/init.js +3 -0
  23. package/example-site/example.awesomenessjs.com/pages/blog/_info.js +14 -0
  24. package/example-site/example.awesomenessjs.com/pages/blog/css/topics.css +17 -0
  25. package/example-site/example.awesomenessjs.com/pages/blog/getData.js +22 -0
  26. package/example-site/example.awesomenessjs.com/pages/blog/js/colors.js +159 -0
  27. package/example-site/example.awesomenessjs.com/pages/blog/js/init.js +242 -0
  28. package/example-site/example.awesomenessjs.com/pages/blog/js/tag.js +111 -0
  29. package/example-site/example.awesomenessjs.com/pages/examples/_info.js +9 -0
  30. package/example-site/example.awesomenessjs.com/pages/examples/css/footer.css +6 -0
  31. package/example-site/example.awesomenessjs.com/pages/examples/css/intro.css +67 -0
  32. package/example-site/example.awesomenessjs.com/pages/examples/css/nav.css +221 -0
  33. package/example-site/example.awesomenessjs.com/pages/examples/getData.js +8 -0
  34. package/example-site/example.awesomenessjs.com/pages/examples/js/init.js +15 -0
  35. package/example-site/example.awesomenessjs.com/pages/examples/js/updateState.js +14 -0
  36. package/example-site/example.awesomenessjs.com/pages/start/_info.js +11 -0
  37. package/example-site/example.awesomenessjs.com/pages/start/css/footer.css +6 -0
  38. package/example-site/example.awesomenessjs.com/pages/start/css/intro.css +67 -0
  39. package/example-site/example.awesomenessjs.com/pages/start/css/nav.css +221 -0
  40. package/example-site/example.awesomenessjs.com/pages/start/getData.js +8 -0
  41. package/example-site/example.awesomenessjs.com/pages/start/js/init.js +30 -0
  42. package/example-site/example.awesomenessjs.com/pages/start/js/updateState.js +14 -0
  43. package/example-site/example.awesomenessjs.com/public/images/awesomeness.webp +0 -0
  44. package/example-site/example.awesomenessjs.com/public/manifest.webmanifest.json +8 -0
  45. package/example-site/example.awesomenessjs.com/specialRoutes.js +14 -0
  46. package/index.js +105 -25
  47. package/package.json +5 -2
  48. package/{server → src}/applicationMap.js +1 -1
  49. package/{server → src}/awesomenessNormalizeRequest.js +24 -3
  50. package/{server → src}/componentDependencies.js +11 -5
  51. package/{config.js → src/config.js} +6 -1
  52. package/{server → src}/fetchPage.js +6 -6
  53. package/src/getConfig.js +3 -0
  54. package/src/init.js +3 -0
  55. package/{server → src}/koa/attachAwesomenessRequest.js +5 -6
  56. package/{server → src}/koa/cors.js +2 -4
  57. package/{server → src}/koa/errorHandler.js +3 -3
  58. package/{server → src}/koa/finalFormat.js +2 -5
  59. package/{server → src}/koa/jsonBodyParser.js +3 -3
  60. package/src/koa/routeRequest.js +334 -0
  61. package/{server → src}/koa/serverUp.js +2 -4
  62. package/{server → src}/koa/staticFiles.js +10 -11
  63. package/{server → src}/koa/timeout.js +3 -3
  64. package/{server → src}/pageInfo.js +6 -6
  65. package/{server → src}/reRoute.js +3 -2
  66. package/{server → src}/resolveRealCasePath.js +1 -1
  67. package/{start.js → src/start.js} +14 -13
  68. package/{server → src}/validateRequest.js +1 -1
  69. package/{server → src}/ws/handlers.js +4 -2
  70. package/{server → src}/ws/index.js +2 -2
  71. package/ui/README.md +438 -0
  72. package/ui/awesomeness-ui.instructions.md +156 -0
  73. package/ui/build.js +119 -0
  74. package/ui/commonComponent.test.js +27 -0
  75. package/ui/components/blogPost/all.css +371 -0
  76. package/ui/components/blogPost/headerImage.js +153 -0
  77. package/ui/components/blogPost/index.js +45 -0
  78. package/ui/components/blogPost/marked.js +74 -0
  79. package/ui/components/blogPost/md.js +73 -0
  80. package/ui/components/blogPost/parseAwesomeness.jQuery.js +47 -0
  81. package/ui/components/blogPost/readme.md +8 -0
  82. package/ui/components/colors/README.md +65 -0
  83. package/ui/components/colors/dynamic.css +1884 -0
  84. package/ui/components/colors/dynamic.css.js +135 -0
  85. package/ui/components/colors/dynamic.css.php +79 -0
  86. package/ui/components/colors/example.js +133 -0
  87. package/ui/components/colors/index.js +65 -0
  88. package/ui/components/colors/map.js +13 -0
  89. package/ui/components/colors/random.js +17 -0
  90. package/ui/components/colors/tailwind-colors.css +247 -0
  91. package/ui/components/insertIntoList/insertIntoList.jquery.js +150 -0
  92. package/ui/components/tag/category.js +8 -0
  93. package/ui/components/tag/index.js +33 -0
  94. package/ui/components/tag/list.js +42 -0
  95. package/ui/components/tag/map.js +64 -0
  96. package/ui/components/tag/tagMap.css +60 -0
  97. package/ui/components/tag/tags.css +20 -0
  98. package/ui/core/css/_normalize.css +57 -0
  99. package/ui/core/css/dynamic/flex.js +36 -0
  100. package/ui/core/css/dynamic/grid.js +185 -0
  101. package/ui/core/css/dynamic/shortcuts.js +48 -0
  102. package/ui/core/css/dynamic/spacing.js +61 -0
  103. package/ui/core/css/dynamic/text.js +80 -0
  104. package/ui/core/css/dynamic/width.js +75 -0
  105. package/ui/core/css/dynamic.js +40 -0
  106. package/ui/core/js/app/api.js +143 -0
  107. package/ui/core/js/app/init.js +88 -0
  108. package/ui/core/js/app/initDarkMode.js +26 -0
  109. package/ui/core/js/app/initialScroll.js +28 -0
  110. package/ui/core/js/app/meta/update/components.js +65 -0
  111. package/ui/core/js/app/meta/update/pages.js +86 -0
  112. package/ui/core/js/app/metaUpdates.js +10 -0
  113. package/ui/core/js/app/page.js +319 -0
  114. package/ui/core/js/app/resize.js +52 -0
  115. package/ui/core/js/app/state/back.js +16 -0
  116. package/ui/core/js/app/state/create.js +50 -0
  117. package/ui/core/js/app/state/get.js +5 -0
  118. package/ui/core/js/app/state/init.js +25 -0
  119. package/ui/core/js/app.js +41 -0
  120. package/ui/core/js/jquery-3.7.1.min.js +2 -0
  121. package/ui/core/public/app.css +1 -0
  122. package/ui/core/public/app.js +975 -0
  123. package/ui/core/public/favicon.ico +0 -0
  124. package/ui/core/public/index.html +40 -0
  125. package/server/koa/routeRequest.js +0 -286
  126. /package/{server/errors.js → errors.js} +0 -0
  127. /package/{server → src}/brotliJsonResponse.js +0 -0
  128. /package/{server → src}/checkAccess.js +0 -0
  129. /package/{server → src}/getMD.js +0 -0
  130. /package/{server → src}/specialPaths.js +0 -0
@@ -0,0 +1,61 @@
1
+ export default function({
2
+ sizes = [
3
+ 'xl',
4
+ 'd',
5
+ 't',
6
+ 'p'
7
+ ],
8
+ pixels = 126
9
+ } = {}) {
10
+
11
+ let data = ` `;
12
+
13
+ // dynamic margin
14
+ for( let i = 0; i < pixels; i += 5 ){
15
+
16
+ data += `.gap-${i} { gap:${i}px; } `;
17
+
18
+ data += `.m${i} { margin:${i}px; } `;
19
+ data += `.mt${i} { margin-top:${i}px; } `;
20
+ data += `.mb${i} { margin-bottom:${i}px; } `;
21
+ data += `.ml${i} { margin-left:${i}px; } `;
22
+ data += `.mr${i} { margin-right:${i}px; } `;
23
+ data += `.mtb${i} { margin-top:${i}px; margin-bottom:${i}px; } `;
24
+ data += `.mlr${i} { margin-left:${i}px; margin-right:${i}px; } `;
25
+
26
+ data += `.p${i} { padding:${i}px; } `;
27
+ data += `.pt${i} { padding-top:${i}px; } `;
28
+ data += `.pb${i} { padding-bottom:${i}px; } `;
29
+ data += `.pl${i} { padding-left:${i}px; } `;
30
+ data += `.pr${i} { padding-right:${i}px; } `;
31
+ data += `.ptb${i} { padding-top:${i}px; padding-bottom:${i}px; } `;
32
+ data += `.plr${i} { padding-left:${i}px; padding-right:${i}px; } `;
33
+
34
+ sizes.forEach((s) => {
35
+
36
+ data += `.app-size-${s} .gap-${i}-${s} { gap:${i}px; } `;
37
+
38
+ data += `.app-size-${s} .m${i}-${s} { margin:${i}px; } `;
39
+ data += `.app-size-${s} .mt${i}-${s} { margin-top:${i}px; } `;
40
+ data += `.app-size-${s} .mr${i}-${s} { margin-right:${i}px; } `;
41
+ data += `.app-size-${s} .mb${i}-${s} { margin-bottom:${i}px; } `;
42
+ data += `.app-size-${s} .ml${i}-${s} { margin-left:${i}px; } `;
43
+ data += `.app-size-${s} .mtb${i}-${s} { margin-top:${i}px; margin-bottom:${i}px; } `;
44
+ data += `.app-size-${s} .mlr${i}-${s} { margin-left:${i}px; margin-right:${i}px; } `;
45
+
46
+
47
+ data += `.app-size-${s} .p${i}-${s} { padding:${i}px; } `;
48
+ data += `.app-size-${s} .pt${i}-${s} { padding-top:${i}px; } `;
49
+ data += `.app-size-${s} .pr${i}-${s} { padding-right:${i}px; } `;
50
+ data += `.app-size-${s} .pb${i}-${s} { padding-bottom:${i}px; } `;
51
+ data += `.app-size-${s} .pl${i}-${s} { padding-left:${i}px; } `;
52
+ data += `.app-size-${s} .ptb${i}-${s} { padding-top:${i}px; padding-bottom:${i}px; } `;
53
+ data += `.app-size-${s} .plr${i}-${s} { padding-left:${i}px; padding-right:${i}px; } `;
54
+
55
+ });
56
+
57
+ }
58
+
59
+ return data;
60
+
61
+ }
@@ -0,0 +1,80 @@
1
+ export default function(sizes = [
2
+ 'xl',
3
+ 'd',
4
+ 't',
5
+ 'p'
6
+ ]) {
7
+
8
+ let data = ` `;
9
+
10
+ data += `.text-center {text-align:center !important;} `;
11
+ data += `.text-left {text-align:left !important;} `;
12
+ data += `.text-right {text-align:right !important;} `;
13
+
14
+ data += `.text-300 {font-weight:300 !important;} `;
15
+ data += `.text-400 {font-weight:400 !important;} `;
16
+ data += `.text-500 {font-weight:500 !important;} `;
17
+ data += `.text-600 {font-weight:600 !important;} `;
18
+ data += `.text-700 {font-weight:700 !important;} `;
19
+ data += `.text-800 {font-weight:800 !important;} `;
20
+ data += `.text-900 {font-weight:900 !important;} `;
21
+
22
+ data += `.text-300--hover:hover{font-weight:300 !important;} `;
23
+ data += `.text-400--hover:hover{font-weight:400 !important;} `;
24
+ data += `.text-500--hover:hover{font-weight:500 !important;} `;
25
+ data += `.text-600--hover:hover{font-weight:600 !important;} `;
26
+ data += `.text-700--hover:hover{font-weight:700 !important;} `;
27
+ data += `.text-800--hover:hover{font-weight:800 !important;} `;
28
+ data += `.text-900--hover:hover{font-weight:900 !important;} `;
29
+
30
+ data += `.text-xxs {font-size:.70em !important;} `;
31
+ data += `.text-xs {font-size:.83em !important;} `;
32
+ data += `.text-s {font-size:.9em !important;} `;
33
+ data += `.text-m {font-size:1.1em !important;} `;
34
+ data += `.text-l {font-size:1.2em !important;} `;
35
+ data += `.text-xl {font-size:1.4em !important;} `;
36
+ data += `.text-xxl {font-size:1.6em !important;} `;
37
+ data += `.text-xxxl {font-size:2em !important;} `;
38
+
39
+ data += `.text-i {font-style:italic !important;} `;
40
+
41
+
42
+ sizes.forEach((s) => {
43
+
44
+ data += `.app-size-${s} .text-center-${s}{text-align:center !important;} `;
45
+ data += `.app-size-${s} .text-left-${s}{text-align:left !important;} `;
46
+ data += `.app-size-${s} .text-right-${s}{text-align:right !important;} `;
47
+
48
+ data += `.app-size-${s} .text-300-${s}{font-weight:300 !important;} `;
49
+ data += `.app-size-${s} .text-400-${s}{font-weight:400 !important;} `;
50
+ data += `.app-size-${s} .text-500-${s}{font-weight:500 !important;} `;
51
+ data += `.app-size-${s} .text-600-${s}{font-weight:600 !important;} `;
52
+ data += `.app-size-${s} .text-700-${s}{font-weight:700 !important;} `;
53
+ data += `.app-size-${s} .text-800-${s}{font-weight:800 !important;} `;
54
+ data += `.app-size-${s} .text-900-${s}{font-weight:900 !important;} `;
55
+
56
+ data += `.app-size-${s} .text-300-${s}--hover:hover{font-weight:300 !important;} `;
57
+ data += `.app-size-${s} .text-400-${s}--hover:hover{font-weight:400 !important;} `;
58
+ data += `.app-size-${s} .text-500-${s}--hover:hover{font-weight:500 !important;} `;
59
+ data += `.app-size-${s} .text-600-${s}--hover:hover{font-weight:600 !important;} `;
60
+ data += `.app-size-${s} .text-700-${s}--hover:hover{font-weight:700 !important;} `;
61
+ data += `.app-size-${s} .text-800-${s}--hover:hover{font-weight:800 !important;} `;
62
+ data += `.app-size-${s} .text-900-${s}--hover:hover{font-weight:900 !important;} `;
63
+
64
+
65
+ data += `.app-size-${s} .text-xxs-${s}{font-size:.70em !important;} `;
66
+ data += `.app-size-${s} .text-xs-${s}{font-size:.83em !important;} `;
67
+ data += `.app-size-${s} .text-s-${s}{font-size:.9em !important;} `;
68
+ data += `.app-size-${s} .text-m-${s}{font-size:1.1em !important;} `;
69
+ data += `.app-size-${s} .text-l-${s}{font-size:1.2em !important;} `;
70
+ data += `.app-size-${s} .text-xl-${s}{font-size:1.4em !important;} `;
71
+ data += `.app-size-${s} .text-xxl-${s}{font-size:1.6em !important;} `;
72
+ data += `.app-size-${s} .text-xxxl-${s}{font-size:2em !important;} `;
73
+
74
+ data += `.app-size-${s} .i-${s}{font-style:italic !important;} `;
75
+
76
+ });
77
+
78
+ return data;
79
+
80
+ }
@@ -0,0 +1,75 @@
1
+ export default function(sizes = [
2
+ 'xl',
3
+ 'd',
4
+ 't',
5
+ 'p'
6
+ ]) {
7
+
8
+ let data = ` `;
9
+
10
+ // dynamic width
11
+ for (let i = 1; i <= 100; i++) {
12
+
13
+ // float
14
+ data += `.width${i} { width:${i}%; } `;
15
+ sizes.forEach((s) => {
16
+
17
+ data += `.app-size-${s} .width${i}-${s} { width:${i}%; } `;
18
+
19
+ });
20
+
21
+ }
22
+
23
+ // dynamic height
24
+ for (let i = 1; i <= 1000; i++) {
25
+
26
+ // float
27
+ data += `.height${i} { height:${i}%; } `;
28
+ sizes.forEach((s) => {
29
+
30
+ data += `.app-size-${s} .height${i}-${s} { height:${i}%; } `;
31
+
32
+ });
33
+
34
+ }
35
+
36
+
37
+ for (let i = 5; i <= 2000; i += 5) {
38
+
39
+ // max width
40
+ data += `.width-${i} { width:${i}px; } `;
41
+ data += `.height-${i} { height:${i}px; } `;
42
+ data += `.max-width-${i} { max-width:${i}px; } `;
43
+ data += `.min-width-${i} { min-width:${i}px; } `;
44
+ data += `.max-height-${i} { max-height:${i}px; } `;
45
+ data += `.min-height-${i} { min-height:${i}px; } `;
46
+
47
+ sizes.forEach((s) => {
48
+
49
+ data += `.app-size-${s} .width-${i}-${s} { width:${i}px; } `;
50
+ data += `.app-size-${s} .height-${i}-${s} { height:${i}px; } `;
51
+ data += `.app-size-${s} .max-width-${i}-${s} { max-width:${i}px; } `;
52
+ data += `.app-size-${s} .min-width-${i}-${s} { min-width:${i}px; } `;
53
+ data += `.app-size-${s} .max-height-${i}-${s} { max-height:${i}px; } `;
54
+ data += `.app-size-${s} .min-height-${i}-${s} { min-height:${i}px; } `;
55
+
56
+ });
57
+
58
+ }
59
+
60
+
61
+ // span 1 - 12
62
+ for (let i = 1; i <= 12; i++) {
63
+
64
+ data += `.span${i} { width:${i / 12 * 100}%; } `;
65
+ sizes.forEach((s) => {
66
+
67
+ data += `.app-size-${s} .span${i}-${s} { width:${i / 12 * 100}%; } `;
68
+
69
+ });
70
+
71
+ }
72
+
73
+ return data;
74
+
75
+ }
@@ -0,0 +1,40 @@
1
+ import grid from './dynamic/grid.js';
2
+ import text from './dynamic/text.js';
3
+ import spacing from './dynamic/spacing.js';
4
+ import shortcuts from './dynamic/shortcuts.js';
5
+ import width from './dynamic/width.js';
6
+ import flex from './dynamic/flex.js';
7
+
8
+ function dynamicCSS() {
9
+
10
+ let sizes = [
11
+ 'xl', // extra large
12
+ 'd', // desktop
13
+ 't', // tablet
14
+ 'p' // phone
15
+ ];
16
+
17
+ let data = '';
18
+
19
+ const pixels = 126;
20
+
21
+ data += shortcuts(sizes);
22
+ data += text(sizes);
23
+ data += width(sizes);
24
+ data += flex(sizes);
25
+
26
+ data += spacing({
27
+ sizes,
28
+ pixels
29
+ });
30
+ data += grid({
31
+ sizes,
32
+ pixels
33
+ });
34
+
35
+ return data;
36
+
37
+ }
38
+
39
+
40
+ export { dynamicCSS };
@@ -0,0 +1,143 @@
1
+ app.api = async function (route, data = {}) {
2
+
3
+ const time = Date.now();
4
+
5
+ if (!route) throw {
6
+ reason: 'route undefined',
7
+ route,
8
+ data
9
+ };
10
+ if (route[0] === '/') route = route.substring(1);
11
+ if (route.match(/[^a-zA-Z0-9/_\-]/)) throw {
12
+ reason: 'route invalid',
13
+ route,
14
+ data
15
+ };
16
+
17
+ const deviceInfo = {
18
+ device: 'web',
19
+ userAgent: window.navigator.userAgent
20
+ };
21
+
22
+ let isFormData = false;
23
+ let body;
24
+
25
+ // Detect files
26
+ if (data && Object.values(data).some((v) => v instanceof File || v instanceof FileList || (Array.isArray(v) && v[0] instanceof File))) {
27
+
28
+ isFormData = true;
29
+ const formData = new FormData();
30
+
31
+ formData.append('awesomenessType', 'api');
32
+ formData.append('meta', JSON.stringify(app.meta));
33
+ formData.append('device', JSON.stringify(deviceInfo));
34
+
35
+
36
+ for (const key in data) {
37
+
38
+ const val = data[key];
39
+
40
+ if (val instanceof FileList) {
41
+
42
+ [ ...val ].forEach((f) => formData.append(key + '[]', f));
43
+
44
+ } else if (Array.isArray(val) && val[0] instanceof File) {
45
+
46
+ val.forEach((f) => formData.append(key + '[]', f));
47
+
48
+ } else {
49
+
50
+ formData.append(key, val);
51
+
52
+ }
53
+
54
+ }
55
+
56
+ body = formData;
57
+
58
+ } else {
59
+
60
+ body = JSON.stringify({
61
+ awesomenessType: 'api',
62
+ meta: app.meta,
63
+ device: deviceInfo,
64
+ ... data,
65
+ });
66
+
67
+ }
68
+
69
+ let headers = {
70
+ 'Authorization': 'Bearer ' + (app.session ?? ''),
71
+ };
72
+
73
+ if (!isFormData) headers['Content-Type'] = 'application/json';
74
+
75
+ let fetchOptions = {
76
+ method: 'POST',
77
+ headers,
78
+ body,
79
+ timeout: 5 * 60 * 1000,
80
+ };
81
+
82
+ try {
83
+
84
+ if (app.testing) {
85
+
86
+ console.log('%capi: ', 'color: blue; font-weight:bold;', route, isFormData ? body : JSON.parse(body));
87
+
88
+ }
89
+
90
+
91
+ const response = await fetch(app.apiBaseURL + route, fetchOptions);
92
+
93
+ if (!response.ok) throw {
94
+ status: response.status,
95
+ ...(await response.json())
96
+ };
97
+
98
+ const doneData = await response.json();
99
+
100
+ app.metaUpdates(doneData.meta);
101
+
102
+ if (app.testing) {
103
+
104
+ if (doneData.testing) {
105
+
106
+ if (doneData.testing.perf) doneData.testing.perf.xhr = Date.now() - time;
107
+ console.log('%ctesting: ', 'color: purple; font-weight:bold;', doneData.testing);
108
+
109
+ }
110
+
111
+ delete doneData.testing;
112
+ console.log('%cmeta: ', 'color: #ff6f00; font-weight:bold;', doneData.meta ?? null);
113
+ delete doneData.meta;
114
+ console.log('%capi: ', 'color: green; font-weight:bold;', doneData);
115
+
116
+ } else {
117
+
118
+ delete doneData.testing;
119
+ delete doneData.meta;
120
+
121
+ }
122
+
123
+
124
+ return doneData;
125
+
126
+ } catch (errorData) {
127
+
128
+ if (app.testing) console.log('%capi: ', 'color: red; font-weight:bold;', errorData);
129
+
130
+ if (errorData.APP_SESSION) {
131
+
132
+ app.session = null;
133
+ app.user = null;
134
+ window.localStorage.removeItem('awesomeness-appSession');
135
+ location.reload();
136
+
137
+ }
138
+
139
+ throw errorData;
140
+
141
+ }
142
+
143
+ };
@@ -0,0 +1,88 @@
1
+ app.init = async function({
2
+ loadPage = 'start',
3
+ emptyBody = false,
4
+ } = {}){
5
+
6
+ app._supportsConstructableSheets =
7
+ !!document.adoptedStyleSheets &&
8
+ typeof CSSStyleSheet !== "undefined" &&
9
+ typeof CSSStyleSheet.prototype.replaceSync === "function";
10
+
11
+ app.session = window.localStorage.getItem('awesomeness-appSession');
12
+
13
+ // fuck with dark mode
14
+ app.initDarkMode();
15
+
16
+ // adjust on resize
17
+ window.onresize = function(){
18
+
19
+ app.resize();
20
+
21
+ };
22
+
23
+ app.resize(); // trigger initial resize
24
+
25
+ // URL STUFF
26
+ var origLocation = window.location.pathname;
27
+
28
+ // do we have a mouse
29
+ app.mouse = false;
30
+
31
+
32
+ const $body = $('body');
33
+
34
+ window.addEventListener('beforeunload', () => {
35
+
36
+ console.log('Saving last page info:', {
37
+ url: origLocation,
38
+ scrollY: window.scrollY
39
+ });
40
+
41
+ localStorage.setItem('awesomeness-lastPage', JSON.stringify({
42
+ url: origLocation,
43
+ scrollY: window.scrollY
44
+ }));
45
+
46
+ });
47
+
48
+
49
+
50
+
51
+ $body.on('mousemove', function(){
52
+
53
+ app.mouse = true;
54
+ $body.off('mousemove');
55
+
56
+ });
57
+
58
+ if(loadPage){
59
+
60
+ if(emptyBody){
61
+
62
+ $body.empty();
63
+
64
+ }
65
+
66
+ app.page(loadPage, { origLocation });
67
+
68
+ }
69
+
70
+ const url = "/app.css";
71
+
72
+ const css = await fetch(url).then((r) => r.text());
73
+
74
+ const sheet = new CSSStyleSheet();
75
+
76
+ sheet.replaceSync(css);
77
+
78
+ app.meta.styleSheets.__CORE__ = sheet;
79
+
80
+ // Optional: Apply globally if not shadow-based
81
+ document.adoptedStyleSheets = [
82
+ ...(document.adoptedStyleSheets || []),
83
+ sheet
84
+ ];
85
+
86
+ return true;
87
+
88
+ };
@@ -0,0 +1,26 @@
1
+ app.initDarkMode = function(){
2
+
3
+ // ititial add
4
+ if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
5
+
6
+ document.body.classList.add('darkMode');
7
+
8
+ }
9
+
10
+ // adjust on change
11
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (event) => {
12
+
13
+ if(event.matches){
14
+
15
+ document.body.classList.add('darkMode');
16
+
17
+ } else {
18
+
19
+ document.body.classList.remove('darkMode');
20
+
21
+ }
22
+
23
+ });
24
+
25
+
26
+ };
@@ -0,0 +1,28 @@
1
+ app.initialScroll = async function(){
2
+
3
+ // if we have the same page
4
+ const wereOnSamePage_raw = localStorage.getItem('awesomeness-lastPage');
5
+
6
+ if(wereOnSamePage_raw){
7
+
8
+ const wereOnSamePage = JSON.parse(wereOnSamePage_raw);
9
+
10
+ const url = window.location.pathname;
11
+
12
+ if(wereOnSamePage.url == url){
13
+
14
+ if(wereOnSamePage.scrollY){
15
+
16
+ setTimeout(function(){
17
+
18
+ window.scrollTo(0, wereOnSamePage.scrollY);
19
+
20
+ }, 100);
21
+
22
+ }
23
+
24
+ }
25
+
26
+ }
27
+
28
+ };
@@ -0,0 +1,65 @@
1
+ app.meta.update.components = function (components) {
2
+
3
+ Object.entries(components).forEach(([ name, component ]) => {
4
+
5
+ app.meta.components[name] = component.hash;
6
+
7
+ // prefix + normalize
8
+ const key = "component__" + String(name).replaceAll("/", "_");
9
+
10
+ // CSS
11
+ if (component.css) {
12
+
13
+ if (app._supportsConstructableSheets) {
14
+
15
+ let sheet = app.meta.styleSheets[key];
16
+
17
+
18
+ if (!sheet) {
19
+
20
+ sheet = new CSSStyleSheet();
21
+ app.meta.styleSheets[key] = sheet;
22
+ document.adoptedStyleSheets = [ ...document.adoptedStyleSheets, sheet ];
23
+
24
+ }
25
+
26
+ sheet.replaceSync(component.css);
27
+
28
+ } else {
29
+
30
+ // fallback <style> injection
31
+ const cssID = key;
32
+ const cssTag ='<style type="text/css" id="' + cssID + '">' + component.css + "</style>";
33
+
34
+ // remove old and insert new inside #css bucket
35
+ $("#" + cssID).remove();
36
+ let $css = $("#css");
37
+
38
+ if (!$css.length) $css = $('<div id="css"></div>').appendTo($("body"));
39
+ $(cssTag).appendTo($css);
40
+
41
+ }
42
+
43
+ }
44
+
45
+ // JS
46
+ if (component.js) {
47
+
48
+ try {
49
+
50
+ eval(component.js);
51
+
52
+ } catch (error) {
53
+
54
+ console.error("Failed to load function:", {
55
+ component: name,
56
+ error
57
+ });
58
+
59
+ }
60
+
61
+ }
62
+
63
+ });
64
+
65
+ };
@@ -0,0 +1,86 @@
1
+ app.meta.update.pages = function (pages) {
2
+
3
+ if (!pages) return;
4
+
5
+ $.each(pages, function (rawName, pageData) {
6
+
7
+ // normalize name like original (no leading/trailing slash)
8
+ const name = String(rawName).replace(/^\/+|\/+$/g, "");
9
+ const nameParts = name.split("/");
10
+
11
+ // ensure namespace: app.pages.example.test
12
+ let base = app.pages;
13
+
14
+
15
+ for (let i = 0; i < nameParts.length; i++) {
16
+
17
+ const part = nameParts[i];
18
+
19
+ if (!base[part]) base[part] = {};
20
+ base = base[part];
21
+
22
+ }
23
+
24
+ // CSS (hot-reload)
25
+ if (pageData.css) {
26
+
27
+ const key = "page__" + name.replaceAll("/", "_"); // <- prefix here
28
+
29
+ if (app._supportsConstructableSheets) {
30
+
31
+ let sheet = app.meta.styleSheets[key];
32
+
33
+
34
+ if (!sheet) {
35
+
36
+ sheet = new CSSStyleSheet();
37
+ app.meta.styleSheets[key] = sheet;
38
+ document.adoptedStyleSheets = [ ...document.adoptedStyleSheets, sheet ];
39
+
40
+ }
41
+
42
+ sheet.replaceSync(pageData.css);
43
+
44
+ } else {
45
+
46
+ // fallback: <style> injection
47
+ const cssID = key; // id equals prefixed key
48
+ const cssTag ='<style type="text/css" id="' + cssID + '">' + pageData.css + "</style>";
49
+
50
+ $("#" + cssID).remove(); // remove old
51
+ let $css = $("#css");
52
+
53
+ if (!$css.length) $css = $('<div id="css"></div>').appendTo($("body"));
54
+ $(cssTag).appendTo($css);
55
+
56
+ }
57
+
58
+ }
59
+
60
+ // JS (hot-reload)
61
+ if (pageData.js) {
62
+
63
+ try {
64
+
65
+ eval(pageData.js);
66
+
67
+ } catch (error) {
68
+
69
+ console.error("Failed to load page script:", {
70
+ name,
71
+ error
72
+ });
73
+
74
+ }
75
+
76
+ }
77
+
78
+ // metadata
79
+ app.meta.pages[name] = pageData.version;
80
+
81
+ base.version = pageData.version;
82
+ base.about = pageData.about;
83
+
84
+ });
85
+
86
+ };
@@ -0,0 +1,10 @@
1
+ app.metaUpdates = function(meta){
2
+
3
+ if(!meta) return;
4
+
5
+ // ORDER OF UPDATES MATTERS
6
+ if(meta.user) app.user = meta.user;
7
+ if(meta.pages) app.meta.update.pages(meta.pages);
8
+ if(meta.components) app.meta.update.components(meta.components);
9
+
10
+ };