b4bb8b708b89ee1496d77dcfeda4dbb58880da6d
Gemfile
| ... | ... | @@ -0,0 +1,5 @@ |
| 1 | +source "https://rubygems.org" |
|
| 2 | + |
|
| 3 | +gem "gollum", "~> 6.1.0" |
|
| 4 | +gem "json", "~> 3.1" |
|
| 5 | +gem "sprockets", "~> 4.4" |
run-wiki.sh
| ... | ... | @@ -1,6 +1,17 @@ |
| 1 | 1 | #!/bin/bash |
| 2 | +set -euo pipefail |
|
| 3 | +cd -- "$(dirname -- "${BASH_SOURCE[0]}")" |
|
| 2 | 4 | |
| 3 | -npx tailwindcss -i theme/css/tailwind.css -o tailwind.css -c tailwind.config.js |
|
| 5 | +# Use this Ruby's Bundler, not the stale Ruby 2.7 bundle executable. |
|
| 6 | +# Resolve only this application's gems, excluding unrelated GitLab gems. |
|
| 7 | +if ! ruby -rbundler/setup -e ''; then |
|
| 8 | + echo 'Install Ruby dependencies with a Bundler matching the current Ruby.' >&2 |
|
| 9 | + exit 1 |
|
| 10 | +fi |
|
| 4 | 11 | |
| 5 | -gollum --allow-uploads=dir --template-dir=templates --h1-title --css --adapter rugged --no-edit |
|
| 12 | +# This stylesheet uses Tailwind v3; v4 no longer ships this CLI. |
|
| 13 | +npx --yes tailwindcss@3.4.17 -i theme/css/tailwind.css -o tailwind.css -c tailwind.config.js |
|
| 14 | + |
|
| 15 | +exec ruby -rbundler/setup -e 'load Gem.bin_path("gollum", "gollum")' -- \ |
|
| 16 | + --allow-uploads=dir --template-dir=templates --h1-title --css --adapter rugged --no-edit |
|
| 6 | 17 |
tailwind.css
| ... | ... | @@ -1,12 +1,119 @@ |
| 1 | 1 | *, ::before, ::after { |
| 2 | - --tw-border-opacity: 1; |
|
| 3 | - border-color: rgba(229, 231, 235, var(--tw-border-opacity)) |
|
| 2 | + --tw-border-spacing-x: 0; |
|
| 3 | + --tw-border-spacing-y: 0; |
|
| 4 | + --tw-translate-x: 0; |
|
| 5 | + --tw-translate-y: 0; |
|
| 6 | + --tw-rotate: 0; |
|
| 7 | + --tw-skew-x: 0; |
|
| 8 | + --tw-skew-y: 0; |
|
| 9 | + --tw-scale-x: 1; |
|
| 10 | + --tw-scale-y: 1; |
|
| 11 | + --tw-pan-x: ; |
|
| 12 | + --tw-pan-y: ; |
|
| 13 | + --tw-pinch-zoom: ; |
|
| 14 | + --tw-scroll-snap-strictness: proximity; |
|
| 15 | + --tw-gradient-from-position: ; |
|
| 16 | + --tw-gradient-via-position: ; |
|
| 17 | + --tw-gradient-to-position: ; |
|
| 18 | + --tw-ordinal: ; |
|
| 19 | + --tw-slashed-zero: ; |
|
| 20 | + --tw-numeric-figure: ; |
|
| 21 | + --tw-numeric-spacing: ; |
|
| 22 | + --tw-numeric-fraction: ; |
|
| 23 | + --tw-ring-inset: ; |
|
| 24 | + --tw-ring-offset-width: 0px; |
|
| 25 | + --tw-ring-offset-color: #fff; |
|
| 26 | + --tw-ring-color: rgb(59 130 246 / 0.5); |
|
| 27 | + --tw-ring-offset-shadow: 0 0 #0000; |
|
| 28 | + --tw-ring-shadow: 0 0 #0000; |
|
| 29 | + --tw-shadow: 0 0 #0000; |
|
| 30 | + --tw-shadow-colored: 0 0 #0000; |
|
| 31 | + --tw-blur: ; |
|
| 32 | + --tw-brightness: ; |
|
| 33 | + --tw-contrast: ; |
|
| 34 | + --tw-grayscale: ; |
|
| 35 | + --tw-hue-rotate: ; |
|
| 36 | + --tw-invert: ; |
|
| 37 | + --tw-saturate: ; |
|
| 38 | + --tw-sepia: ; |
|
| 39 | + --tw-drop-shadow: ; |
|
| 40 | + --tw-backdrop-blur: ; |
|
| 41 | + --tw-backdrop-brightness: ; |
|
| 42 | + --tw-backdrop-contrast: ; |
|
| 43 | + --tw-backdrop-grayscale: ; |
|
| 44 | + --tw-backdrop-hue-rotate: ; |
|
| 45 | + --tw-backdrop-invert: ; |
|
| 46 | + --tw-backdrop-opacity: ; |
|
| 47 | + --tw-backdrop-saturate: ; |
|
| 48 | + --tw-backdrop-sepia: ; |
|
| 49 | + --tw-contain-size: ; |
|
| 50 | + --tw-contain-layout: ; |
|
| 51 | + --tw-contain-paint: ; |
|
| 52 | + --tw-contain-style: |
|
| 53 | +} |
|
| 54 | + |
|
| 55 | +::backdrop { |
|
| 56 | + --tw-border-spacing-x: 0; |
|
| 57 | + --tw-border-spacing-y: 0; |
|
| 58 | + --tw-translate-x: 0; |
|
| 59 | + --tw-translate-y: 0; |
|
| 60 | + --tw-rotate: 0; |
|
| 61 | + --tw-skew-x: 0; |
|
| 62 | + --tw-skew-y: 0; |
|
| 63 | + --tw-scale-x: 1; |
|
| 64 | + --tw-scale-y: 1; |
|
| 65 | + --tw-pan-x: ; |
|
| 66 | + --tw-pan-y: ; |
|
| 67 | + --tw-pinch-zoom: ; |
|
| 68 | + --tw-scroll-snap-strictness: proximity; |
|
| 69 | + --tw-gradient-from-position: ; |
|
| 70 | + --tw-gradient-via-position: ; |
|
| 71 | + --tw-gradient-to-position: ; |
|
| 72 | + --tw-ordinal: ; |
|
| 73 | + --tw-slashed-zero: ; |
|
| 74 | + --tw-numeric-figure: ; |
|
| 75 | + --tw-numeric-spacing: ; |
|
| 76 | + --tw-numeric-fraction: ; |
|
| 77 | + --tw-ring-inset: ; |
|
| 78 | + --tw-ring-offset-width: 0px; |
|
| 79 | + --tw-ring-offset-color: #fff; |
|
| 80 | + --tw-ring-color: rgb(59 130 246 / 0.5); |
|
| 81 | + --tw-ring-offset-shadow: 0 0 #0000; |
|
| 82 | + --tw-ring-shadow: 0 0 #0000; |
|
| 83 | + --tw-shadow: 0 0 #0000; |
|
| 84 | + --tw-shadow-colored: 0 0 #0000; |
|
| 85 | + --tw-blur: ; |
|
| 86 | + --tw-brightness: ; |
|
| 87 | + --tw-contrast: ; |
|
| 88 | + --tw-grayscale: ; |
|
| 89 | + --tw-hue-rotate: ; |
|
| 90 | + --tw-invert: ; |
|
| 91 | + --tw-saturate: ; |
|
| 92 | + --tw-sepia: ; |
|
| 93 | + --tw-drop-shadow: ; |
|
| 94 | + --tw-backdrop-blur: ; |
|
| 95 | + --tw-backdrop-brightness: ; |
|
| 96 | + --tw-backdrop-contrast: ; |
|
| 97 | + --tw-backdrop-grayscale: ; |
|
| 98 | + --tw-backdrop-hue-rotate: ; |
|
| 99 | + --tw-backdrop-invert: ; |
|
| 100 | + --tw-backdrop-opacity: ; |
|
| 101 | + --tw-backdrop-saturate: ; |
|
| 102 | + --tw-backdrop-sepia: ; |
|
| 103 | + --tw-contain-size: ; |
|
| 104 | + --tw-contain-layout: ; |
|
| 105 | + --tw-contain-paint: ; |
|
| 106 | + --tw-contain-style: |
|
| 4 | 107 | } |
| 5 | 108 | |
| 6 | 109 | .visible { |
| 7 | 110 | visibility: visible |
| 8 | 111 | } |
| 9 | 112 | |
| 113 | +.fixed { |
|
| 114 | + position: fixed |
|
| 115 | +} |
|
| 116 | + |
|
| 10 | 117 | .sticky { |
| 11 | 118 | position: sticky |
| 12 | 119 | } |
| ... | ... | @@ -64,26 +171,6 @@ |
| 64 | 171 | margin-bottom: 2rem |
| 65 | 172 | } |
| 66 | 173 | |
| 67 | -.mt-2 { |
|
| 68 | - margin-top: 0.5rem |
|
| 69 | -} |
|
| 70 | - |
|
| 71 | -.mt-4 { |
|
| 72 | - margin-top: 1rem |
|
| 73 | -} |
|
| 74 | - |
|
| 75 | -.mt-10 { |
|
| 76 | - margin-top: 2.5rem |
|
| 77 | -} |
|
| 78 | - |
|
| 79 | -.mt-20 { |
|
| 80 | - margin-top: 5rem |
|
| 81 | -} |
|
| 82 | - |
|
| 83 | -.mt-48 { |
|
| 84 | - margin-top: 12rem |
|
| 85 | -} |
|
| 86 | - |
|
| 87 | 174 | .mb-0 { |
| 88 | 175 | margin-bottom: 0px |
| 89 | 176 | } |
| ... | ... | @@ -92,6 +179,10 @@ |
| 92 | 179 | margin-bottom: 0.25rem |
| 93 | 180 | } |
| 94 | 181 | |
| 182 | +.mb-10 { |
|
| 183 | + margin-bottom: 2.5rem |
|
| 184 | +} |
|
| 185 | + |
|
| 95 | 186 | .mb-2 { |
| 96 | 187 | margin-bottom: 0.5rem |
| 97 | 188 | } |
| ... | ... | @@ -100,10 +191,6 @@ |
| 100 | 191 | margin-bottom: 2rem |
| 101 | 192 | } |
| 102 | 193 | |
| 103 | -.mb-10 { |
|
| 104 | - margin-bottom: 2.5rem |
|
| 105 | -} |
|
| 106 | - |
|
| 107 | 194 | .ml-2 { |
| 108 | 195 | margin-left: 0.5rem |
| 109 | 196 | } |
| ... | ... | @@ -112,6 +199,26 @@ |
| 112 | 199 | margin-left: 1rem |
| 113 | 200 | } |
| 114 | 201 | |
| 202 | +.mt-10 { |
|
| 203 | + margin-top: 2.5rem |
|
| 204 | +} |
|
| 205 | + |
|
| 206 | +.mt-2 { |
|
| 207 | + margin-top: 0.5rem |
|
| 208 | +} |
|
| 209 | + |
|
| 210 | +.mt-20 { |
|
| 211 | + margin-top: 5rem |
|
| 212 | +} |
|
| 213 | + |
|
| 214 | +.mt-4 { |
|
| 215 | + margin-top: 1rem |
|
| 216 | +} |
|
| 217 | + |
|
| 218 | +.mt-48 { |
|
| 219 | + margin-top: 12rem |
|
| 220 | +} |
|
| 221 | + |
|
| 115 | 222 | .block { |
| 116 | 223 | display: block |
| 117 | 224 | } |
| ... | ... | @@ -140,10 +247,6 @@ |
| 140 | 247 | display: none |
| 141 | 248 | } |
| 142 | 249 | |
| 143 | -.h-8 { |
|
| 144 | - height: 2rem |
|
| 145 | -} |
|
| 146 | - |
|
| 147 | 250 | .h-12 { |
| 148 | 251 | height: 3rem |
| 149 | 252 | } |
| ... | ... | @@ -164,6 +267,10 @@ |
| 164 | 267 | height: 16rem |
| 165 | 268 | } |
| 166 | 269 | |
| 270 | +.h-8 { |
|
| 271 | + height: 2rem |
|
| 272 | +} |
|
| 273 | + |
|
| 167 | 274 | .w-full { |
| 168 | 275 | width: 100% |
| 169 | 276 | } |
| ... | ... | @@ -180,72 +287,6 @@ |
| 180 | 287 | flex-grow: 1 |
| 181 | 288 | } |
| 182 | 289 | |
| 183 | -@-webkit-keyframes spin { |
|
| 184 | - to { |
|
| 185 | - transform: rotate(360deg) |
|
| 186 | - } |
|
| 187 | -} |
|
| 188 | - |
|
| 189 | -@keyframes spin { |
|
| 190 | - to { |
|
| 191 | - transform: rotate(360deg) |
|
| 192 | - } |
|
| 193 | -} |
|
| 194 | - |
|
| 195 | -@-webkit-keyframes ping { |
|
| 196 | - 75%, 100% { |
|
| 197 | - transform: scale(2); |
|
| 198 | - opacity: 0 |
|
| 199 | - } |
|
| 200 | -} |
|
| 201 | - |
|
| 202 | -@keyframes ping { |
|
| 203 | - 75%, 100% { |
|
| 204 | - transform: scale(2); |
|
| 205 | - opacity: 0 |
|
| 206 | - } |
|
| 207 | -} |
|
| 208 | - |
|
| 209 | -@-webkit-keyframes pulse { |
|
| 210 | - 50% { |
|
| 211 | - opacity: .5 |
|
| 212 | - } |
|
| 213 | -} |
|
| 214 | - |
|
| 215 | -@keyframes pulse { |
|
| 216 | - 50% { |
|
| 217 | - opacity: .5 |
|
| 218 | - } |
|
| 219 | -} |
|
| 220 | - |
|
| 221 | -@-webkit-keyframes bounce { |
|
| 222 | - 0%, 100% { |
|
| 223 | - transform: translateY(-25%); |
|
| 224 | - -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1); |
|
| 225 | - animation-timing-function: cubic-bezier(0.8,0,1,1) |
|
| 226 | - } |
|
| 227 | - |
|
| 228 | - 50% { |
|
| 229 | - transform: none; |
|
| 230 | - -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1); |
|
| 231 | - animation-timing-function: cubic-bezier(0,0,0.2,1) |
|
| 232 | - } |
|
| 233 | -} |
|
| 234 | - |
|
| 235 | -@keyframes bounce { |
|
| 236 | - 0%, 100% { |
|
| 237 | - transform: translateY(-25%); |
|
| 238 | - -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1); |
|
| 239 | - animation-timing-function: cubic-bezier(0.8,0,1,1) |
|
| 240 | - } |
|
| 241 | - |
|
| 242 | - 50% { |
|
| 243 | - transform: none; |
|
| 244 | - -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1); |
|
| 245 | - animation-timing-function: cubic-bezier(0,0,0.2,1) |
|
| 246 | - } |
|
| 247 | -} |
|
| 248 | - |
|
| 249 | 290 | .flex-row { |
| 250 | 291 | flex-direction: row |
| 251 | 292 | } |
| ... | ... | @@ -278,6 +319,10 @@ |
| 278 | 319 | border-radius: 9999px |
| 279 | 320 | } |
| 280 | 321 | |
| 322 | +.border { |
|
| 323 | + border-width: 1px |
|
| 324 | +} |
|
| 325 | + |
|
| 281 | 326 | .border-0 { |
| 282 | 327 | border-width: 0px |
| 283 | 328 | } |
| ... | ... | @@ -286,75 +331,61 @@ |
| 286 | 331 | border-width: 2px |
| 287 | 332 | } |
| 288 | 333 | |
| 289 | -.border { |
|
| 290 | - border-width: 1px |
|
| 334 | +.border-b-2 { |
|
| 335 | + border-bottom-width: 2px |
|
| 291 | 336 | } |
| 292 | 337 | |
| 293 | 338 | .border-t-2 { |
| 294 | 339 | border-top-width: 2px |
| 295 | 340 | } |
| 296 | 341 | |
| 297 | -.border-b-2 { |
|
| 298 | - border-bottom-width: 2px |
|
| 299 | -} |
|
| 300 | - |
|
| 301 | 342 | .border-black { |
| 302 | 343 | --tw-border-opacity: 1; |
| 303 | - border-color: rgba(0, 0, 0, var(--tw-border-opacity)) |
|
| 344 | + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)) |
|
| 304 | 345 | } |
| 305 | 346 | |
| 306 | 347 | .border-gray-300 { |
| 307 | 348 | --tw-border-opacity: 1; |
| 308 | - border-color: rgba(209, 213, 219, var(--tw-border-opacity)) |
|
| 349 | + border-color: rgb(209 213 219 / var(--tw-border-opacity, 1)) |
|
| 309 | 350 | } |
| 310 | 351 | |
| 311 | 352 | .border-pink-200 { |
| 312 | 353 | --tw-border-opacity: 1; |
| 313 | - border-color: rgba(251, 207, 232, var(--tw-border-opacity)) |
|
| 354 | + border-color: rgb(251 207 232 / var(--tw-border-opacity, 1)) |
|
| 314 | 355 | } |
| 315 | 356 | |
| 316 | 357 | .border-pink-300 { |
| 317 | 358 | --tw-border-opacity: 1; |
| 318 | - border-color: rgba(249, 168, 212, var(--tw-border-opacity)) |
|
| 359 | + border-color: rgb(249 168 212 / var(--tw-border-opacity, 1)) |
|
| 319 | 360 | } |
| 320 | 361 | |
| 321 | 362 | .border-pink-600 { |
| 322 | 363 | --tw-border-opacity: 1; |
| 323 | - border-color: rgba(219, 39, 119, var(--tw-border-opacity)) |
|
| 324 | -} |
|
| 325 | - |
|
| 326 | -.bg-transparent { |
|
| 327 | - background-color: transparent |
|
| 364 | + border-color: rgb(219 39 119 / var(--tw-border-opacity, 1)) |
|
| 328 | 365 | } |
| 329 | 366 | |
| 330 | 367 | .bg-gray-300 { |
| 331 | 368 | --tw-bg-opacity: 1; |
| 332 | - background-color: rgba(209, 213, 219, var(--tw-bg-opacity)) |
|
| 369 | + background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1)) |
|
| 333 | 370 | } |
| 334 | 371 | |
| 335 | 372 | .bg-pink-100 { |
| 336 | 373 | --tw-bg-opacity: 1; |
| 337 | - background-color: rgba(252, 231, 243, var(--tw-bg-opacity)) |
|
| 374 | + background-color: rgb(252 231 243 / var(--tw-bg-opacity, 1)) |
|
| 338 | 375 | } |
| 339 | 376 | |
| 340 | 377 | .bg-pink-300 { |
| 341 | 378 | --tw-bg-opacity: 1; |
| 342 | - background-color: rgba(249, 168, 212, var(--tw-bg-opacity)) |
|
| 379 | + background-color: rgb(249 168 212 / var(--tw-bg-opacity, 1)) |
|
| 343 | 380 | } |
| 344 | 381 | |
| 345 | 382 | .bg-pink-400 { |
| 346 | 383 | --tw-bg-opacity: 1; |
| 347 | - background-color: rgba(244, 114, 182, var(--tw-bg-opacity)) |
|
| 348 | -} |
|
| 349 | - |
|
| 350 | -.hover\:bg-gray-300:hover { |
|
| 351 | - --tw-bg-opacity: 1; |
|
| 352 | - background-color: rgba(209, 213, 219, var(--tw-bg-opacity)) |
|
| 384 | + background-color: rgb(244 114 182 / var(--tw-bg-opacity, 1)) |
|
| 353 | 385 | } |
| 354 | 386 | |
| 355 | -.hover\:bg-pink-100:hover { |
|
| 356 | - --tw-bg-opacity: 1; |
|
| 357 | - background-color: rgba(252, 231, 243, var(--tw-bg-opacity)) |
|
| 387 | +.bg-transparent { |
|
| 388 | + background-color: transparent |
|
| 358 | 389 | } |
| 359 | 390 | |
| 360 | 391 | .p-0 { |
| ... | ... | @@ -423,20 +454,24 @@ |
| 423 | 454 | padding-bottom: 2rem |
| 424 | 455 | } |
| 425 | 456 | |
| 426 | -.pt-4 { |
|
| 427 | - padding-top: 1rem |
|
| 457 | +.pb-0 { |
|
| 458 | + padding-bottom: 0px |
|
| 428 | 459 | } |
| 429 | 460 | |
| 430 | -.pt-5 { |
|
| 431 | - padding-top: 1.25rem |
|
| 461 | +.pb-4 { |
|
| 462 | + padding-bottom: 1rem |
|
| 432 | 463 | } |
| 433 | 464 | |
| 434 | -.pt-10 { |
|
| 435 | - padding-top: 2.5rem |
|
| 465 | +.pl-2 { |
|
| 466 | + padding-left: 0.5rem |
|
| 436 | 467 | } |
| 437 | 468 | |
| 438 | -.pt-28 { |
|
| 439 | - padding-top: 7rem |
|
| 469 | +.pl-4 { |
|
| 470 | + padding-left: 1rem |
|
| 471 | +} |
|
| 472 | + |
|
| 473 | +.pl-5 { |
|
| 474 | + padding-left: 1.25rem |
|
| 440 | 475 | } |
| 441 | 476 | |
| 442 | 477 | .pr-2 { |
| ... | ... | @@ -455,24 +490,20 @@ |
| 455 | 490 | padding-right: 2.25rem |
| 456 | 491 | } |
| 457 | 492 | |
| 458 | -.pb-0 { |
|
| 459 | - padding-bottom: 0px |
|
| 460 | -} |
|
| 461 | - |
|
| 462 | -.pb-4 { |
|
| 463 | - padding-bottom: 1rem |
|
| 493 | +.pt-10 { |
|
| 494 | + padding-top: 2.5rem |
|
| 464 | 495 | } |
| 465 | 496 | |
| 466 | -.pl-2 { |
|
| 467 | - padding-left: 0.5rem |
|
| 497 | +.pt-28 { |
|
| 498 | + padding-top: 7rem |
|
| 468 | 499 | } |
| 469 | 500 | |
| 470 | -.pl-4 { |
|
| 471 | - padding-left: 1rem |
|
| 501 | +.pt-4 { |
|
| 502 | + padding-top: 1rem |
|
| 472 | 503 | } |
| 473 | 504 | |
| 474 | -.pl-5 { |
|
| 475 | - padding-left: 1.25rem |
|
| 505 | +.pt-5 { |
|
| 506 | + padding-top: 1.25rem |
|
| 476 | 507 | } |
| 477 | 508 | |
| 478 | 509 | .text-center { |
| ... | ... | @@ -483,6 +514,16 @@ |
| 483 | 514 | vertical-align: text-bottom |
| 484 | 515 | } |
| 485 | 516 | |
| 517 | +.text-2xl { |
|
| 518 | + font-size: 1.5rem; |
|
| 519 | + line-height: 2rem |
|
| 520 | +} |
|
| 521 | + |
|
| 522 | +.text-3xl { |
|
| 523 | + font-size: 1.875rem; |
|
| 524 | + line-height: 2.25rem |
|
| 525 | +} |
|
| 526 | + |
|
| 486 | 527 | .text-base { |
| 487 | 528 | font-size: 1rem; |
| 488 | 529 | line-height: 1.5rem |
| ... | ... | @@ -498,14 +539,8 @@ |
| 498 | 539 | line-height: 1.75rem |
| 499 | 540 | } |
| 500 | 541 | |
| 501 | -.text-2xl { |
|
| 502 | - font-size: 1.5rem; |
|
| 503 | - line-height: 2rem |
|
| 504 | -} |
|
| 505 | - |
|
| 506 | -.text-3xl { |
|
| 507 | - font-size: 1.875rem; |
|
| 508 | - line-height: 2.25rem |
|
| 542 | +.font-bold { |
|
| 543 | + font-weight: 700 |
|
| 509 | 544 | } |
| 510 | 545 | |
| 511 | 546 | .font-medium { |
| ... | ... | @@ -516,10 +551,6 @@ |
| 516 | 551 | font-weight: 600 |
| 517 | 552 | } |
| 518 | 553 | |
| 519 | -.font-bold { |
|
| 520 | - font-weight: 700 |
|
| 521 | -} |
|
| 522 | - |
|
| 523 | 554 | .italic { |
| 524 | 555 | font-style: italic |
| 525 | 556 | } |
| ... | ... | @@ -534,50 +565,48 @@ |
| 534 | 565 | |
| 535 | 566 | .text-black { |
| 536 | 567 | --tw-text-opacity: 1; |
| 537 | - color: rgba(0, 0, 0, var(--tw-text-opacity)) |
|
| 568 | + color: rgb(0 0 0 / var(--tw-text-opacity, 1)) |
|
| 538 | 569 | } |
| 539 | 570 | |
| 540 | 571 | .text-white { |
| 541 | 572 | --tw-text-opacity: 1; |
| 542 | - color: rgba(255, 255, 255, var(--tw-text-opacity)) |
|
| 573 | + color: rgb(255 255 255 / var(--tw-text-opacity, 1)) |
|
| 543 | 574 | } |
| 544 | 575 | |
| 545 | -.hover\:text-black:hover { |
|
| 546 | - --tw-text-opacity: 1; |
|
| 547 | - color: rgba(0, 0, 0, var(--tw-text-opacity)) |
|
| 576 | +.underline { |
|
| 577 | + text-decoration-line: underline |
|
| 548 | 578 | } |
| 549 | 579 | |
| 550 | -.hover\:text-gray-800:hover { |
|
| 551 | - --tw-text-opacity: 1; |
|
| 552 | - color: rgba(31, 41, 55, var(--tw-text-opacity)) |
|
| 580 | +.no-underline { |
|
| 581 | + text-decoration-line: none |
|
| 553 | 582 | } |
| 554 | 583 | |
| 555 | -.underline { |
|
| 556 | - text-decoration: underline |
|
| 584 | +.visited\:text-black:visited { |
|
| 585 | + color: rgb(0 0 0 ) |
|
| 557 | 586 | } |
| 558 | 587 | |
| 559 | -.no-underline { |
|
| 560 | - text-decoration: none |
|
| 588 | +.hover\:bg-gray-300:hover { |
|
| 589 | + --tw-bg-opacity: 1; |
|
| 590 | + background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1)) |
|
| 561 | 591 | } |
| 562 | 592 | |
| 563 | -.hover\:underline:hover { |
|
| 564 | - text-decoration: underline |
|
| 593 | +.hover\:bg-pink-100:hover { |
|
| 594 | + --tw-bg-opacity: 1; |
|
| 595 | + background-color: rgb(252 231 243 / var(--tw-bg-opacity, 1)) |
|
| 565 | 596 | } |
| 566 | 597 | |
| 567 | -*, ::before, ::after { |
|
| 568 | - --tw-shadow: 0 0 #0000 |
|
| 598 | +.hover\:text-black:hover { |
|
| 599 | + --tw-text-opacity: 1; |
|
| 600 | + color: rgb(0 0 0 / var(--tw-text-opacity, 1)) |
|
| 569 | 601 | } |
| 570 | 602 | |
| 571 | -*, ::before, ::after { |
|
| 572 | - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); |
|
| 573 | - --tw-ring-offset-width: 0px; |
|
| 574 | - --tw-ring-offset-color: #fff; |
|
| 575 | - --tw-ring-color: rgba(59, 130, 246, 0.5); |
|
| 576 | - --tw-ring-offset-shadow: 0 0 #0000; |
|
| 577 | - --tw-ring-shadow: 0 0 #0000 |
|
| 603 | +.hover\:text-gray-800:hover { |
|
| 604 | + --tw-text-opacity: 1; |
|
| 605 | + color: rgb(31 41 55 / var(--tw-text-opacity, 1)) |
|
| 578 | 606 | } |
| 579 | 607 | |
| 580 | -@media (min-width: 640px) { |
|
| 608 | +.hover\:underline:hover { |
|
| 609 | + text-decoration-line: underline |
|
| 581 | 610 | } |
| 582 | 611 | |
| 583 | 612 | @media (min-width: 768px) { |
| ... | ... | @@ -605,14 +634,14 @@ |
| 605 | 634 | display: none |
| 606 | 635 | } |
| 607 | 636 | |
| 608 | - .md\:h-6 { |
|
| 609 | - height: 1.5rem |
|
| 610 | - } |
|
| 611 | - |
|
| 612 | 637 | .md\:h-40 { |
| 613 | 638 | height: 10rem |
| 614 | 639 | } |
| 615 | 640 | |
| 641 | + .md\:h-6 { |
|
| 642 | + height: 1.5rem |
|
| 643 | + } |
|
| 644 | + |
|
| 616 | 645 | .md\:w-auto { |
| 617 | 646 | width: auto |
| 618 | 647 | } |
| ... | ... | @@ -627,16 +656,16 @@ |
| 627 | 656 | } |
| 628 | 657 | |
| 629 | 658 | @media (min-width: 1024px) { |
| 630 | - .lg\:mt-0 { |
|
| 631 | - margin-top: 0px |
|
| 659 | + .lg\:ml-5 { |
|
| 660 | + margin-left: 1.25rem |
|
| 632 | 661 | } |
| 633 | 662 | |
| 634 | 663 | .lg\:mr-5 { |
| 635 | 664 | margin-right: 1.25rem |
| 636 | 665 | } |
| 637 | 666 | |
| 638 | - .lg\:ml-5 { |
|
| 639 | - margin-left: 1.25rem |
|
| 667 | + .lg\:mt-0 { |
|
| 668 | + margin-top: 0px |
|
| 640 | 669 | } |
| 641 | 670 | |
| 642 | 671 | .lg\:flex { |
| ... | ... | @@ -666,6 +695,3 @@ |
| 666 | 695 | padding: 1rem |
| 667 | 696 | } |
| 668 | 697 | } |
| 669 | - |
|
| 670 | -@media (min-width: 1536px) { |
|
| 671 | -} |
templates/layout.mustache
| ... | ... | @@ -85,9 +85,11 @@ |
| 85 | 85 | <a href="/" class="pr-4 font-semibold text-black hover:text-gray-800 block mt-4 md:inline-block md:mt-0 ">위키</a> |
| 86 | 86 | <a href="/book" class=" pr-4 font-semibold text-black hover:text-gray-800 block mt-4 md:inline-block md:mt-0 "><span>ver.1</span></a> |
| 87 | 87 | <a href="https://0makes0.com" class="pr-4 font-semibold text-black hover:text-gray-800 block mt-4 md:inline-block md:mt-0"><span>제로의 예술</span></a> |
| 88 | + <!-- |
|
| 88 | 89 | <a href="https://nothingmakesitself.art/Satellite-Project"> |
| 89 | 90 | <img class="h-12 block md:inline-block md:mt-0" src="https://freight.cargo.site/t/original/i/abcd0824382cdb1e6c2efca6e3d5ae4dd8fc33f6ed88bddbfa25923073865abf/12313123100.png"> |
| 90 | 91 | </a> |
| 92 | + --> |
|
| 91 | 93 | </div> |
| 92 | 94 | </div> |
| 93 | 95 | </nav> |
templates/server.mustache
| ... | ... | @@ -11,10 +11,11 @@ |
| 11 | 11 | <span id="address"> 위치: 위도 37.493423, 경도 126.834054</span><br/> |
| 12 | 12 | </div> |
| 13 | 13 | <div class="lg:mt-0"> |
| 14 | - <h2 class="font-semibold text-lg mb-1">제로의 예술</h2> |
|
| 14 | + <h2 class="font-semibold text-lg mb-1"><a href="https://0makes0.com" target="_blank">제로의 예술</a></h2> |
|
| 15 | 15 | <a href="https://barimart.wordpress.com" target="_blank"><span>바림</span></a> (광주광역시 동구 대의동 80-2 3층) <br> |
| 16 | 16 | <a href="http://womanopentechlab.kr" target="_blank"><span>여성을 위한 열린 기술랩</span></a> (서울시 중구 을지로 157 대림상가 세운메이커스큐브 대림-동측 306호) |
| 17 | 17 | </br> |
| 18 | + <!-- |
|
| 18 | 19 | <div> |
| 19 | 20 | <a href="https://nothingmakesitself.art/Satellite-Project"><img class="inline md:hidden mt-4 mb-1 h-16" src="https://freight.cargo.site/t/original/i/abcd0824382cdb1e6c2efca6e3d5ae4dd8fc33f6ed88bddbfa25923073865abf/12313123100.png"></a> |
| 20 | 21 | </br> |
| ... | ... | @@ -22,6 +23,7 @@ |
| 22 | 23 | <span class="">2021 아르코 융복합 예술 페스티벌 《횡단하는 물질의 세계》</span> <br/> |
| 23 | 24 | <span class="">2021 ARKO Art & Tech Festival Nothing Makes Itself</span> |
| 24 | 25 | </div> |
| 26 | + --> |
|
| 25 | 27 | </div> |
| 26 | 28 | </div> |
| 27 | 29 | </div> |
tools/run-wiki-server.sh
| ... | ... | @@ -1,4 +1,5 @@ |
| 1 | 1 | #!/bin/sh |
| 2 | 2 | |
| 3 | 3 | cd /tmp |
| 4 | -python3 -m http.server 8000 |
|
| 4 | +#python3 -m http.server 8000 |
|
| 5 | +python3 -m http.server 8002 |
tools/server-status.sh
| ... | ... | @@ -1,22 +1,25 @@ |
| 1 | 1 | #while true; do echo -e "Battery: 13.2v 86% \n Power Consumption: 1.2W \n Date: $(date) \n Uptime: $(uptime)\n\n"> /tmp/index.html; sleep 1; done |
| 2 | 2 | |
| 3 | 3 | while true; do |
| 4 | - SENSORS=(`python2 ~/ina226.py`) |
|
| 5 | 4 | |
| 6 | - CURRENT=${SENSORS[0]} |
|
| 7 | - VOLTAGE=${SENSORS[1]} |
|
| 8 | - POWER=${SENSORS[2]} |
|
| 9 | - BATTERY=${SENSORS[3]} |
|
| 5 | + #SENSORS=(`python2 ~/ina226.py`) |
|
| 10 | 6 | |
| 11 | - WEATHERS=(`python2 ~/weather.py`) |
|
| 7 | + #CURRENT=${SENSORS[0]} |
|
| 8 | + #VOLTAGE=${SENSORS[1]} |
|
| 9 | + #POWER=${SENSORS[2]} |
|
| 10 | + #BATTERY=${SENSORS[3]} |
|
| 11 | + |
|
| 12 | + WEATHERS=(`python3 ./weather-2026.py`) |
|
| 12 | 13 | TEMPERATURE=${WEATHERS[0]} |
| 13 | 14 | FORECAST=${WEATHERS[1]} |
| 14 | 15 | LATITUDE=${WEATHERS[2]} |
| 15 | 16 | LONGITUDE=${WEATHERS[3]} |
| 16 | 17 | |
| 17 | - #VOLTAGE=`seq 13 0.1 14 | shuf | head -n1`; |
|
| 18 | - #BATTERY=`seq 70 1 90 | shuf | head -n1`; |
|
| 19 | - #POWER=`seq 1 .1 1.5 | shuf | head -n1`; |
|
| 18 | + # simulate for testing |
|
| 19 | + CURRENT=`seq 0.1 0.15 0.2 | shuf | head -n1`; |
|
| 20 | + VOLTAGE=`seq 13 0.1 14 | shuf | head -n1`; |
|
| 21 | + POWER=`seq 1 .1 1.5 | shuf | head -n1`; |
|
| 22 | + BATTERY=`seq 70 1 90 | shuf | head -n1`; |
|
| 20 | 23 | |
| 21 | 24 | echo -e "{\"voltage\": $VOLTAGE, \"battery\": $BATTERY, \"powerConsumption\": $POWER, \"current\": $CURRENT, \"forecast\": \"$FORECAST\", \"temperature\": $TEMPERATURE, \"date\": \"$(date)\", \"uptime\": \"$(uptime -p)\", \"latitude\": $LATITUDE, \"longitude\": $LONGITUDE }" > /tmp/index.html; |
| 22 | 25 | sleep 30; |
tools/weather-2026.py
| ... | ... | @@ -0,0 +1,50 @@ |
| 1 | +import sys |
|
| 2 | +from datetime import datetime, timedelta, timezone |
|
| 3 | + |
|
| 4 | +import requests |
|
| 5 | +from lxml import html |
|
| 6 | + |
|
| 7 | +HEADERS = {'User-Agent': 'Mozilla/5.0'} |
|
| 8 | +KST = timezone(timedelta(hours=9)) |
|
| 9 | + |
|
| 10 | +# 기상청 AWS(방재기상관측) 구로 관측소 실황 |
|
| 11 | +AWS_URL = 'https://www.weather.go.kr/w/observation/land/aws-obs-data.do' |
|
| 12 | +# 기상청 ASOS(종관기상관측) 도시별관측 - 운량은 여기에만 있음 |
|
| 13 | +CITY_URL = 'https://www.weather.go.kr/w/observation/land/city-obs.do' |
|
| 14 | + |
|
| 15 | +r = requests.get(AWS_URL, headers=HEADERS, timeout=20, params={ |
|
| 16 | + 'db': 'MINDB_01M', |
|
| 17 | + 'tm': datetime.now(KST).strftime('%Y.%m.%d %H:%M'), |
|
| 18 | + 'stnId': '423', |
|
| 19 | + 'sidoCode': 'asos', |
|
| 20 | + 'sort': '', |
|
| 21 | + 'config': '', |
|
| 22 | +}) |
|
| 23 | +r.raise_for_status() |
|
| 24 | +item = r.json()['items'][0] # 가장 최근 관측값 |
|
| 25 | + |
|
| 26 | +temperature = item['awsTmp'] |
|
| 27 | +latitude = '37.493423' |
|
| 28 | +longitude = '126.834054' |
|
| 29 | + |
|
| 30 | +# 현재일기(맑음 등)와 운량(1/10 -> %): 도시별관측 표의 서울 행 (구로는 ASOS가 아니라 서울 값 사용) |
|
| 31 | +r = requests.get(CITY_URL, headers=HEADERS, timeout=20, params={ |
|
| 32 | + 'type': 't99', 'mode': '0', 'reg': '100', 'auto_man': 'm', 'stn': '108', |
|
| 33 | +}) |
|
| 34 | +r.raise_for_status() |
|
| 35 | +t = html.fromstring(r.content.decode('utf8')) |
|
| 36 | +forecast = '-' |
|
| 37 | +cloud = '-' |
|
| 38 | +for tr in t.xpath('//table//tr'): |
|
| 39 | + td = [' '.join(x.text_content().split()) for x in tr.xpath('./td')] |
|
| 40 | + if len(td) > 3 and td[0] == '서울': |
|
| 41 | + # td: 이름, 현재일기, 시정, 운량, ... |
|
| 42 | + forecast = td[1] or '-' |
|
| 43 | + if td[3].isdigit(): |
|
| 44 | + cloud = str(int(td[3]) * 10) + '%' |
|
| 45 | + break |
|
| 46 | + |
|
| 47 | +if cloud != '-': |
|
| 48 | + forecast += '(' + cloud + ')' |
|
| 49 | + |
|
| 50 | +sys.stdout.write(temperature + ' ' + forecast + ' ' + latitude + ' ' + longitude) |