@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.
- package/README.md +61 -0
- package/build/build.js +7 -0
- package/build/postBuild.js +7 -0
- package/example-.awesomeness/componentLocations.js +15 -0
- package/example-.awesomeness/config.js +5 -21
- package/example-site/example.awesomenessjs.com/api/readme.md +1 -0
- package/example-site/example.awesomenessjs.com/components/example/index.js +3 -0
- package/example-site/example.awesomenessjs.com/components/notCommonExample/_.css +1 -0
- package/example-site/example.awesomenessjs.com/components/notCommonExample/index.js +3 -0
- package/example-site/example.awesomenessjs.com/pages/_md/_info.js +15 -0
- package/example-site/example.awesomenessjs.com/pages/_md/css/example.css +4 -0
- package/example-site/example.awesomenessjs.com/pages/_md/drafts/example.md +32 -0
- package/example-site/example.awesomenessjs.com/pages/_md/getBlogData.js +117 -0
- package/example-site/example.awesomenessjs.com/pages/_md/getData.js +36 -0
- package/example-site/example.awesomenessjs.com/pages/_md/js/callToAction.js +43 -0
- package/example-site/example.awesomenessjs.com/pages/_md/js/init.js +88 -0
- package/example-site/example.awesomenessjs.com/pages/_md/meta.template.md +33 -0
- package/example-site/example.awesomenessjs.com/pages/_md/pages/mission.md +345 -0
- package/example-site/example.awesomenessjs.com/pages/_template/_info.js +9 -0
- package/example-site/example.awesomenessjs.com/pages/_template/css/_.css +4 -0
- package/example-site/example.awesomenessjs.com/pages/_template/getData.js +6 -0
- package/example-site/example.awesomenessjs.com/pages/_template/js/init.js +3 -0
- package/example-site/example.awesomenessjs.com/pages/blog/_info.js +14 -0
- package/example-site/example.awesomenessjs.com/pages/blog/css/topics.css +17 -0
- package/example-site/example.awesomenessjs.com/pages/blog/getData.js +22 -0
- package/example-site/example.awesomenessjs.com/pages/blog/js/colors.js +159 -0
- package/example-site/example.awesomenessjs.com/pages/blog/js/init.js +242 -0
- package/example-site/example.awesomenessjs.com/pages/blog/js/tag.js +111 -0
- package/example-site/example.awesomenessjs.com/pages/examples/_info.js +9 -0
- package/example-site/example.awesomenessjs.com/pages/examples/css/footer.css +6 -0
- package/example-site/example.awesomenessjs.com/pages/examples/css/intro.css +67 -0
- package/example-site/example.awesomenessjs.com/pages/examples/css/nav.css +221 -0
- package/example-site/example.awesomenessjs.com/pages/examples/getData.js +8 -0
- package/example-site/example.awesomenessjs.com/pages/examples/js/init.js +15 -0
- package/example-site/example.awesomenessjs.com/pages/examples/js/updateState.js +14 -0
- package/example-site/example.awesomenessjs.com/pages/start/_info.js +11 -0
- package/example-site/example.awesomenessjs.com/pages/start/css/footer.css +6 -0
- package/example-site/example.awesomenessjs.com/pages/start/css/intro.css +67 -0
- package/example-site/example.awesomenessjs.com/pages/start/css/nav.css +221 -0
- package/example-site/example.awesomenessjs.com/pages/start/getData.js +8 -0
- package/example-site/example.awesomenessjs.com/pages/start/js/init.js +30 -0
- package/example-site/example.awesomenessjs.com/pages/start/js/updateState.js +14 -0
- package/example-site/example.awesomenessjs.com/public/images/awesomeness.webp +0 -0
- package/example-site/example.awesomenessjs.com/public/manifest.webmanifest.json +8 -0
- package/example-site/example.awesomenessjs.com/specialRoutes.js +14 -0
- package/index.js +105 -25
- package/package.json +5 -2
- package/{server → src}/applicationMap.js +1 -1
- package/{server → src}/awesomenessNormalizeRequest.js +24 -3
- package/{server → src}/componentDependencies.js +11 -5
- package/{config.js → src/config.js} +6 -1
- package/{server → src}/fetchPage.js +6 -6
- package/src/getConfig.js +3 -0
- package/src/init.js +3 -0
- package/{server → src}/koa/attachAwesomenessRequest.js +5 -6
- package/{server → src}/koa/cors.js +2 -4
- package/{server → src}/koa/errorHandler.js +3 -3
- package/{server → src}/koa/finalFormat.js +2 -5
- package/{server → src}/koa/jsonBodyParser.js +3 -3
- package/src/koa/routeRequest.js +334 -0
- package/{server → src}/koa/serverUp.js +2 -4
- package/{server → src}/koa/staticFiles.js +10 -11
- package/{server → src}/koa/timeout.js +3 -3
- package/{server → src}/pageInfo.js +6 -6
- package/{server → src}/reRoute.js +3 -2
- package/{server → src}/resolveRealCasePath.js +1 -1
- package/{start.js → src/start.js} +14 -13
- package/{server → src}/validateRequest.js +1 -1
- package/{server → src}/ws/handlers.js +4 -2
- package/{server → src}/ws/index.js +2 -2
- package/ui/README.md +438 -0
- package/ui/awesomeness-ui.instructions.md +156 -0
- package/ui/build.js +119 -0
- package/ui/commonComponent.test.js +27 -0
- package/ui/components/blogPost/all.css +371 -0
- package/ui/components/blogPost/headerImage.js +153 -0
- package/ui/components/blogPost/index.js +45 -0
- package/ui/components/blogPost/marked.js +74 -0
- package/ui/components/blogPost/md.js +73 -0
- package/ui/components/blogPost/parseAwesomeness.jQuery.js +47 -0
- package/ui/components/blogPost/readme.md +8 -0
- package/ui/components/colors/README.md +65 -0
- package/ui/components/colors/dynamic.css +1884 -0
- package/ui/components/colors/dynamic.css.js +135 -0
- package/ui/components/colors/dynamic.css.php +79 -0
- package/ui/components/colors/example.js +133 -0
- package/ui/components/colors/index.js +65 -0
- package/ui/components/colors/map.js +13 -0
- package/ui/components/colors/random.js +17 -0
- package/ui/components/colors/tailwind-colors.css +247 -0
- package/ui/components/insertIntoList/insertIntoList.jquery.js +150 -0
- package/ui/components/tag/category.js +8 -0
- package/ui/components/tag/index.js +33 -0
- package/ui/components/tag/list.js +42 -0
- package/ui/components/tag/map.js +64 -0
- package/ui/components/tag/tagMap.css +60 -0
- package/ui/components/tag/tags.css +20 -0
- package/ui/core/css/_normalize.css +57 -0
- package/ui/core/css/dynamic/flex.js +36 -0
- package/ui/core/css/dynamic/grid.js +185 -0
- package/ui/core/css/dynamic/shortcuts.js +48 -0
- package/ui/core/css/dynamic/spacing.js +61 -0
- package/ui/core/css/dynamic/text.js +80 -0
- package/ui/core/css/dynamic/width.js +75 -0
- package/ui/core/css/dynamic.js +40 -0
- package/ui/core/js/app/api.js +143 -0
- package/ui/core/js/app/init.js +88 -0
- package/ui/core/js/app/initDarkMode.js +26 -0
- package/ui/core/js/app/initialScroll.js +28 -0
- package/ui/core/js/app/meta/update/components.js +65 -0
- package/ui/core/js/app/meta/update/pages.js +86 -0
- package/ui/core/js/app/metaUpdates.js +10 -0
- package/ui/core/js/app/page.js +319 -0
- package/ui/core/js/app/resize.js +52 -0
- package/ui/core/js/app/state/back.js +16 -0
- package/ui/core/js/app/state/create.js +50 -0
- package/ui/core/js/app/state/get.js +5 -0
- package/ui/core/js/app/state/init.js +25 -0
- package/ui/core/js/app.js +41 -0
- package/ui/core/js/jquery-3.7.1.min.js +2 -0
- package/ui/core/public/app.css +1 -0
- package/ui/core/public/app.js +975 -0
- package/ui/core/public/favicon.ico +0 -0
- package/ui/core/public/index.html +40 -0
- package/server/koa/routeRequest.js +0 -286
- /package/{server/errors.js → errors.js} +0 -0
- /package/{server → src}/brotliJsonResponse.js +0 -0
- /package/{server → src}/checkAccess.js +0 -0
- /package/{server → src}/getMD.js +0 -0
- /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
|
+
};
|