hanami 2.3.2 → 3.0.0.rc1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +55 -19
- data/LICENSE +20 -0
- data/README.md +18 -35
- data/hanami.gemspec +36 -37
- data/lib/hanami/config/db.rb +2 -0
- data/lib/hanami/config/i18n.rb +138 -0
- data/lib/hanami/config/logger.rb +15 -7
- data/lib/hanami/config/null_config.rb +1 -1
- data/lib/hanami/config/views.rb +17 -0
- data/lib/hanami/config.rb +66 -22
- data/lib/hanami/errors.rb +6 -0
- data/lib/hanami/extensions/action/slice_configured_action.rb +1 -1
- data/lib/hanami/extensions/action.rb +2 -2
- data/lib/hanami/extensions/mailer/slice_configured_mailer.rb +120 -0
- data/lib/hanami/extensions/mailer.rb +28 -0
- data/lib/hanami/extensions/operation/slice_configured_db_operation.rb +2 -0
- data/lib/hanami/extensions/view/context.rb +26 -4
- data/lib/hanami/extensions/view/part.rb +2 -0
- data/lib/hanami/extensions/view/slice_configured_context.rb +7 -0
- data/lib/hanami/extensions/view/slice_configured_part.rb +2 -0
- data/lib/hanami/extensions/view/slice_configured_view.rb +8 -8
- data/lib/hanami/extensions/view/standard_helpers.rb +4 -0
- data/lib/hanami/extensions.rb +6 -1
- data/lib/hanami/helpers/assets_helper.rb +0 -4
- data/lib/hanami/helpers/form_helper.rb +1 -1
- data/lib/hanami/helpers/i18n_helper.rb +176 -0
- data/lib/hanami/logger/rack_formatter.rb +73 -0
- data/lib/hanami/logger/sql_formatter.rb +80 -0
- data/lib/hanami/logger/sql_logger.rb +48 -0
- data/lib/hanami/middleware/render_errors.rb +2 -2
- data/lib/hanami/providers/db.rb +7 -2
- data/lib/hanami/providers/db_logging.rb +4 -7
- data/lib/hanami/providers/i18n/backend.rb +369 -0
- data/lib/hanami/providers/i18n/locale/en.yml +57 -0
- data/lib/hanami/providers/i18n.rb +114 -0
- data/lib/hanami/providers/mailers.rb +101 -0
- data/lib/hanami/routes.rb +1 -0
- data/lib/hanami/settings/composite_store.rb +53 -0
- data/lib/hanami/settings.rb +4 -4
- data/lib/hanami/slice/router.rb +15 -10
- data/lib/hanami/slice.rb +71 -11
- data/lib/hanami/slice_registrar.rb +2 -2
- data/lib/hanami/universal_logger.rb +250 -0
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami/web/rack_logger.rb +2 -80
- data/lib/hanami/web/welcome.html.erb +443 -58
- data/lib/hanami.rb +4 -2
- metadata +28 -276
- data/CODE_OF_CONDUCT.md +0 -74
- data/FEATURES.md +0 -269
- data/LICENSE.md +0 -22
- data/spec/integration/action/cookies_spec.rb +0 -58
- data/spec/integration/action/csrf_protection_spec.rb +0 -54
- data/spec/integration/action/format_config_spec.rb +0 -129
- data/spec/integration/action/routes_spec.rb +0 -71
- data/spec/integration/action/sessions_spec.rb +0 -50
- data/spec/integration/action/slice_configuration_spec.rb +0 -284
- data/spec/integration/action/view_rendering/automatic_rendering_spec.rb +0 -247
- data/spec/integration/action/view_rendering/paired_view_inference_spec.rb +0 -115
- data/spec/integration/action/view_rendering/view_context_spec.rb +0 -221
- data/spec/integration/action/view_rendering_spec.rb +0 -89
- data/spec/integration/assets/assets_spec.rb +0 -155
- data/spec/integration/assets/cross_slice_assets_helpers_spec.rb +0 -129
- data/spec/integration/assets/serve_static_assets_spec.rb +0 -152
- data/spec/integration/code_loading/loading_from_app_spec.rb +0 -152
- data/spec/integration/code_loading/loading_from_lib_spec.rb +0 -242
- data/spec/integration/code_loading/loading_from_slice_spec.rb +0 -165
- data/spec/integration/container/application_routes_helper_spec.rb +0 -48
- data/spec/integration/container/auto_injection_spec.rb +0 -53
- data/spec/integration/container/auto_registration_spec.rb +0 -86
- data/spec/integration/container/autoloader_spec.rb +0 -82
- data/spec/integration/container/imports_spec.rb +0 -253
- data/spec/integration/container/prepare_container_spec.rb +0 -125
- data/spec/integration/container/provider_environment_spec.rb +0 -52
- data/spec/integration/container/provider_lifecycle_spec.rb +0 -61
- data/spec/integration/container/shutdown_spec.rb +0 -91
- data/spec/integration/container/standard_providers/rack_provider_spec.rb +0 -44
- data/spec/integration/container/standard_providers_spec.rb +0 -124
- data/spec/integration/db/auto_registration_spec.rb +0 -39
- data/spec/integration/db/commands_spec.rb +0 -80
- data/spec/integration/db/db_inflector_spec.rb +0 -57
- data/spec/integration/db/db_slices_spec.rb +0 -398
- data/spec/integration/db/db_spec.rb +0 -245
- data/spec/integration/db/gateways_spec.rb +0 -361
- data/spec/integration/db/logging_spec.rb +0 -301
- data/spec/integration/db/mappers_spec.rb +0 -84
- data/spec/integration/db/provider_config_spec.rb +0 -88
- data/spec/integration/db/provider_spec.rb +0 -35
- data/spec/integration/db/relations_spec.rb +0 -60
- data/spec/integration/db/repo_spec.rb +0 -300
- data/spec/integration/db/slices_importing_from_parent.rb +0 -130
- data/spec/integration/dotenv_loading_spec.rb +0 -138
- data/spec/integration/logging/exception_logging_spec.rb +0 -120
- data/spec/integration/logging/notifications_spec.rb +0 -68
- data/spec/integration/logging/request_logging_spec.rb +0 -202
- data/spec/integration/operations/extension_spec.rb +0 -122
- data/spec/integration/rack_app/body_parser_spec.rb +0 -108
- data/spec/integration/rack_app/method_override_spec.rb +0 -97
- data/spec/integration/rack_app/middleware_spec.rb +0 -720
- data/spec/integration/rack_app/non_booted_rack_app_spec.rb +0 -104
- data/spec/integration/rack_app/rack_app_spec.rb +0 -442
- data/spec/integration/rake_tasks_spec.rb +0 -107
- data/spec/integration/router/resource_routes_spec.rb +0 -281
- data/spec/integration/settings/access_in_slice_class_body_spec.rb +0 -83
- data/spec/integration/settings/access_to_constants_spec.rb +0 -46
- data/spec/integration/settings/loading_from_env_spec.rb +0 -188
- data/spec/integration/settings/settings_component_loading_spec.rb +0 -113
- data/spec/integration/settings/slice_registration_spec.rb +0 -145
- data/spec/integration/settings/using_types_spec.rb +0 -80
- data/spec/integration/setup_spec.rb +0 -165
- data/spec/integration/slices/external_slice_spec.rb +0 -91
- data/spec/integration/slices/slice_configuration_spec.rb +0 -42
- data/spec/integration/slices/slice_loading_spec.rb +0 -171
- data/spec/integration/slices/slice_registrations_spec.rb +0 -80
- data/spec/integration/slices/slice_routing_spec.rb +0 -219
- data/spec/integration/slices_spec.rb +0 -471
- data/spec/integration/view/config/default_context_spec.rb +0 -149
- data/spec/integration/view/config/inflector_spec.rb +0 -57
- data/spec/integration/view/config/part_class_spec.rb +0 -147
- data/spec/integration/view/config/part_namespace_spec.rb +0 -103
- data/spec/integration/view/config/paths_spec.rb +0 -119
- data/spec/integration/view/config/scope_class_spec.rb +0 -147
- data/spec/integration/view/config/scope_namespace_spec.rb +0 -103
- data/spec/integration/view/config/template_spec.rb +0 -38
- data/spec/integration/view/context/assets_spec.rb +0 -79
- data/spec/integration/view/context/inflector_spec.rb +0 -40
- data/spec/integration/view/context/request_spec.rb +0 -57
- data/spec/integration/view/context/routes_spec.rb +0 -84
- data/spec/integration/view/helpers/form_helper_spec.rb +0 -174
- data/spec/integration/view/helpers/part_helpers_spec.rb +0 -124
- data/spec/integration/view/helpers/scope_helpers_spec.rb +0 -84
- data/spec/integration/view/helpers/user_defined_helpers/part_helpers_spec.rb +0 -162
- data/spec/integration/view/helpers/user_defined_helpers/scope_helpers_spec.rb +0 -119
- data/spec/integration/view/parts/default_rendering_spec.rb +0 -138
- data/spec/integration/view/slice_configuration_spec.rb +0 -289
- data/spec/integration/view/views_spec.rb +0 -103
- data/spec/integration/web/content_security_policy_nonce_spec.rb +0 -251
- data/spec/integration/web/render_detailed_errors_spec.rb +0 -107
- data/spec/integration/web/render_errors_spec.rb +0 -242
- data/spec/integration/web/welcome_view_spec.rb +0 -84
- data/spec/spec_helper.rb +0 -28
- data/spec/support/app_integration.rb +0 -157
- data/spec/support/coverage.rb +0 -1
- data/spec/support/matchers.rb +0 -32
- data/spec/support/rspec.rb +0 -27
- data/spec/unit/hanami/config/actions/content_security_policy_spec.rb +0 -96
- data/spec/unit/hanami/config/actions/cookies_spec.rb +0 -46
- data/spec/unit/hanami/config/actions/csrf_protection_spec.rb +0 -58
- data/spec/unit/hanami/config/actions/default_values_spec.rb +0 -43
- data/spec/unit/hanami/config/actions/sessions_spec.rb +0 -48
- data/spec/unit/hanami/config/actions_spec.rb +0 -52
- data/spec/unit/hanami/config/base_url_spec.rb +0 -25
- data/spec/unit/hanami/config/console_spec.rb +0 -22
- data/spec/unit/hanami/config/db_spec.rb +0 -38
- data/spec/unit/hanami/config/inflector_spec.rb +0 -35
- data/spec/unit/hanami/config/logger_spec.rb +0 -195
- data/spec/unit/hanami/config/render_detailed_errors_spec.rb +0 -25
- data/spec/unit/hanami/config/render_errors_spec.rb +0 -25
- data/spec/unit/hanami/config/router_spec.rb +0 -44
- data/spec/unit/hanami/config/slices_spec.rb +0 -34
- data/spec/unit/hanami/config/views_spec.rb +0 -80
- data/spec/unit/hanami/env_spec.rb +0 -37
- data/spec/unit/hanami/extensions/view/context_spec.rb +0 -59
- data/spec/unit/hanami/helpers/assets_helper/asset_url_spec.rb +0 -120
- data/spec/unit/hanami/helpers/assets_helper/audio_tag_spec.rb +0 -132
- data/spec/unit/hanami/helpers/assets_helper/favicon_tag_spec.rb +0 -87
- data/spec/unit/hanami/helpers/assets_helper/image_tag_spec.rb +0 -92
- data/spec/unit/hanami/helpers/assets_helper/javascript_tag_spec.rb +0 -143
- data/spec/unit/hanami/helpers/assets_helper/stylesheet_tag_spec.rb +0 -126
- data/spec/unit/hanami/helpers/assets_helper/video_tag_spec.rb +0 -136
- data/spec/unit/hanami/helpers/form_helper_spec.rb +0 -2857
- data/spec/unit/hanami/port_spec.rb +0 -117
- data/spec/unit/hanami/providers/db/config/default_config_spec.rb +0 -100
- data/spec/unit/hanami/providers/db/config/gateway_spec.rb +0 -73
- data/spec/unit/hanami/providers/db/config_spec.rb +0 -143
- data/spec/unit/hanami/router/errors/not_allowed_error_spec.rb +0 -27
- data/spec/unit/hanami/router/errors/not_found_error_spec.rb +0 -22
- data/spec/unit/hanami/settings/env_store_spec.rb +0 -52
- data/spec/unit/hanami/settings_spec.rb +0 -111
- data/spec/unit/hanami/slice_configurable_spec.rb +0 -141
- data/spec/unit/hanami/slice_name_spec.rb +0 -47
- data/spec/unit/hanami/slice_spec.rb +0 -99
- data/spec/unit/hanami/web/rack_logger_spec.rb +0 -99
|
@@ -7,22 +7,19 @@
|
|
|
7
7
|
<title>Hanami</title>
|
|
8
8
|
<style>
|
|
9
9
|
:root {
|
|
10
|
-
--max-width:
|
|
10
|
+
--max-width: 840px;
|
|
11
|
+
--color-primary: oklch(71.93% 0.18 10.67);
|
|
12
|
+
--box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.1) 0px 4px 6px -4px;
|
|
11
13
|
--foreground-rgb: 0, 0, 0;
|
|
12
14
|
--background-rgb: 255, 255, 255;
|
|
13
|
-
--card-border-rgb: 200, 200, 200;
|
|
14
|
-
--card-background-rgb: 100, 100, 100;
|
|
15
15
|
--font-sans: ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;
|
|
16
|
-
--gradient: radial-gradient(circle at 50% 125%, rgba(255,202,212,1) 0%, rgba(255,202,212,0) 40%);
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
@media (prefers-color-scheme: dark) {
|
|
20
19
|
:root {
|
|
21
20
|
--foreground-rgb: 255, 255, 255;
|
|
22
21
|
--background-rgb: 0, 0, 0;
|
|
23
|
-
--
|
|
24
|
-
--card-background-rgb: 100, 100, 100;
|
|
25
|
-
--gradient: radial-gradient(circle at 50% 125%, rgba(255,73,108,0.75) 0%, rgba(255,73,108,0) 40%);
|
|
22
|
+
--box-shadow: rgba(255, 255, 255, 0) 0px 0px 0px 0px, rgba(255, 255, 255, 0) 0px 0px 0px 0px, rgba(255, 255, 255, 0) 0px 0px 0px 0px, rgba(255, 255, 255, 0) 0px 0px 0px 0px, rgba(255, 255, 255, 0.1) 0px 10px 15px -3px, rgba(255, 255, 255, 0.1) 0px 4px 6px -4px;
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
25
|
|
|
@@ -41,7 +38,7 @@
|
|
|
41
38
|
|
|
42
39
|
body {
|
|
43
40
|
color: rgb(var(--foreground-rgb));
|
|
44
|
-
background:
|
|
41
|
+
background: rgb(var(--background-rgb));
|
|
45
42
|
font-family: var(--font-sans);
|
|
46
43
|
font-style: normal;
|
|
47
44
|
}
|
|
@@ -59,12 +56,19 @@
|
|
|
59
56
|
color: rgb(var(--foreground-rgb));
|
|
60
57
|
}
|
|
61
58
|
|
|
59
|
+
.intro {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
flex-grow: 3;
|
|
63
|
+
justify-content: center;
|
|
64
|
+
align-items: center;
|
|
65
|
+
}
|
|
66
|
+
|
|
62
67
|
.welcome {
|
|
63
68
|
display: flex;
|
|
64
69
|
flex-direction: column;
|
|
65
70
|
gap: 2vh;
|
|
66
71
|
justify-content: center;
|
|
67
|
-
flex-grow: 3;
|
|
68
72
|
align-items: center;
|
|
69
73
|
text-align: center;
|
|
70
74
|
position: relative;
|
|
@@ -73,45 +77,79 @@
|
|
|
73
77
|
|
|
74
78
|
.welcome .logo {
|
|
75
79
|
display: block;
|
|
76
|
-
width:
|
|
77
|
-
height:
|
|
80
|
+
width: 160px;
|
|
81
|
+
height: auto;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.welcome h1 {
|
|
85
|
+
font-size: 3rem;
|
|
86
|
+
font-weight: 900;
|
|
87
|
+
letter-spacing: -0.025em;
|
|
88
|
+
line-height: 1.1;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.welcome h1 strong {
|
|
92
|
+
color: var(--color-primary);
|
|
93
|
+
display: block;
|
|
78
94
|
}
|
|
79
95
|
|
|
96
|
+
.hero {
|
|
97
|
+
position: absolute;
|
|
98
|
+
top: 50%;
|
|
99
|
+
left: 50%;
|
|
100
|
+
transform: translate(-50%, -60%);
|
|
101
|
+
width: max(100vw, 1200px);
|
|
102
|
+
z-index: 0;
|
|
103
|
+
pointer-events: none;
|
|
104
|
+
line-height: 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.hero svg {
|
|
108
|
+
display: block;
|
|
109
|
+
width: 100%;
|
|
110
|
+
height: auto;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.welcome .logo,
|
|
80
114
|
.welcome h1 {
|
|
81
|
-
|
|
82
|
-
|
|
115
|
+
position: relative;
|
|
116
|
+
z-index: 1;
|
|
83
117
|
}
|
|
84
118
|
|
|
85
119
|
.grid {
|
|
86
120
|
display: grid;
|
|
87
121
|
grid-template-columns: repeat(3, 1fr);
|
|
88
|
-
|
|
89
|
-
max-width:
|
|
122
|
+
gap: 1rem;
|
|
123
|
+
max-width: var(--max-width);
|
|
90
124
|
margin-bottom: 8vh;
|
|
91
|
-
width:
|
|
125
|
+
width: 100%;
|
|
92
126
|
}
|
|
93
127
|
|
|
94
128
|
.card {
|
|
95
|
-
|
|
96
|
-
border-radius:
|
|
97
|
-
border:
|
|
98
|
-
|
|
99
|
-
|
|
129
|
+
background: rgb(var(--background-rgb));
|
|
130
|
+
border-radius: 1rem;
|
|
131
|
+
border: 3px solid var(--color-primary);
|
|
132
|
+
box-shadow: var(--box-shadow);
|
|
133
|
+
padding: 1.4rem;
|
|
134
|
+
transition: transform 200ms;
|
|
100
135
|
}
|
|
101
136
|
|
|
102
137
|
.card:hover {
|
|
103
|
-
|
|
138
|
+
transform: translateY(-4px);
|
|
104
139
|
}
|
|
105
140
|
|
|
106
141
|
.card h2 {
|
|
107
|
-
font-size: 1.
|
|
108
|
-
font-weight:
|
|
109
|
-
|
|
142
|
+
font-size: 1.4rem;
|
|
143
|
+
font-weight: 900;
|
|
144
|
+
letter-spacing: -0.025em;
|
|
145
|
+
margin-bottom: 0.4rem;
|
|
110
146
|
}
|
|
111
147
|
|
|
112
148
|
.card p {
|
|
113
|
-
|
|
149
|
+
font-size: 1.2rem;
|
|
114
150
|
opacity: 0.6;
|
|
151
|
+
line-height: 1.4;
|
|
152
|
+
text-wrap: pretty;
|
|
115
153
|
}
|
|
116
154
|
|
|
117
155
|
.meta {
|
|
@@ -121,22 +159,12 @@
|
|
|
121
159
|
|
|
122
160
|
/* Mobile */
|
|
123
161
|
@media (max-width: 700px) {
|
|
124
|
-
|
|
125
162
|
.welcome {
|
|
126
163
|
justify-content: top;
|
|
127
164
|
flex-grow: 0;
|
|
128
165
|
margin-bottom: 4rem;
|
|
129
166
|
}
|
|
130
167
|
|
|
131
|
-
.welcome .logo {
|
|
132
|
-
width: 90px;
|
|
133
|
-
height: 90px;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
.welcome h1 {
|
|
137
|
-
font-size: 2rem;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
168
|
.grid {
|
|
141
169
|
grid-template-columns: 1fr;
|
|
142
170
|
row-gap: 20px;
|
|
@@ -155,17 +183,192 @@
|
|
|
155
183
|
}
|
|
156
184
|
}
|
|
157
185
|
|
|
186
|
+
@media (min-width: 1024px) {
|
|
187
|
+
.welcome h1 {
|
|
188
|
+
font-size: 4.5rem;
|
|
189
|
+
line-height: 1;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.hero {
|
|
193
|
+
width: max(100vw, 1728px);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
158
197
|
@media (prefers-color-scheme: dark) {
|
|
159
198
|
html {
|
|
160
199
|
color-scheme: dark;
|
|
161
200
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* Animated Hanami logo */
|
|
204
|
+
.anim-logo {
|
|
205
|
+
--speed: 1;
|
|
206
|
+
--amp-base: 0.8;
|
|
207
|
+
--amp: var(--amp-base);
|
|
208
|
+
--wiggle-dur: calc(0.32s / var(--speed));
|
|
209
|
+
--burst-dur: calc(0.9s / var(--speed));
|
|
210
|
+
overflow: visible;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
@keyframes anim-logo-bob {
|
|
214
|
+
0%, 100% { transform: translateY(0); }
|
|
215
|
+
50% { transform: translateY(calc(-4px * var(--amp))); }
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
@keyframes anim-logo-wiggle {
|
|
219
|
+
0% { transform: rotate(0); }
|
|
220
|
+
25% { transform: rotate(calc(-4deg * var(--amp))); }
|
|
221
|
+
50% { transform: rotate(calc(4deg * var(--amp))); }
|
|
222
|
+
75% { transform: rotate(calc(-3deg * var(--amp))); }
|
|
223
|
+
100% { transform: rotate(0); }
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@keyframes anim-logo-happy-bounce {
|
|
227
|
+
0%, 100% { transform: translateY(0) scale(1, 1); }
|
|
228
|
+
20% { transform: translateY(calc(-20px * var(--amp))) scale(calc(1 + 0.08 * var(--amp)), calc(1 - 0.08 * var(--amp))); }
|
|
229
|
+
45% { transform: translateY(calc(6px * var(--amp))) scale(calc(1 - 0.08 * var(--amp)), calc(1 + 0.08 * var(--amp))); }
|
|
230
|
+
70% { transform: translateY(calc(-6px * var(--amp))) scale(1.02, 0.98); }
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
@keyframes anim-logo-sparkle {
|
|
234
|
+
0% { opacity: 0; transform: scale(0.2); }
|
|
235
|
+
30% { opacity: 1; transform: scale(calc(1 * var(--amp))); }
|
|
236
|
+
100% { opacity: 0; transform: scale(0.2) translate(var(--dx, 0), var(--dy, 0)); }
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.anim-logo .petals,
|
|
240
|
+
.anim-logo .face {
|
|
241
|
+
transform-origin: 100.5px 97px;
|
|
242
|
+
transform-box: view-box;
|
|
243
|
+
animation: anim-logo-bob calc(2.2s / var(--speed)) ease-in-out infinite;
|
|
244
|
+
}
|
|
245
|
+
.anim-logo .petals-inner,
|
|
246
|
+
.anim-logo .face-inner {
|
|
247
|
+
transform-origin: 100.5px 97px;
|
|
248
|
+
transform-box: view-box;
|
|
249
|
+
}
|
|
250
|
+
.anim-logo .sparkle {
|
|
251
|
+
transform-origin: center;
|
|
252
|
+
transform-box: fill-box;
|
|
253
|
+
opacity: 0;
|
|
254
|
+
}
|
|
255
|
+
.anim-logo .valley-dots circle {
|
|
256
|
+
transform-origin: center;
|
|
257
|
+
transform-box: fill-box;
|
|
258
|
+
opacity: 0;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* Hover plays the celebratory burst */
|
|
262
|
+
.anim-logo:hover .petals-inner,
|
|
263
|
+
.anim-logo:hover .face-inner {
|
|
264
|
+
animation:
|
|
265
|
+
anim-logo-wiggle var(--wiggle-dur) ease-in-out 1,
|
|
266
|
+
anim-logo-happy-bounce var(--burst-dur) cubic-bezier(0.2, 0.9, 0.3, 1.3) var(--wiggle-dur) 1;
|
|
267
|
+
}
|
|
268
|
+
.anim-logo:hover .valley-dots circle {
|
|
269
|
+
animation: anim-logo-sparkle var(--burst-dur) ease-out var(--wiggle-dur) 1;
|
|
270
|
+
}
|
|
271
|
+
.anim-logo:hover .valley-dots circle:nth-child(2) { animation-delay: calc(var(--wiggle-dur) + 0.05s); }
|
|
272
|
+
.anim-logo:hover .valley-dots circle:nth-child(3) { animation-delay: calc(var(--wiggle-dur) + 0.1s); }
|
|
273
|
+
.anim-logo:hover .valley-dots circle:nth-child(4) { animation-delay: calc(var(--wiggle-dur) + 0.15s); }
|
|
274
|
+
.anim-logo:hover .valley-dots circle:nth-child(5) { animation-delay: calc(var(--wiggle-dur) + 0.2s); }
|
|
275
|
+
.anim-logo:hover .sparkle {
|
|
276
|
+
animation: anim-logo-sparkle var(--burst-dur) ease-out var(--wiggle-dur) 1;
|
|
277
|
+
}
|
|
278
|
+
.anim-logo:hover .sparkle.s2 { animation-delay: calc(var(--wiggle-dur) + 0.06s); }
|
|
279
|
+
.anim-logo:hover .sparkle.s3 { animation-delay: calc(var(--wiggle-dur) + 0.12s); }
|
|
280
|
+
.anim-logo:hover .sparkle.s4 { animation-delay: calc(var(--wiggle-dur) + 0.18s); }
|
|
281
|
+
|
|
282
|
+
/*
|
|
283
|
+
* Hero illustration
|
|
284
|
+
*/
|
|
285
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
286
|
+
.squiggle-branch,
|
|
287
|
+
.squiggle-star {
|
|
288
|
+
transform-box: fill-box;
|
|
289
|
+
transform-origin: center;
|
|
165
290
|
}
|
|
166
291
|
|
|
167
|
-
.
|
|
168
|
-
|
|
292
|
+
.squiggle-branch { animation: squiggle-leaf-1 1.2s step-end infinite; }
|
|
293
|
+
.squiggle-branch:nth-of-type(2n) { animation-name: squiggle-leaf-2; animation-duration: 1.05s; }
|
|
294
|
+
.squiggle-branch:nth-of-type(3n) { animation-name: squiggle-leaf-3; animation-duration: 1.35s; }
|
|
295
|
+
.squiggle-branch:nth-of-type(4n + 1) { animation-name: squiggle-leaf-4; animation-duration: 1.275s; }
|
|
296
|
+
.squiggle-branch:nth-of-type(5n + 2) { animation-delay: -0.45s; }
|
|
297
|
+
.squiggle-branch:nth-of-type(7n + 3) { animation-delay: -0.75s; }
|
|
298
|
+
|
|
299
|
+
.squiggle-star { animation: squiggle-star-1 1.2s step-end infinite; }
|
|
300
|
+
.squiggle-star:nth-of-type(2n) { animation-name: squiggle-star-2; animation-duration: 1.05s; }
|
|
301
|
+
.squiggle-star:nth-of-type(3n) { animation-name: squiggle-star-3; animation-duration: 1.35s; }
|
|
302
|
+
.squiggle-star:nth-of-type(4n + 1) { animation-name: squiggle-star-4; animation-duration: 1.125s; }
|
|
303
|
+
.squiggle-star:nth-of-type(5n + 2) { animation-delay: -0.6s; }
|
|
304
|
+
.squiggle-star:nth-of-type(7n + 3) { animation-delay: -0.3s; }
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/* The boil is fussy at small sizes, so hold still on phones */
|
|
308
|
+
@media (max-width: 640px) {
|
|
309
|
+
.squiggle-branch,
|
|
310
|
+
.squiggle-star { animation: none; }
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
@keyframes squiggle-leaf-1 {
|
|
314
|
+
0% { transform: translate(0.1px, -0.12px) rotate(0.1deg) scale(1.005, 0.995) skew(0.1deg, -0.05deg); }
|
|
315
|
+
25% { transform: translate(-0.12px, 0.15px) rotate(-0.08deg) scale(0.995, 1.005) skew(-0.08deg, 0.1deg); }
|
|
316
|
+
50% { transform: translate(0.15px, 0.1px) rotate(0.08deg) scale(1.002, 1.002) skew(0.08deg, -0.08deg); }
|
|
317
|
+
75% { transform: translate(-0.1px, -0.12px) rotate(-0.1deg) scale(0.998, 1.005) skew(-0.1deg, 0.05deg); }
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
@keyframes squiggle-leaf-2 {
|
|
321
|
+
0% { transform: translate(-0.08px, 0.08px) rotate(-0.08deg) skew(-0.2deg, 0.15deg); }
|
|
322
|
+
25% { transform: translate(0.08px, -0.08px) rotate(0.08deg) skew(0.15deg, -0.2deg); }
|
|
323
|
+
50% { transform: translate(-0.05px, -0.08px) rotate(-0.05deg) skew(-0.15deg, 0.2deg); }
|
|
324
|
+
75% { transform: translate(0.08px, 0.08px) rotate(0.05deg) skew(0.2deg, -0.15deg); }
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
@keyframes squiggle-leaf-3 {
|
|
328
|
+
0% { transform: translate(0.12px, 0.1px) rotate(-0.08deg) scale(0.995, 1.005) skew(0.08deg, 0.08deg); }
|
|
329
|
+
33% { transform: translate(-0.1px, -0.12px) rotate(0.1deg) scale(1.005, 0.998) skew(-0.1deg, -0.05deg); }
|
|
330
|
+
66% { transform: translate(0.12px, -0.1px) rotate(-0.1deg) scale(0.998, 1.005) skew(0.1deg, -0.1deg); }
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
@keyframes squiggle-leaf-4 {
|
|
334
|
+
0% { transform: translate(-0.1px, 0.12px) rotate(0.1deg) scale(1.002, 0.995) skew(-0.08deg, 0.1deg); }
|
|
335
|
+
20% { transform: translate(0.12px, -0.1px) rotate(-0.08deg) scale(0.998, 1.005) skew(0.1deg, -0.08deg); }
|
|
336
|
+
50% { transform: translate(-0.12px, 0.1px) rotate(0.08deg) scale(1.005, 0.998) skew(-0.1deg, 0.05deg); }
|
|
337
|
+
80% { transform: translate(0.08px, 0.12px) rotate(-0.1deg) scale(0.995, 1.005) skew(0.08deg, -0.1deg); }
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
@keyframes squiggle-star-1 {
|
|
341
|
+
0% { transform: translate(0.3px, -0.25px) rotate(0.35deg) scale(1.025, 0.99) skew(0.3deg, -0.2deg); }
|
|
342
|
+
25% { transform: translate(-0.25px, 0.3px) rotate(-0.3deg) scale(0.985, 1.025) skew(-0.25deg, 0.3deg); }
|
|
343
|
+
50% { transform: translate(0.3px, 0.25px) rotate(0.3deg) scale(1.015, 1.015) skew(0.2deg, -0.25deg); }
|
|
344
|
+
75% { transform: translate(-0.3px, -0.25px) rotate(-0.35deg) scale(0.99, 1.02) skew(-0.3deg, 0.2deg); }
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
@keyframes squiggle-star-2 {
|
|
348
|
+
0% { transform: translate(-0.3px, 0.25px) rotate(-0.35deg) scale(1.02, 1.03) skew(-0.3deg, 0.25deg); }
|
|
349
|
+
25% { transform: translate(0.25px, -0.3px) rotate(0.35deg) scale(0.985, 0.98) skew(0.25deg, -0.3deg); }
|
|
350
|
+
50% { transform: translate(-0.25px, -0.25px) rotate(-0.3deg) scale(1.03, 1.015) skew(-0.2deg, 0.3deg); }
|
|
351
|
+
75% { transform: translate(0.3px, 0.25px) rotate(0.3deg) scale(0.98, 0.99) skew(0.3deg, -0.25deg); }
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
@keyframes squiggle-star-3 {
|
|
355
|
+
0% { transform: translate(0.25px, 0.3px) rotate(-0.35deg) scale(0.99, 1.025) skew(0.3deg, 0.25deg); }
|
|
356
|
+
33% { transform: translate(-0.3px, -0.25px) rotate(0.3deg) scale(1.025, 0.985) skew(-0.25deg, -0.2deg); }
|
|
357
|
+
66% { transform: translate(0.3px, -0.3px) rotate(-0.35deg) scale(0.995, 1.025) skew(0.3deg, -0.3deg); }
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
@keyframes squiggle-star-4 {
|
|
361
|
+
0% { transform: translate(-0.25px, 0.3px) rotate(0.35deg) scale(1.025, 0.99) skew(-0.2deg, 0.3deg); }
|
|
362
|
+
20% { transform: translate(0.3px, -0.25px) rotate(-0.3deg) scale(0.985, 1.025) skew(0.3deg, -0.25deg); }
|
|
363
|
+
50% { transform: translate(-0.3px, 0.25px) rotate(0.3deg) scale(1.03, 0.99) skew(-0.3deg, 0.2deg); }
|
|
364
|
+
80% { transform: translate(0.25px, 0.3px) rotate(-0.35deg) scale(0.99, 1.03) skew(0.25deg, -0.3deg); }
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
@media (prefers-reduced-motion: reduce) {
|
|
368
|
+
.anim-logo,
|
|
369
|
+
.anim-logo *,
|
|
370
|
+
.anim-logo:hover * {
|
|
371
|
+
animation: none !important;
|
|
169
372
|
}
|
|
170
373
|
}
|
|
171
374
|
|
|
@@ -173,23 +376,205 @@
|
|
|
173
376
|
</head>
|
|
174
377
|
<body>
|
|
175
378
|
<main>
|
|
176
|
-
<div class="
|
|
177
|
-
<
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
379
|
+
<div class="intro">
|
|
380
|
+
<div class="welcome">
|
|
381
|
+
<div class="hero" aria-hidden="true">
|
|
382
|
+
<svg
|
|
383
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
384
|
+
viewBox="0 0 1728 385"
|
|
385
|
+
preserveAspectRatio="xMidYMid meet"
|
|
386
|
+
focusable="false"
|
|
387
|
+
>
|
|
388
|
+
<g class="squiggle-stars">
|
|
389
|
+
<g class="squiggle-star">
|
|
390
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(-1 0 0 1 1323.85 170)" fill="#FFD33B" />
|
|
391
|
+
</g>
|
|
392
|
+
<g class="squiggle-star">
|
|
393
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(4.37114e-08 1 1 -4.37114e-08 1308 179.146)" fill="#FFD33B" />
|
|
394
|
+
</g>
|
|
395
|
+
<g class="squiggle-star">
|
|
396
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(-1 0 0 1 1468.85 246)" fill="#FFD33B" />
|
|
397
|
+
</g>
|
|
398
|
+
<g class="squiggle-star">
|
|
399
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(4.37114e-08 1 1 -4.37114e-08 1453 255.146)" fill="#FFD33B" />
|
|
400
|
+
</g>
|
|
401
|
+
<g class="squiggle-star">
|
|
402
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(-1 0 0 1 1221.85 3)" fill="#FFD33B" />
|
|
403
|
+
</g>
|
|
404
|
+
<g class="squiggle-star">
|
|
405
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(4.37114e-08 1 1 -4.37114e-08 1206 12.1465)" fill="#FFD33B" />
|
|
406
|
+
</g>
|
|
407
|
+
<g class="squiggle-star">
|
|
408
|
+
<ellipse cx="4.47182" cy="16.6677" rx="4.47182" ry="16.6677" transform="matrix(-0.998872 -0.0474846 -0.0474846 0.998872 1154.12 288.425)" fill="#FFD33B" />
|
|
409
|
+
</g>
|
|
410
|
+
<g class="squiggle-star">
|
|
411
|
+
<ellipse cx="4.47182" cy="16.6677" rx="4.47182" ry="16.6677" transform="matrix(-0.0474845 0.998872 0.998872 0.0474845 1132.42 299.604)" fill="#FFD33B" />
|
|
412
|
+
</g>
|
|
413
|
+
<g class="squiggle-star">
|
|
414
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(-1 0 0 1 578.854 89)" fill="#FFD33B" />
|
|
415
|
+
</g>
|
|
416
|
+
<g class="squiggle-star">
|
|
417
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(4.37114e-08 1 1 -4.37114e-08 563 98.1465)" fill="#FFD33B" />
|
|
418
|
+
</g>
|
|
419
|
+
<g class="squiggle-star">
|
|
420
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(-1 0 0 1 177.854 233)" fill="#FFD33B" />
|
|
421
|
+
</g>
|
|
422
|
+
<g class="squiggle-star">
|
|
423
|
+
<ellipse cx="3.35366" cy="12.5" rx="3.35366" ry="12.5" transform="matrix(4.37114e-08 1 1 -4.37114e-08 162 242.146)" fill="#FFD33B" />
|
|
424
|
+
</g>
|
|
425
|
+
<g class="squiggle-star">
|
|
426
|
+
<ellipse cx="6.43902" cy="24" rx="6.43902" ry="24" transform="matrix(-1 0 0 1 501.439 202)" fill="#FFD33B" />
|
|
427
|
+
</g>
|
|
428
|
+
<g class="squiggle-star">
|
|
429
|
+
<ellipse cx="6.43902" cy="24" rx="6.43902" ry="24" transform="matrix(4.37114e-08 1 1 -4.37114e-08 471 219.562)" fill="#FFD33B" />
|
|
430
|
+
</g>
|
|
431
|
+
<g class="squiggle-star">
|
|
432
|
+
<ellipse cx="4.56098" cy="17" rx="4.56098" ry="17" transform="matrix(-1 0 0 1 1420.56 69)" fill="#FFD33B" />
|
|
433
|
+
</g>
|
|
434
|
+
<g class="squiggle-star">
|
|
435
|
+
<ellipse cx="4.56098" cy="17" rx="4.56098" ry="17" transform="matrix(4.37114e-08 1 1 -4.37114e-08 1399 81.4395)" fill="#FFD33B" />
|
|
436
|
+
</g>
|
|
437
|
+
<g class="squiggle-star">
|
|
438
|
+
<ellipse cx="2.41463" cy="9" rx="2.41463" ry="9" transform="matrix(-1 0 0 1 286.414 28)" fill="#FFD33B" />
|
|
439
|
+
</g>
|
|
440
|
+
<g class="squiggle-star">
|
|
441
|
+
<ellipse cx="2.41463" cy="9" rx="2.41463" ry="9" transform="matrix(4.37114e-08 1 1 -4.37114e-08 275 34.5854)" fill="#FFD33B" />
|
|
442
|
+
</g>
|
|
443
|
+
<g class="squiggle-star">
|
|
444
|
+
<ellipse cx="2.41463" cy="9" rx="2.41463" ry="9" transform="matrix(-1 0 0 1 669.414 13)" fill="#FFD33B" />
|
|
445
|
+
</g>
|
|
446
|
+
<g class="squiggle-star">
|
|
447
|
+
<ellipse cx="2.41463" cy="9" rx="2.41463" ry="9" transform="matrix(4.37114e-08 1 1 -4.37114e-08 658 19.5854)" fill="#FFD33B" />
|
|
448
|
+
</g>
|
|
449
|
+
</g>
|
|
450
|
+
|
|
451
|
+
<!-- Small top-right leaf -->
|
|
452
|
+
<g class="squiggle-branch">
|
|
453
|
+
<path d="M1106.48 41.8622C1102.01 38.8871 1089.99 49.0808 1084.33 57.5821C1078.67 66.0835 1073.89 81.1008 1078.36 84.0759C1082.82 87.0511 1095.42 75.978 1100.5 68.356C1105.58 60.7341 1110.94 44.8374 1106.48 41.8622Z" fill="#2AAD56" />
|
|
454
|
+
<path d="M1081.73 81.9741C1078.31 84.9585 1075.57 87.8593 1074.71 91.2775" fill="none" stroke="#2AAD56" stroke-width="4" stroke-linecap="round" />
|
|
455
|
+
</g>
|
|
456
|
+
|
|
457
|
+
<!-- Lower-left large branch -->
|
|
458
|
+
<g class="squiggle-branch">
|
|
459
|
+
<path d="M399.203 339.17C388.004 332.151 351.627 319.319 317.487 323.149" fill="none" stroke="#2AAD56" stroke-width="6.93851" stroke-linecap="round" />
|
|
460
|
+
<path d="M272.694 320.082C272.354 324.55 283.375 331.941 292.886 332.664C302.397 333.386 319.583 328.139 319.922 323.671C320.262 319.204 306.099 312.853 297.572 312.205C289.045 311.557 273.033 315.615 272.694 320.082Z" fill="#2AAD56" />
|
|
461
|
+
<path d="M320.021 286.736C316.526 288.977 315.413 300.342 320.046 308.68C324.68 317.018 337.397 327.239 341.313 325.062C345.23 322.886 343.432 309.492 339.278 302.017C335.124 294.542 323.515 284.494 320.021 286.736Z" fill="#2AAD56" />
|
|
462
|
+
<path d="M354.38 291.416C350.886 293.658 349.772 305.023 354.406 313.36C359.039 321.698 371.757 331.919 375.673 329.742C379.589 327.566 377.791 314.173 373.637 306.697C369.483 299.222 357.874 289.174 354.38 291.416Z" fill="#2AAD56" />
|
|
463
|
+
<path d="M349.863 360.207C346.617 357.618 346.676 346.199 352.14 338.381C357.605 330.563 371.304 321.701 374.977 324.268C378.649 326.835 375.486 339.973 370.587 346.982C365.687 353.992 353.109 362.796 349.863 360.207Z" fill="#2AAD56" />
|
|
464
|
+
<path d="M312.081 352.316C309.316 349.219 311.292 337.971 317.993 331.183C324.693 324.394 339.687 317.96 342.875 321.107C346.064 324.254 340.739 336.674 334.732 342.761C328.724 348.848 314.845 355.413 312.081 352.316Z" fill="#2AAD56" />
|
|
465
|
+
</g>
|
|
466
|
+
|
|
467
|
+
<!-- Upper-right large branch -->
|
|
468
|
+
<g class="squiggle-branch">
|
|
469
|
+
<path d="M1227.6 141.627C1231.76 131.12 1250.32 103.856 1275.78 89.2038" fill="none" stroke="#2AAD56" stroke-width="5.93243" stroke-linecap="round" />
|
|
470
|
+
<path d="M1305.08 64.4047C1307.58 67.3101 1303.73 77.9832 1297.54 83.2983C1291.36 88.6135 1276.86 93.7025 1274.36 90.7971C1271.87 87.8917 1278.41 76.344 1283.95 71.5787C1289.5 66.8134 1302.58 61.4993 1305.08 64.4047Z" fill="#2AAD56" />
|
|
471
|
+
<path d="M1255.59 65.4034C1259.13 65.1779 1265.66 72.4426 1266.69 80.5327C1267.72 88.6229 1264.13 102.104 1260.33 102.589C1256.53 103.073 1250.99 92.9366 1250.07 85.6834C1249.14 78.4301 1252.05 65.6289 1255.59 65.4034Z" fill="#2AAD56" />
|
|
472
|
+
<path d="M1234.29 86.0294C1237.83 85.8038 1244.36 93.0685 1245.39 101.159C1246.42 109.249 1242.84 122.73 1239.04 123.215C1235.24 123.699 1229.69 113.563 1228.77 106.309C1227.84 99.0561 1230.75 86.2549 1234.29 86.0294Z" fill="#2AAD56" />
|
|
473
|
+
<path d="M1272.24 131.129C1273.17 127.702 1267.34 119.865 1259.62 117.247C1251.9 114.629 1237.97 115.463 1236.74 119.091C1235.51 122.719 1244.35 130.168 1251.27 132.515C1258.2 134.862 1271.32 134.556 1272.24 131.129Z" fill="#2AAD56" />
|
|
474
|
+
<path d="M1294.27 106.557C1294.61 103.023 1287.55 96.2767 1279.5 94.9938C1271.44 93.711 1257.86 96.8729 1257.25 100.656C1256.65 104.439 1266.61 110.297 1273.83 111.447C1281.05 112.598 1293.94 110.091 1294.27 106.557Z" fill="#2AAD56" />
|
|
475
|
+
</g>
|
|
476
|
+
|
|
477
|
+
<!-- Left mid branch -->
|
|
478
|
+
<g class="squiggle-branch">
|
|
479
|
+
<path d="M384.652 193.586C373.718 190.736 344.4 175.629 326.761 152.142" fill="none" stroke="#2AAD56" stroke-width="5.93243" stroke-linecap="round" />
|
|
480
|
+
<path d="M298.583 126.072C301.163 123.24 312.225 125.763 318.253 131.256C324.281 136.75 331.094 150.519 328.514 153.351C325.933 156.182 313.676 151.095 308.272 146.17C302.868 141.245 296.003 128.903 298.583 126.072Z" fill="#2AAD56" />
|
|
481
|
+
<path d="M305.591 175.073C304.936 171.585 311.354 164.226 319.259 162.22C327.163 160.213 340.981 162.131 341.923 165.844C342.866 169.557 333.479 176.293 326.392 178.092C319.305 179.892 306.245 178.562 305.591 175.073Z" fill="#2AAD56" />
|
|
482
|
+
<path d="M328.653 193.706C327.999 190.217 334.416 182.859 342.321 180.852C350.226 178.845 364.043 180.763 364.986 184.476C365.929 188.189 356.541 194.925 349.454 196.725C342.367 198.524 329.308 197.195 328.653 193.706Z" fill="#2AAD56" />
|
|
483
|
+
<path d="M368.803 150.552C365.289 150.051 358.219 156.784 356.559 164.769C354.9 172.754 357.421 186.474 361.171 187.254C364.922 188.033 371.241 178.36 372.729 171.201C374.216 164.042 372.317 151.053 368.803 150.552Z" fill="#2AAD56" />
|
|
484
|
+
<path d="M341.736 131.673C338.188 131.769 332.349 139.595 332.055 147.745C331.761 155.895 336.551 168.997 340.379 169.135C344.207 169.273 348.812 158.676 349.075 151.369C349.339 144.062 345.284 131.577 341.736 131.673Z" fill="#2AAD56" />
|
|
485
|
+
</g>
|
|
486
|
+
|
|
487
|
+
<!-- Left tall stem -->
|
|
488
|
+
<g class="squiggle-branch">
|
|
489
|
+
<path d="M502.33 151.935C494.201 143.506 462.769 95.0055 470.665 56.3729" fill="none" stroke="#2AAD56" stroke-width="6.14765" stroke-linecap="round" />
|
|
490
|
+
<path d="M468.299 14.031C472.699 13.7442 479.855 24.6662 480.465 34.0325C481.076 43.3988 475.731 60.2528 471.331 60.5396C466.932 60.8264 460.833 46.8243 460.285 38.4269C459.738 30.0296 463.9 14.3178 468.299 14.031Z" fill="#2AAD56" />
|
|
491
|
+
<path d="M442.419 92.8489C443.725 89.4102 453.375 86.3708 461.45 88.8668C469.524 91.3628 480.706 100.524 479.534 104.317C478.362 108.109 466.421 108.995 459.182 106.757C451.943 104.519 441.112 96.2877 442.419 92.8489Z" fill="#2AAD56" />
|
|
492
|
+
<path d="M449.656 120.061C451.11 116.108 460.662 112.16 468.384 114.547C476.107 116.934 486.496 126.683 485.153 131.028C483.81 135.374 472.145 137.012 465.222 134.872C458.298 132.731 448.201 124.014 449.656 120.061Z" fill="#2AAD56" />
|
|
493
|
+
<path d="M513.792 102.818C510.955 100.476 501.065 102.61 495.284 108.775C489.502 114.939 484.319 128.434 487.214 131.149C490.11 133.865 500.924 128.726 506.107 123.199C511.29 117.672 516.629 105.16 513.792 102.818Z" fill="#2AAD56" />
|
|
494
|
+
<path d="M499.376 54.8426C496.67 51.6933 486.111 51.5987 479.403 56.74C472.696 61.8814 465.813 74.9116 468.541 78.4697C471.268 82.0278 483.118 79.1661 489.132 74.5566C495.146 69.9472 502.082 57.9918 499.376 54.8426Z" fill="#2AAD56" />
|
|
495
|
+
<path d="M437.3 53.6708C439.88 50.213 450.549 49.2015 457.585 53.8828C464.622 58.5642 472.227 71.3052 469.647 75.1834C467.066 79.0615 454.944 77.159 448.636 72.9619C442.327 68.7648 434.721 57.1287 437.3 53.6708Z" fill="#2AAD56" />
|
|
496
|
+
<path d="M505.358 83.3203C503.106 80.4114 492.989 80.3158 485.992 85.0562C478.995 89.7966 470.968 101.819 473.194 105.105C475.421 108.391 487.101 105.759 493.374 101.509C499.647 97.2593 507.609 86.2293 505.358 83.3203Z" fill="#2AAD56" />
|
|
497
|
+
</g>
|
|
498
|
+
|
|
499
|
+
<!-- Lower-right large branch -->
|
|
500
|
+
<g class="squiggle-branch">
|
|
501
|
+
<path d="M1281.44 307.686C1292.89 310.152 1350.67 311.302 1379.34 284.231" fill="none" stroke="#2AAD56" stroke-width="6.14765" stroke-linecap="round" />
|
|
502
|
+
<path d="M1416.58 263.924C1414.5 260.035 1401.45 259.71 1393.17 264.127C1384.88 268.544 1373.38 281.97 1375.45 285.86C1377.53 289.749 1392.64 287.553 1400.07 283.593C1407.49 279.632 1418.65 267.814 1416.58 263.924Z" fill="#2AAD56" />
|
|
503
|
+
<path d="M1363.23 327.459C1365.47 324.537 1362.96 314.734 1356.59 309.187C1350.21 303.641 1336.53 298.966 1333.93 301.961C1331.32 304.956 1336.86 315.57 1342.58 320.543C1348.3 325.516 1361 330.382 1363.23 327.459Z" fill="#2AAD56" />
|
|
504
|
+
<path d="M1336.29 335.65C1338.88 332.331 1337.21 322.132 1331.11 316.828C1325.01 311.523 1311.25 307.831 1308.26 311.263C1305.28 314.695 1310.03 325.471 1315.5 330.227C1320.97 334.983 1333.7 338.97 1336.29 335.65Z" fill="#2AAD56" />
|
|
505
|
+
<path d="M1317.14 272.058C1320.63 273.234 1324.03 282.764 1321.84 290.926C1319.64 299.089 1310.91 310.606 1307.07 309.577C1303.24 308.547 1301.91 296.648 1303.87 289.33C1305.84 282.012 1313.66 270.881 1317.14 272.058Z" fill="#2AAD56" />
|
|
506
|
+
<path d="M1365.51 259.024C1369.62 259.665 1375.26 268.588 1374.43 276.998C1373.59 285.408 1366.15 298.125 1361.69 297.682C1357.22 297.24 1353.41 285.661 1354.16 278.12C1354.91 270.58 1361.41 258.384 1365.51 259.024Z" fill="#2AAD56" />
|
|
507
|
+
<path d="M1399.23 311.161C1400.81 307.147 1396.04 297.547 1388.36 294.034C1380.67 290.521 1365.83 290.774 1363.9 295.01C1361.96 299.247 1369.97 308.546 1376.86 311.695C1383.75 314.844 1397.65 315.176 1399.23 311.161Z" fill="#2AAD56" />
|
|
508
|
+
<path d="M1338.16 268.949C1341.82 269.329 1347.23 277.877 1346.89 286.322C1346.55 294.766 1340.56 307.924 1336.6 307.764C1332.63 307.604 1328.71 296.29 1329.02 288.719C1329.32 281.148 1334.5 268.569 1338.16 268.949Z" fill="#2AAD56" />
|
|
509
|
+
</g>
|
|
510
|
+
</svg>
|
|
511
|
+
</div>
|
|
512
|
+
<svg class="logo anim-logo" viewBox="0 0 201 194" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Hanami logo">
|
|
513
|
+
<circle class="hitbox" cx="100.5" cy="97" r="100" fill="transparent" pointer-events="all" />
|
|
514
|
+
|
|
515
|
+
<g class="petals">
|
|
516
|
+
<g class="petals-inner">
|
|
517
|
+
<path
|
|
518
|
+
fill="#FF6C89"
|
|
519
|
+
fill-rule="evenodd"
|
|
520
|
+
clip-rule="evenodd"
|
|
521
|
+
d="M48.1827 120.394C43.5166 120.84 38.6883 120.362 33.9539 118.828L24.3571 115.723C5.86366 109.736 -4.2754 89.9154 1.7354 71.4882C7.74194 53.0631 27.6357 42.9638 46.1334 48.9512L55.7302 52.0564C60.4645 53.5899 64.6525 56.0303 68.1617 59.1227C66.2961 54.843 65.2588 50.1194 65.2588 45.1579V35.1053C65.2588 15.7308 81.05 0.000991821 100.495 0.000991821C119.941 0.000991821 135.728 15.7308 135.728 35.1053V45.1579C135.728 50.1194 134.695 54.843 132.825 59.1227C136.334 56.0303 140.522 53.5899 145.261 52.0564L154.857 48.9512C173.351 42.9638 193.245 53.0631 199.255 71.4882C205.266 89.9154 195.127 109.736 176.634 115.723L167.037 118.828C162.298 120.362 157.47 120.84 152.808 120.394C156.843 122.764 160.467 125.978 163.395 129.994L169.325 138.126C180.758 153.801 177.265 175.771 161.53 187.16C145.798 198.548 123.749 195.069 112.316 179.395L106.387 171.26C103.458 167.246 101.511 162.819 100.495 158.261C99.4794 162.819 97.5326 167.246 94.6041 171.26L88.6745 179.395C77.242 195.069 55.1882 198.548 39.4568 187.16C23.7254 175.771 20.2332 153.801 31.6614 138.126L37.5953 129.994C40.5196 125.978 44.1441 122.764 48.1827 120.394Z"
|
|
522
|
+
/>
|
|
523
|
+
</g>
|
|
524
|
+
</g>
|
|
525
|
+
|
|
526
|
+
<g class="face">
|
|
527
|
+
<g class="face-inner">
|
|
528
|
+
<circle cx="100.49" cy="102.192" r="45.17" fill="#FFC9C4" />
|
|
529
|
+
<path
|
|
530
|
+
fill-rule="evenodd"
|
|
531
|
+
clip-rule="evenodd"
|
|
532
|
+
d="M78.1877 101.341C78.1877 103.219 76.6564 104.745 74.7716 104.745C72.8851 104.745 71.3555 103.219 71.3555 101.341C71.3555 94.5942 76.8527 89.1157 83.6248 89.1157C90.397 89.1157 95.8958 94.5942 95.8958 101.341C95.8958 103.219 94.3646 104.745 92.4797 104.745C90.5949 104.745 89.0636 103.219 89.0636 101.341C89.0636 98.35 86.6273 95.9226 83.6248 95.9226C80.624 95.9226 78.1877 98.35 78.1877 101.341Z"
|
|
533
|
+
fill="#000"
|
|
534
|
+
/>
|
|
535
|
+
<path
|
|
536
|
+
fill-rule="evenodd"
|
|
537
|
+
clip-rule="evenodd"
|
|
538
|
+
d="M112.005 101.341C112.005 103.219 110.474 104.745 108.589 104.745C106.703 104.745 105.173 103.219 105.173 101.341C105.173 94.5942 110.67 89.1157 117.443 89.1157C124.215 89.1157 129.714 94.5942 129.714 101.341C129.714 103.219 128.182 104.745 126.297 104.745C124.413 104.745 122.881 103.219 122.881 101.341C122.881 98.35 120.445 95.9226 117.443 95.9226C114.442 95.9226 112.005 98.35 112.005 101.341Z"
|
|
539
|
+
fill="#000"
|
|
540
|
+
/>
|
|
541
|
+
</g>
|
|
542
|
+
</g>
|
|
543
|
+
|
|
544
|
+
<g class="valley-dots" fill="#FF6C89">
|
|
545
|
+
<circle cx="63" cy="58" r="4.5" />
|
|
546
|
+
<circle cx="148" cy="59" r="4.5" />
|
|
547
|
+
<circle cx="170" cy="136" r="4.5" />
|
|
548
|
+
<circle cx="106" cy="183" r="4.5" />
|
|
549
|
+
<circle cx="41" cy="137" r="4.5" />
|
|
550
|
+
</g>
|
|
551
|
+
|
|
552
|
+
<g fill="#FF6C89">
|
|
553
|
+
<circle class="sparkle s1" cx="34" cy="34" r="5" />
|
|
554
|
+
<circle class="sparkle s2" cx="167" cy="34" r="5" />
|
|
555
|
+
<circle class="sparkle s3" cx="34" cy="170" r="5" />
|
|
556
|
+
<circle class="sparkle s4" cx="167" cy="170" r="5" />
|
|
557
|
+
</g>
|
|
558
|
+
</svg>
|
|
559
|
+
<h1>
|
|
560
|
+
Welcome to
|
|
561
|
+
<strong>Hanami</strong>
|
|
562
|
+
</h1>
|
|
563
|
+
</div>
|
|
564
|
+
<div class="grid">
|
|
565
|
+
<a href="https://hanakai.org/learn/hanami" class="card">
|
|
566
|
+
<h2>Learn</h2>
|
|
567
|
+
<p>Get started with the Hanami guides</p>
|
|
568
|
+
</a>
|
|
569
|
+
<a href="https://github.com/hanami/hanami" class="card">
|
|
570
|
+
<h2>Code</h2>
|
|
571
|
+
<p>Explore the source code and contribute changes</p>
|
|
572
|
+
</a>
|
|
573
|
+
<a href="https://hanakai.org/community" class="card">
|
|
574
|
+
<h2>Community</h2>
|
|
575
|
+
<p>Ask questions and share ideas with us</p>
|
|
576
|
+
</a>
|
|
577
|
+
</div>
|
|
193
578
|
</div>
|
|
194
579
|
<p class="meta">
|
|
195
580
|
Hanami version: <%= hanami_version %> • Ruby version: <%= ruby_version %>
|
data/lib/hanami.rb
CHANGED
|
@@ -21,6 +21,8 @@ module Hanami
|
|
|
21
21
|
loader.inflector.inflect "db_logging" => "DBLogging"
|
|
22
22
|
loader.inflector.inflect "slice_configured_db_operation" => "SliceConfiguredDBOperation"
|
|
23
23
|
loader.inflector.inflect "sql_adapter" => "SQLAdapter"
|
|
24
|
+
loader.inflector.inflect "sql_logger" => "SQLLogger"
|
|
25
|
+
loader.inflector.inflect "sql_formatter" => "SQLFormatter"
|
|
24
26
|
|
|
25
27
|
gem_lib = loader.dirs.first
|
|
26
28
|
loader.ignore(
|
|
@@ -99,8 +101,8 @@ module Hanami
|
|
|
99
101
|
@_mutex.synchronize do
|
|
100
102
|
unless defined?(@_app)
|
|
101
103
|
raise AppLoadError,
|
|
102
|
-
|
|
103
|
-
|
|
104
|
+
"Hanami.app is not yet configured. " \
|
|
105
|
+
"You may need to `require \"hanami/setup\"` to load your config/app.rb file."
|
|
104
106
|
end
|
|
105
107
|
|
|
106
108
|
@_app
|