staticky 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +11 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +163 -0
- data/Rakefile +12 -0
- data/bin/staticky +7 -0
- data/lib/staticky/builder.rb +62 -0
- data/lib/staticky/cli.rb +71 -0
- data/lib/staticky/container.rb +26 -0
- data/lib/staticky/deps.rb +5 -0
- data/lib/staticky/environment.rb +8 -0
- data/lib/staticky/error.rb +5 -0
- data/lib/staticky/filesystem.rb +29 -0
- data/lib/staticky/generator.rb +63 -0
- data/lib/staticky/phlex/view_helpers.rb +16 -0
- data/lib/staticky/resource.rb +25 -0
- data/lib/staticky/router/definition.rb +49 -0
- data/lib/staticky/router.rb +35 -0
- data/lib/staticky/server.rb +48 -0
- data/lib/staticky/version.rb +5 -0
- data/lib/staticky/view_context.rb +17 -0
- data/lib/staticky.rb +51 -0
- data/site_template/.dockerignore +4 -0
- data/site_template/.gitignore +11 -0
- data/site_template/.prettierrc +6 -0
- data/site_template/.rspec +1 -0
- data/site_template/.rubocop.yml +8 -0
- data/site_template/.ruby-version +1 -0
- data/site_template/Dockerfile +47 -0
- data/site_template/Gemfile +33 -0
- data/site_template/Procfile.dev +3 -0
- data/site_template/README.md +98 -0
- data/site_template/Rakefile +18 -0
- data/site_template/app/views/errors/not_found.rb +14 -0
- data/site_template/app/views/errors/service_error.rb +14 -0
- data/site_template/app/views/layouts/error.rb +13 -0
- data/site_template/app/views/layouts/head.rb +60 -0
- data/site_template/app/views/layouts/site.rb +37 -0
- data/site_template/app/views/pages/home.rb +22 -0
- data/site_template/app/views/ui/.keep +0 -0
- data/site_template/app/views/ui/footer.rb +21 -0
- data/site_template/app/views/ui/navbar.rb +19 -0
- data/site_template/bin/console +11 -0
- data/site_template/bin/dev +12 -0
- data/site_template/bin/lint +18 -0
- data/site_template/bin/staticky +28 -0
- data/site_template/config/boot.rb +15 -0
- data/site_template/config/routes.rb +9 -0
- data/site_template/config/site.erb +12 -0
- data/site_template/config/vite.json +17 -0
- data/site_template/config.ru +8 -0
- data/site_template/content/.keep +0 -0
- data/site_template/content/demo.md +12 -0
- data/site_template/frontend/controllers/.keep +0 -0
- data/site_template/frontend/controllers/index.js +3 -0
- data/site_template/frontend/entrypoints/application.js +8 -0
- data/site_template/frontend/images/.keep +0 -0
- data/site_template/frontend/images/hero.jpg +0 -0
- data/site_template/frontend/stylesheets/application.css +61 -0
- data/site_template/frontend/stylesheets/syntax.css +151 -0
- data/site_template/frontend/tailwindcss/variable_font_plugin.js +103 -0
- data/site_template/frontend/turbo_transitions.js +54 -0
- data/site_template/lib/component.rb +32 -0
- data/site_template/lib/icon.rb +39 -0
- data/site_template/lib/layout.rb +4 -0
- data/site_template/lib/page.rb +11 -0
- data/site_template/lib/vite_helpers.rb +38 -0
- data/site_template/logs/.keep +0 -0
- data/site_template/nginx.conf +59 -0
- data/site_template/package.json +31 -0
- data/site_template/postcss.config.js +6 -0
- data/site_template/public/android-chrome-192x192.png +0 -0
- data/site_template/public/android-chrome-512x512.png +0 -0
- data/site_template/public/apple-touch-icon.png +0 -0
- data/site_template/public/favicon-16x16.png +0 -0
- data/site_template/public/favicon-32x32.png +0 -0
- data/site_template/public/favicon.ico +0 -0
- data/site_template/public/robots.txt.erb +1 -0
- data/site_template/public/site.webmanifest.erb +19 -0
- data/site_template/public/sitemap.xml +0 -0
- data/site_template/spec/spec_helper.rb +30 -0
- data/site_template/spec/views/pages/home_spec.rb +9 -0
- data/site_template/tailwind.config.js +83 -0
- data/site_template/vite.config.ts +14 -0
- metadata +273 -0
File without changes
|
File without changes
|
File without changes
|
Binary file
|
@@ -0,0 +1,61 @@
|
|
1
|
+
@tailwind base;
|
2
|
+
@tailwind components;
|
3
|
+
@tailwind utilities;
|
4
|
+
|
5
|
+
@layer base {
|
6
|
+
:root {
|
7
|
+
--spacing-xs: clamp(0.5rem, 1%, 1rem);
|
8
|
+
--spacing-sm: clamp(0.75rem, 3%, 1.2rem);
|
9
|
+
--spacing-md: clamp(1.25rem, 6%, 2.5rem);
|
10
|
+
--spacing-lg: clamp(3rem, 12%, 6rem);
|
11
|
+
--spacing-xl: clamp(6rem, 24%, 12rem);
|
12
|
+
--spacing-gap-xs: clamp(0.5rem, 1vmax, 1rem);
|
13
|
+
--spacing-gap-sm: clamp(1rem, 3vmax, 1.5rem);
|
14
|
+
--spacing-gap-md: clamp(1.5rem, 6vmax, 3rem);
|
15
|
+
--spacing-gap-lg: clamp(3rem, 8vmax, 4rem);
|
16
|
+
--spacing-gap-xl: clamp(4rem, 12vmax, 6rem);
|
17
|
+
--shadow-color: var(--b3);
|
18
|
+
--box-shadow-sm:
|
19
|
+
0.3px 0.5px 0.5px oklch(var(--shadow-color) / 0.49),
|
20
|
+
0.5px 0.7px 0.8px -1.9px oklch(var(--shadow-color) / 0.38),
|
21
|
+
1.3px 1.9px 2.2px -3.7px oklch(var(--shadow-color) / 0.27);
|
22
|
+
--box-shadow-md:
|
23
|
+
0.3px 0.5px 0.5px oklch(var(--shadow-color) / 0.51),
|
24
|
+
0.8px 1.2px 1.4px -1.2px oklch(var(--shadow-color) / 0.43),
|
25
|
+
2.3px 3.6px 4px -2.5px oklch(var(--shadow-color) / 0.34),
|
26
|
+
6.3px 9.6px 10.8px -3.7px oklch(var(--shadow-color) / 0.26);
|
27
|
+
--box-shadow-lg:
|
28
|
+
0.3px 0.5px 0.5px oklch(var(--shadow-color) / 0.54),
|
29
|
+
1.3px 1.9px 2.2px -0.6px oklch(var(--shadow-color) / 0.49),
|
30
|
+
2.7px 4.1px 4.6px -1.2px oklch(var(--shadow-color) / 0.44),
|
31
|
+
5.5px 8.4px 9.4px -1.9px oklch(var(--shadow-color) / 0.39),
|
32
|
+
10.6px 16.1px 18.1px -2.5px oklch(var(--shadow-color) / 0.34),
|
33
|
+
18.7px 28.4px 31.9px -3.1px oklch(var(--shadow-color) / 0.29),
|
34
|
+
30.7px 46.6px 52.3px -3.7px oklch(var(--shadow-color) / 0.23);
|
35
|
+
--navbar-height: 64px;
|
36
|
+
--main-scene: calc(100vh - var(--navbar-height));
|
37
|
+
--viewport-padding: var(--spacing-md);
|
38
|
+
}
|
39
|
+
|
40
|
+
body {
|
41
|
+
@apply bg-base-400;
|
42
|
+
}
|
43
|
+
|
44
|
+
.prose pre {
|
45
|
+
@apply bg-base-300 border;
|
46
|
+
}
|
47
|
+
|
48
|
+
* {
|
49
|
+
scrollbar-color: theme("colors.base-200") theme("colors.base-300");
|
50
|
+
border-color: theme("colors.base-200");
|
51
|
+
}
|
52
|
+
|
53
|
+
/* Chrome, Edge, and Safari */
|
54
|
+
*::-webkit-scrollbar {
|
55
|
+
background: theme("colors.base-300")
|
56
|
+
}
|
57
|
+
|
58
|
+
*::-webkit-scrollbar-track {
|
59
|
+
background: theme("colors.base-200");
|
60
|
+
}
|
61
|
+
}
|
@@ -0,0 +1,151 @@
|
|
1
|
+
.highlight table td {
|
2
|
+
padding: 5px;
|
3
|
+
}
|
4
|
+
|
5
|
+
.highlight table pre {
|
6
|
+
margin: 0;
|
7
|
+
}
|
8
|
+
|
9
|
+
.highlight,
|
10
|
+
.highlight .w {
|
11
|
+
color: #abb2bf;
|
12
|
+
}
|
13
|
+
|
14
|
+
.highlight .err {
|
15
|
+
color: #282c34;
|
16
|
+
background-color: #e06c75;
|
17
|
+
}
|
18
|
+
|
19
|
+
.highlight .c,
|
20
|
+
.highlight .ch,
|
21
|
+
.highlight .cd,
|
22
|
+
.highlight .cm,
|
23
|
+
.highlight .cpf,
|
24
|
+
.highlight .c1,
|
25
|
+
.highlight .cs {
|
26
|
+
color: #545862;
|
27
|
+
}
|
28
|
+
|
29
|
+
.highlight .cp {
|
30
|
+
color: #e5c07b;
|
31
|
+
}
|
32
|
+
|
33
|
+
.highlight .nt {
|
34
|
+
color: #e5c07b;
|
35
|
+
}
|
36
|
+
|
37
|
+
.highlight .o,
|
38
|
+
.highlight .ow {
|
39
|
+
color: #abb2bf;
|
40
|
+
}
|
41
|
+
|
42
|
+
.highlight .p,
|
43
|
+
.highlight .pi {
|
44
|
+
color: #abb2bf;
|
45
|
+
}
|
46
|
+
|
47
|
+
.highlight .gi {
|
48
|
+
color: #98c379;
|
49
|
+
}
|
50
|
+
|
51
|
+
.highlight .gd {
|
52
|
+
color: #e06c75;
|
53
|
+
}
|
54
|
+
|
55
|
+
.highlight .gh {
|
56
|
+
color: #61afef;
|
57
|
+
background-color: #282c34;
|
58
|
+
font-weight: bold;
|
59
|
+
}
|
60
|
+
|
61
|
+
.highlight .k,
|
62
|
+
.highlight .kn,
|
63
|
+
.highlight .kp,
|
64
|
+
.highlight .kr,
|
65
|
+
.highlight .kv {
|
66
|
+
color: #c678dd;
|
67
|
+
}
|
68
|
+
|
69
|
+
.highlight .kc {
|
70
|
+
color: #d19a66;
|
71
|
+
}
|
72
|
+
|
73
|
+
.highlight .kt {
|
74
|
+
color: #d19a66;
|
75
|
+
}
|
76
|
+
|
77
|
+
.highlight .kd {
|
78
|
+
color: #d19a66;
|
79
|
+
}
|
80
|
+
|
81
|
+
.highlight .s,
|
82
|
+
.highlight .sb,
|
83
|
+
.highlight .sc,
|
84
|
+
.highlight .dl,
|
85
|
+
.highlight .sd,
|
86
|
+
.highlight .s2,
|
87
|
+
.highlight .sh,
|
88
|
+
.highlight .sx,
|
89
|
+
.highlight .s1 {
|
90
|
+
color: #98c379;
|
91
|
+
}
|
92
|
+
|
93
|
+
.highlight .sa {
|
94
|
+
color: #c678dd;
|
95
|
+
}
|
96
|
+
|
97
|
+
.highlight .sr {
|
98
|
+
color: #56b6c2;
|
99
|
+
}
|
100
|
+
|
101
|
+
.highlight .si {
|
102
|
+
color: #be5046;
|
103
|
+
}
|
104
|
+
|
105
|
+
.highlight .se {
|
106
|
+
color: #be5046;
|
107
|
+
}
|
108
|
+
|
109
|
+
.highlight .nn {
|
110
|
+
color: #e5c07b;
|
111
|
+
}
|
112
|
+
|
113
|
+
.highlight .nc {
|
114
|
+
color: #e5c07b;
|
115
|
+
}
|
116
|
+
|
117
|
+
.highlight .no {
|
118
|
+
color: #e5c07b;
|
119
|
+
}
|
120
|
+
|
121
|
+
.highlight .na {
|
122
|
+
color: #61afef;
|
123
|
+
}
|
124
|
+
|
125
|
+
.highlight .m,
|
126
|
+
.highlight .mb,
|
127
|
+
.highlight .mf,
|
128
|
+
.highlight .mh,
|
129
|
+
.highlight .mi,
|
130
|
+
.highlight .il,
|
131
|
+
.highlight .mo,
|
132
|
+
.highlight .mx {
|
133
|
+
color: #98c379;
|
134
|
+
}
|
135
|
+
|
136
|
+
.highlight .ss {
|
137
|
+
color: #98c379;
|
138
|
+
}
|
139
|
+
|
140
|
+
.highlight .nf {
|
141
|
+
color: #61afef;
|
142
|
+
}
|
143
|
+
|
144
|
+
.highlight .err {
|
145
|
+
color: #353b45;
|
146
|
+
background-color: #e06c75;
|
147
|
+
}
|
148
|
+
|
149
|
+
.highlight .c1 {
|
150
|
+
color: #969DA8;
|
151
|
+
}
|
@@ -0,0 +1,103 @@
|
|
1
|
+
// This is a custom plugin for Tailwind CSS to enable font-variation-settings
|
2
|
+
import plugin from "tailwindcss/plugin";
|
3
|
+
|
4
|
+
const fontVariationSettings = plugin(function ({ addUtilities }) {
|
5
|
+
addUtilities({
|
6
|
+
".font-thin": {
|
7
|
+
fontWeight: 100,
|
8
|
+
fontVariationSettings: '"wght" 100',
|
9
|
+
"&.italic": {
|
10
|
+
fontVariationSettings: '"slnt" -10, "wght" 100',
|
11
|
+
},
|
12
|
+
},
|
13
|
+
});
|
14
|
+
|
15
|
+
addUtilities({
|
16
|
+
".font-extralight": {
|
17
|
+
fontWeight: 200,
|
18
|
+
fontVariationSettings: '"wght" 200',
|
19
|
+
"&.italic": {
|
20
|
+
fontVariationSettings: '"slnt" -10, "wght" 200',
|
21
|
+
},
|
22
|
+
},
|
23
|
+
});
|
24
|
+
|
25
|
+
addUtilities({
|
26
|
+
".font-light": {
|
27
|
+
fontWeight: 300,
|
28
|
+
fontVariationSettings: '"wght" 300',
|
29
|
+
"&.italic": {
|
30
|
+
fontVariationSettings: '"slnt" -10, "wght" 300',
|
31
|
+
},
|
32
|
+
},
|
33
|
+
});
|
34
|
+
|
35
|
+
addUtilities({
|
36
|
+
".font-normal": {
|
37
|
+
fontWeight: 400,
|
38
|
+
fontVariationSettings: '"wght" 400',
|
39
|
+
"&.italic": {
|
40
|
+
fontVariationSettings: '"slnt" -10, "wght" 400',
|
41
|
+
},
|
42
|
+
},
|
43
|
+
});
|
44
|
+
|
45
|
+
addUtilities({
|
46
|
+
".font-medium": {
|
47
|
+
fontWeight: 500,
|
48
|
+
fontVariationSettings: '"wght" 500',
|
49
|
+
"&.italic": {
|
50
|
+
fontVariationSettings: '"slnt" -10, "wght" 500',
|
51
|
+
},
|
52
|
+
},
|
53
|
+
});
|
54
|
+
|
55
|
+
addUtilities({
|
56
|
+
".font-semibold": {
|
57
|
+
fontWeight: 600,
|
58
|
+
fontVariationSettings: '"wght" 600',
|
59
|
+
"&.italic": {
|
60
|
+
fontVariationSettings: '"slnt" -10, "wght" 600',
|
61
|
+
},
|
62
|
+
},
|
63
|
+
});
|
64
|
+
|
65
|
+
addUtilities({
|
66
|
+
".font-bold": {
|
67
|
+
fontWeight: 700,
|
68
|
+
fontVariationSettings: '"wght" 700',
|
69
|
+
"&.italic": {
|
70
|
+
fontVariationSettings: '"slnt" -10, "wght" 700',
|
71
|
+
},
|
72
|
+
},
|
73
|
+
});
|
74
|
+
|
75
|
+
addUtilities({
|
76
|
+
".font-extrabold": {
|
77
|
+
fontWeight: 800,
|
78
|
+
fontVariationSettings: '"wght" 800',
|
79
|
+
"&.italic": {
|
80
|
+
fontVariationSettings: '"slnt" -10, "wght" 800',
|
81
|
+
},
|
82
|
+
},
|
83
|
+
});
|
84
|
+
|
85
|
+
addUtilities({
|
86
|
+
".font-black": {
|
87
|
+
fontWeight: 900,
|
88
|
+
fontVariationSettings: '"wght" 900',
|
89
|
+
"&.italic": {
|
90
|
+
fontVariationSettings: '"slnt" -10, "wght" 900',
|
91
|
+
},
|
92
|
+
},
|
93
|
+
});
|
94
|
+
|
95
|
+
addUtilities({
|
96
|
+
".italic": {
|
97
|
+
fontStyle: "italic",
|
98
|
+
fontVariationSettings: '"slnt" -10',
|
99
|
+
},
|
100
|
+
});
|
101
|
+
});
|
102
|
+
|
103
|
+
export default fontVariationSettings;
|
@@ -0,0 +1,54 @@
|
|
1
|
+
document.addEventListener("turbo:visit", () => {
|
2
|
+
let main = document.querySelector("main");
|
3
|
+
if (main.dataset.turboTransition == "false") return;
|
4
|
+
|
5
|
+
let [movement, scale] = ["15px", "0.99"];
|
6
|
+
|
7
|
+
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
|
8
|
+
[movement, scale] = ["7px", "1"];
|
9
|
+
}
|
10
|
+
|
11
|
+
main.style.transformOrigin = "50% 0%";
|
12
|
+
main.dataset.animatingOut = true;
|
13
|
+
|
14
|
+
main.animate(
|
15
|
+
[
|
16
|
+
{ opacity: 1, transform: "translateY(0px) scale(1)" },
|
17
|
+
{ opacity: 0, transform: `translateY(${movement}) scale(${scale})` },
|
18
|
+
],
|
19
|
+
{
|
20
|
+
duration: 300,
|
21
|
+
easing: "cubic-bezier(0.45, 0, 0.55, 1)",
|
22
|
+
fill: "forwards",
|
23
|
+
},
|
24
|
+
);
|
25
|
+
|
26
|
+
Promise.all(main.getAnimations().map((animation) => animation.finished)).then(
|
27
|
+
() => {
|
28
|
+
if (main.dataset.animatingOut) main.style.visibility = "hidden";
|
29
|
+
},
|
30
|
+
);
|
31
|
+
});
|
32
|
+
|
33
|
+
document.addEventListener("turbo:load", () => {
|
34
|
+
let main = document.querySelector("main");
|
35
|
+
if (main.dataset.turboTransition == "false") return;
|
36
|
+
|
37
|
+
let [movement, scale] = ["-10px", "0.99"];
|
38
|
+
|
39
|
+
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
|
40
|
+
[movement, scale] = ["-5px", "1"];
|
41
|
+
}
|
42
|
+
|
43
|
+
main.style.visibility = "visible";
|
44
|
+
main.style.transformOrigin = "50% 0%";
|
45
|
+
delete main.dataset.animatingOut;
|
46
|
+
|
47
|
+
main.animate(
|
48
|
+
[
|
49
|
+
{ opacity: 0, transform: `translateY(${movement}) scale(${scale})` },
|
50
|
+
{ opacity: 1, transform: "translateY(0px) scale(1)" },
|
51
|
+
],
|
52
|
+
{ duration: 150, easing: "cubic-bezier(0.45, 0, 0.55, 1)" },
|
53
|
+
);
|
54
|
+
});
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "staticky/phlex/view_helpers"
|
4
|
+
|
5
|
+
class Component < Protos::Component
|
6
|
+
include ViteHelpers
|
7
|
+
|
8
|
+
class NullViewContext
|
9
|
+
def root? = true
|
10
|
+
def current_path = "/"
|
11
|
+
end
|
12
|
+
|
13
|
+
def helpers
|
14
|
+
@_view_context ||= NullViewContext.new # rubocop:disable Naming/MemoizedInstanceVariableName
|
15
|
+
end
|
16
|
+
|
17
|
+
def asset_path(...)
|
18
|
+
vite_asset_path(...)
|
19
|
+
end
|
20
|
+
|
21
|
+
def image_tag(path, alt:, **)
|
22
|
+
img(src: asset_path(path), alt:, **)
|
23
|
+
end
|
24
|
+
|
25
|
+
def icon(...)
|
26
|
+
render Icon.new(...)
|
27
|
+
end
|
28
|
+
|
29
|
+
def inline_link(text, url)
|
30
|
+
render Protos::Typography::InlineLink.new(href: url) { text }
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Icon < Component
|
4
|
+
param :name, reader: false
|
5
|
+
option :variant, reader: false, default: -> {}
|
6
|
+
option :size, default: -> { :md }, reader: false
|
7
|
+
|
8
|
+
def template
|
9
|
+
div(**attrs) do
|
10
|
+
render Protos::Icon.heroicon(@name, variant:)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def variant
|
17
|
+
@variant || {
|
18
|
+
xs: :micro,
|
19
|
+
sm: :mini,
|
20
|
+
md: :solid,
|
21
|
+
lg: :solid
|
22
|
+
}.fetch(@size)
|
23
|
+
end
|
24
|
+
|
25
|
+
def size
|
26
|
+
{
|
27
|
+
xs: "w-3 h-3",
|
28
|
+
sm: "w-4 h-4",
|
29
|
+
md: "w-5 h-5",
|
30
|
+
lg: "w-7 h-7"
|
31
|
+
}.fetch(@size)
|
32
|
+
end
|
33
|
+
|
34
|
+
def theme
|
35
|
+
{
|
36
|
+
container: tokens(size, "opacity-90", "inline-block")
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ViteHelpers
|
4
|
+
def vite_client_tag
|
5
|
+
src = vite_manifest.vite_client_src || "/vite-dev/@vite/client"
|
6
|
+
script(src:, type: :module)
|
7
|
+
end
|
8
|
+
|
9
|
+
def vite_javascript_tag(
|
10
|
+
*names,
|
11
|
+
type: :module,
|
12
|
+
asset_type: :javascript,
|
13
|
+
crossorigin: :anonymous,
|
14
|
+
**options
|
15
|
+
)
|
16
|
+
entries = vite_manifest.resolve_entries(*names, type: asset_type)
|
17
|
+
entries.fetch(:scripts).each do |src|
|
18
|
+
script(
|
19
|
+
src:,
|
20
|
+
type:,
|
21
|
+
crossorigin:,
|
22
|
+
extname: :js,
|
23
|
+
**options
|
24
|
+
)
|
25
|
+
end
|
26
|
+
entries.fetch(:stylesheets).each do |href|
|
27
|
+
link(href:, rel: :stylesheet, type: "text/css")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def vite_manifest
|
32
|
+
ViteRuby.instance.manifest
|
33
|
+
end
|
34
|
+
|
35
|
+
def vite_asset_path(name, **)
|
36
|
+
vite_manifest.path_for(name, **)
|
37
|
+
end
|
38
|
+
end
|
File without changes
|
@@ -0,0 +1,59 @@
|
|
1
|
+
worker_processes 1;
|
2
|
+
error_log stderr;
|
3
|
+
pid nginx.pid;
|
4
|
+
|
5
|
+
events {
|
6
|
+
worker_connections 768;
|
7
|
+
}
|
8
|
+
|
9
|
+
http {
|
10
|
+
types_hash_max_size 2048;
|
11
|
+
include mime.types;
|
12
|
+
charset UTF-8;
|
13
|
+
gzip on;
|
14
|
+
gzip_comp_level 6;
|
15
|
+
gzip_min_length 256;
|
16
|
+
gzip_types text/plain text/css application/json application/javascript application/xml;
|
17
|
+
gzip_proxied any;
|
18
|
+
gzip_vary on;
|
19
|
+
|
20
|
+
server {
|
21
|
+
listen 80 default_server;
|
22
|
+
listen [::]:80 default_server;
|
23
|
+
server_name _;
|
24
|
+
root /usr/share/nginx/html;
|
25
|
+
index index.html index.htm;
|
26
|
+
port_in_redirect off;
|
27
|
+
add_header X-Content-Type-Options "nosniff";
|
28
|
+
|
29
|
+
location / {
|
30
|
+
try_files $uri $uri.html =404;
|
31
|
+
expires 1h;
|
32
|
+
}
|
33
|
+
|
34
|
+
location ~* \.(?:ico|gif|jpe?g|png|svg|webp)$ {
|
35
|
+
expires 31536000s;
|
36
|
+
add_header Cache-Control "public, max-age=31536000, immutable";
|
37
|
+
}
|
38
|
+
|
39
|
+
location ~* \.(css|js)$ {
|
40
|
+
expires 31536000s;
|
41
|
+
add_header Cache-Control "public, max-age=31536000, immutable";
|
42
|
+
charset utf-8;
|
43
|
+
gzip_static on;
|
44
|
+
}
|
45
|
+
|
46
|
+
location ~* \.woff2$ {
|
47
|
+
expires 31536000s;
|
48
|
+
add_header Cache-Control "public, max-age=31536000, immutable";
|
49
|
+
types { font/woff2 woff2; }
|
50
|
+
gzip off;
|
51
|
+
add_header Vary Accept-Encoding;
|
52
|
+
}
|
53
|
+
|
54
|
+
location ~* \.webmanifest$ {
|
55
|
+
charset off;
|
56
|
+
gzip off;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
{
|
2
|
+
"name": "static-starter",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "",
|
5
|
+
"type": "module",
|
6
|
+
"scripts": {
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
8
|
+
"heroku-postbuild": "bin/rake site:build"
|
9
|
+
},
|
10
|
+
"keywords": [],
|
11
|
+
"author": "",
|
12
|
+
"license": "ISC",
|
13
|
+
"dependencies": {
|
14
|
+
"@fontsource-variable/inter": "^5.0.20",
|
15
|
+
"@hotwired/stimulus": "^3.2.2",
|
16
|
+
"@hotwired/turbo": "^8.0.5",
|
17
|
+
"@tailwindcss/typography": "^0.5.14",
|
18
|
+
"autoprefixer": "^10.4.20",
|
19
|
+
"daisyui": "^4.12.10",
|
20
|
+
"protos-stimulus": "^0.0.3",
|
21
|
+
"postcss": "^8.4.41",
|
22
|
+
"tailwindcss": "^3.4.10",
|
23
|
+
"vite": "^5.4.0",
|
24
|
+
"vite-plugin-ruby": "^5.0.0",
|
25
|
+
"vite-plugin-full-reload": "^1.2.0"
|
26
|
+
},
|
27
|
+
"optionalDependencies": {
|
28
|
+
"@rollup/rollup-linux-arm64-musl": "4.20.0"
|
29
|
+
},
|
30
|
+
"packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"
|
31
|
+
}
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
Sitemap: <%= URI.join(url, "sitemap.xml") %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"name": <%= title %>,
|
3
|
+
"short_name": <%= title %>,
|
4
|
+
"icons": [
|
5
|
+
{
|
6
|
+
"src":"/android-chrome-192x192.png",
|
7
|
+
"sizes":"192x192",
|
8
|
+
"type":"image/png"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"src":"/android-chrome-512x512.png",
|
12
|
+
"sizes":"512x512",
|
13
|
+
"type":"image/png"
|
14
|
+
}
|
15
|
+
],
|
16
|
+
"theme_color":"#61afef",
|
17
|
+
"background_color":"#1e2227",
|
18
|
+
"display":"standalone"
|
19
|
+
}
|
File without changes
|