this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

25 starts

+2104 -628
-30
.devcontainer/devcontainer.json
··· 1 - { 2 - "image": "mcr.microsoft.com/devcontainers/universal:2", 3 - "features": { 4 - "ghcr.io/devcontainers-extra/features/gleam:1": { 5 - "version": "v1.7.0-rc2" 6 - }, 7 - "ghcr.io/devcontainers/features/rust:1": { 8 - "version": "latest" 9 - }, 10 - "ghcr.io/itsmechlark/features/postgresql:1": { 11 - "version": "latest" 12 - }, 13 - "ghcr.io/lumenpink/devcontainer-features/bun:0": {}, 14 - "ghcr.io/devcontainers-extra/features/asdf-package:1": { 15 - "plugin": "erlang", 16 - "version": "latest", 17 - "pluginRepo": "https://github.com/asdf-vm/asdf-erlang.git" 18 - } 19 - }, 20 - "customizations": { 21 - "vscode": { 22 - "extensions": [ 23 - "gleam.gleam", 24 - "ms-ossdata.vscode-postgresql", 25 - "rust-lang.rust-analyzer", 26 - "Yasuo-Higano.gleam-qol" 27 - ] 28 - } 29 - } 30 - }
+23
.github/.github/workflows/test.yml
··· 1 + name: test 2 + 3 + on: 4 + push: 5 + branches: 6 + - master 7 + - main 8 + pull_request: 9 + 10 + jobs: 11 + test: 12 + runs-on: ubuntu-latest 13 + steps: 14 + - uses: actions/checkout@v4 15 + - uses: erlef/setup-beam@v1 16 + with: 17 + otp-version: "27.1.2" 18 + gleam-version: "1.8.1" 19 + rebar3-version: "3" 20 + # elixir-version: "1" 21 + - run: gleam deps download 22 + - run: gleam test 23 + - run: gleam format --check src test
+6 -1
.gitignore
··· 4 4 5 5 # Ignore Gleam backend build artifacts 6 6 backend/build 7 - backend/priv/generated 7 + client/priv/generated 8 8 9 9 # Ignore Rust backend build artifacts 10 10 backend-rs/target ··· 25 25 .idea/ 26 26 .vscode/ 27 27 28 + 29 + 30 + # Added by cargo 31 + 32 + /target
+1136
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "addr2line" 7 + version = "0.24.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.0" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 + 20 + [[package]] 21 + name = "aho-corasick" 22 + version = "1.1.3" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 + dependencies = [ 26 + "memchr", 27 + ] 28 + 29 + [[package]] 30 + name = "autocfg" 31 + version = "1.4.0" 32 + source = "registry+https://github.com/rust-lang/crates.io-index" 33 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 34 + 35 + [[package]] 36 + name = "axum" 37 + version = "0.8.1" 38 + source = "registry+https://github.com/rust-lang/crates.io-index" 39 + checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" 40 + dependencies = [ 41 + "axum-core", 42 + "base64", 43 + "bytes", 44 + "form_urlencoded", 45 + "futures-util", 46 + "http", 47 + "http-body", 48 + "http-body-util", 49 + "hyper", 50 + "hyper-util", 51 + "itoa", 52 + "matchit", 53 + "memchr", 54 + "mime", 55 + "percent-encoding", 56 + "pin-project-lite", 57 + "rustversion", 58 + "serde", 59 + "serde_json", 60 + "serde_path_to_error", 61 + "serde_urlencoded", 62 + "sha1", 63 + "sync_wrapper", 64 + "tokio", 65 + "tokio-tungstenite", 66 + "tower", 67 + "tower-layer", 68 + "tower-service", 69 + "tracing", 70 + ] 71 + 72 + [[package]] 73 + name = "axum-core" 74 + version = "0.5.0" 75 + source = "registry+https://github.com/rust-lang/crates.io-index" 76 + checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" 77 + dependencies = [ 78 + "bytes", 79 + "futures-util", 80 + "http", 81 + "http-body", 82 + "http-body-util", 83 + "mime", 84 + "pin-project-lite", 85 + "rustversion", 86 + "sync_wrapper", 87 + "tower-layer", 88 + "tower-service", 89 + "tracing", 90 + ] 91 + 92 + [[package]] 93 + name = "backtrace" 94 + version = "0.3.74" 95 + source = "registry+https://github.com/rust-lang/crates.io-index" 96 + checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 97 + dependencies = [ 98 + "addr2line", 99 + "cfg-if", 100 + "libc", 101 + "miniz_oxide", 102 + "object", 103 + "rustc-demangle", 104 + "windows-targets", 105 + ] 106 + 107 + [[package]] 108 + name = "base64" 109 + version = "0.22.1" 110 + source = "registry+https://github.com/rust-lang/crates.io-index" 111 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 112 + 113 + [[package]] 114 + name = "bitflags" 115 + version = "2.8.0" 116 + source = "registry+https://github.com/rust-lang/crates.io-index" 117 + checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 118 + 119 + [[package]] 120 + name = "block-buffer" 121 + version = "0.10.4" 122 + source = "registry+https://github.com/rust-lang/crates.io-index" 123 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 124 + dependencies = [ 125 + "generic-array", 126 + ] 127 + 128 + [[package]] 129 + name = "byteorder" 130 + version = "1.5.0" 131 + source = "registry+https://github.com/rust-lang/crates.io-index" 132 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 133 + 134 + [[package]] 135 + name = "bytes" 136 + version = "1.10.0" 137 + source = "registry+https://github.com/rust-lang/crates.io-index" 138 + checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 139 + 140 + [[package]] 141 + name = "cfg-if" 142 + version = "1.0.0" 143 + source = "registry+https://github.com/rust-lang/crates.io-index" 144 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 145 + 146 + [[package]] 147 + name = "cpufeatures" 148 + version = "0.2.17" 149 + source = "registry+https://github.com/rust-lang/crates.io-index" 150 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 151 + dependencies = [ 152 + "libc", 153 + ] 154 + 155 + [[package]] 156 + name = "crypto-common" 157 + version = "0.1.6" 158 + source = "registry+https://github.com/rust-lang/crates.io-index" 159 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 160 + dependencies = [ 161 + "generic-array", 162 + "typenum", 163 + ] 164 + 165 + [[package]] 166 + name = "data-encoding" 167 + version = "2.8.0" 168 + source = "registry+https://github.com/rust-lang/crates.io-index" 169 + checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" 170 + 171 + [[package]] 172 + name = "digest" 173 + version = "0.10.7" 174 + source = "registry+https://github.com/rust-lang/crates.io-index" 175 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 176 + dependencies = [ 177 + "block-buffer", 178 + "crypto-common", 179 + ] 180 + 181 + [[package]] 182 + name = "fnv" 183 + version = "1.0.7" 184 + source = "registry+https://github.com/rust-lang/crates.io-index" 185 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 186 + 187 + [[package]] 188 + name = "form_urlencoded" 189 + version = "1.2.1" 190 + source = "registry+https://github.com/rust-lang/crates.io-index" 191 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 192 + dependencies = [ 193 + "percent-encoding", 194 + ] 195 + 196 + [[package]] 197 + name = "futures-channel" 198 + version = "0.3.31" 199 + source = "registry+https://github.com/rust-lang/crates.io-index" 200 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 201 + dependencies = [ 202 + "futures-core", 203 + ] 204 + 205 + [[package]] 206 + name = "futures-core" 207 + version = "0.3.31" 208 + source = "registry+https://github.com/rust-lang/crates.io-index" 209 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 210 + 211 + [[package]] 212 + name = "futures-sink" 213 + version = "0.3.31" 214 + source = "registry+https://github.com/rust-lang/crates.io-index" 215 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 216 + 217 + [[package]] 218 + name = "futures-task" 219 + version = "0.3.31" 220 + source = "registry+https://github.com/rust-lang/crates.io-index" 221 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 222 + 223 + [[package]] 224 + name = "futures-util" 225 + version = "0.3.31" 226 + source = "registry+https://github.com/rust-lang/crates.io-index" 227 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 228 + dependencies = [ 229 + "futures-core", 230 + "futures-sink", 231 + "futures-task", 232 + "pin-project-lite", 233 + "pin-utils", 234 + "slab", 235 + ] 236 + 237 + [[package]] 238 + name = "generic-array" 239 + version = "0.14.7" 240 + source = "registry+https://github.com/rust-lang/crates.io-index" 241 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 242 + dependencies = [ 243 + "typenum", 244 + "version_check", 245 + ] 246 + 247 + [[package]] 248 + name = "getrandom" 249 + version = "0.3.1" 250 + source = "registry+https://github.com/rust-lang/crates.io-index" 251 + checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 252 + dependencies = [ 253 + "cfg-if", 254 + "libc", 255 + "wasi 0.13.3+wasi-0.2.2", 256 + "windows-targets", 257 + ] 258 + 259 + [[package]] 260 + name = "gimli" 261 + version = "0.31.1" 262 + source = "registry+https://github.com/rust-lang/crates.io-index" 263 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 264 + 265 + [[package]] 266 + name = "http" 267 + version = "1.2.0" 268 + source = "registry+https://github.com/rust-lang/crates.io-index" 269 + checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" 270 + dependencies = [ 271 + "bytes", 272 + "fnv", 273 + "itoa", 274 + ] 275 + 276 + [[package]] 277 + name = "http-body" 278 + version = "1.0.1" 279 + source = "registry+https://github.com/rust-lang/crates.io-index" 280 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 281 + dependencies = [ 282 + "bytes", 283 + "http", 284 + ] 285 + 286 + [[package]] 287 + name = "http-body-util" 288 + version = "0.1.2" 289 + source = "registry+https://github.com/rust-lang/crates.io-index" 290 + checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 291 + dependencies = [ 292 + "bytes", 293 + "futures-util", 294 + "http", 295 + "http-body", 296 + "pin-project-lite", 297 + ] 298 + 299 + [[package]] 300 + name = "httparse" 301 + version = "1.10.0" 302 + source = "registry+https://github.com/rust-lang/crates.io-index" 303 + checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" 304 + 305 + [[package]] 306 + name = "httpdate" 307 + version = "1.0.3" 308 + source = "registry+https://github.com/rust-lang/crates.io-index" 309 + checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 310 + 311 + [[package]] 312 + name = "hyper" 313 + version = "1.6.0" 314 + source = "registry+https://github.com/rust-lang/crates.io-index" 315 + checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 316 + dependencies = [ 317 + "bytes", 318 + "futures-channel", 319 + "futures-util", 320 + "http", 321 + "http-body", 322 + "httparse", 323 + "httpdate", 324 + "itoa", 325 + "pin-project-lite", 326 + "smallvec", 327 + "tokio", 328 + ] 329 + 330 + [[package]] 331 + name = "hyper-util" 332 + version = "0.1.10" 333 + source = "registry+https://github.com/rust-lang/crates.io-index" 334 + checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 335 + dependencies = [ 336 + "bytes", 337 + "futures-util", 338 + "http", 339 + "http-body", 340 + "hyper", 341 + "pin-project-lite", 342 + "tokio", 343 + "tower-service", 344 + ] 345 + 346 + [[package]] 347 + name = "itoa" 348 + version = "1.0.14" 349 + source = "registry+https://github.com/rust-lang/crates.io-index" 350 + checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 351 + 352 + [[package]] 353 + name = "lazy_static" 354 + version = "1.5.0" 355 + source = "registry+https://github.com/rust-lang/crates.io-index" 356 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 357 + 358 + [[package]] 359 + name = "libc" 360 + version = "0.2.169" 361 + source = "registry+https://github.com/rust-lang/crates.io-index" 362 + checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 363 + 364 + [[package]] 365 + name = "lock_api" 366 + version = "0.4.12" 367 + source = "registry+https://github.com/rust-lang/crates.io-index" 368 + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 369 + dependencies = [ 370 + "autocfg", 371 + "scopeguard", 372 + ] 373 + 374 + [[package]] 375 + name = "log" 376 + version = "0.4.26" 377 + source = "registry+https://github.com/rust-lang/crates.io-index" 378 + checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 379 + 380 + [[package]] 381 + name = "lumina-server" 382 + version = "0.1.0" 383 + dependencies = [ 384 + "axum", 385 + "serde", 386 + "tokio", 387 + "tracing", 388 + "tracing-subscriber", 389 + ] 390 + 391 + [[package]] 392 + name = "matchers" 393 + version = "0.1.0" 394 + source = "registry+https://github.com/rust-lang/crates.io-index" 395 + checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 396 + dependencies = [ 397 + "regex-automata 0.1.10", 398 + ] 399 + 400 + [[package]] 401 + name = "matchit" 402 + version = "0.8.4" 403 + source = "registry+https://github.com/rust-lang/crates.io-index" 404 + checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 405 + 406 + [[package]] 407 + name = "memchr" 408 + version = "2.7.4" 409 + source = "registry+https://github.com/rust-lang/crates.io-index" 410 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 411 + 412 + [[package]] 413 + name = "mime" 414 + version = "0.3.17" 415 + source = "registry+https://github.com/rust-lang/crates.io-index" 416 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 417 + 418 + [[package]] 419 + name = "miniz_oxide" 420 + version = "0.8.5" 421 + source = "registry+https://github.com/rust-lang/crates.io-index" 422 + checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" 423 + dependencies = [ 424 + "adler2", 425 + ] 426 + 427 + [[package]] 428 + name = "mio" 429 + version = "1.0.3" 430 + source = "registry+https://github.com/rust-lang/crates.io-index" 431 + checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 432 + dependencies = [ 433 + "libc", 434 + "wasi 0.11.0+wasi-snapshot-preview1", 435 + "windows-sys", 436 + ] 437 + 438 + [[package]] 439 + name = "nu-ansi-term" 440 + version = "0.46.0" 441 + source = "registry+https://github.com/rust-lang/crates.io-index" 442 + checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 443 + dependencies = [ 444 + "overload", 445 + "winapi", 446 + ] 447 + 448 + [[package]] 449 + name = "object" 450 + version = "0.36.7" 451 + source = "registry+https://github.com/rust-lang/crates.io-index" 452 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 453 + dependencies = [ 454 + "memchr", 455 + ] 456 + 457 + [[package]] 458 + name = "once_cell" 459 + version = "1.20.3" 460 + source = "registry+https://github.com/rust-lang/crates.io-index" 461 + checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" 462 + 463 + [[package]] 464 + name = "overload" 465 + version = "0.1.1" 466 + source = "registry+https://github.com/rust-lang/crates.io-index" 467 + checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 468 + 469 + [[package]] 470 + name = "parking_lot" 471 + version = "0.12.3" 472 + source = "registry+https://github.com/rust-lang/crates.io-index" 473 + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 474 + dependencies = [ 475 + "lock_api", 476 + "parking_lot_core", 477 + ] 478 + 479 + [[package]] 480 + name = "parking_lot_core" 481 + version = "0.9.10" 482 + source = "registry+https://github.com/rust-lang/crates.io-index" 483 + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 484 + dependencies = [ 485 + "cfg-if", 486 + "libc", 487 + "redox_syscall", 488 + "smallvec", 489 + "windows-targets", 490 + ] 491 + 492 + [[package]] 493 + name = "percent-encoding" 494 + version = "2.3.1" 495 + source = "registry+https://github.com/rust-lang/crates.io-index" 496 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 497 + 498 + [[package]] 499 + name = "pin-project-lite" 500 + version = "0.2.16" 501 + source = "registry+https://github.com/rust-lang/crates.io-index" 502 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 503 + 504 + [[package]] 505 + name = "pin-utils" 506 + version = "0.1.0" 507 + source = "registry+https://github.com/rust-lang/crates.io-index" 508 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 509 + 510 + [[package]] 511 + name = "ppv-lite86" 512 + version = "0.2.20" 513 + source = "registry+https://github.com/rust-lang/crates.io-index" 514 + checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 515 + dependencies = [ 516 + "zerocopy 0.7.35", 517 + ] 518 + 519 + [[package]] 520 + name = "proc-macro2" 521 + version = "1.0.93" 522 + source = "registry+https://github.com/rust-lang/crates.io-index" 523 + checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 524 + dependencies = [ 525 + "unicode-ident", 526 + ] 527 + 528 + [[package]] 529 + name = "quote" 530 + version = "1.0.38" 531 + source = "registry+https://github.com/rust-lang/crates.io-index" 532 + checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 533 + dependencies = [ 534 + "proc-macro2", 535 + ] 536 + 537 + [[package]] 538 + name = "rand" 539 + version = "0.9.0" 540 + source = "registry+https://github.com/rust-lang/crates.io-index" 541 + checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" 542 + dependencies = [ 543 + "rand_chacha", 544 + "rand_core", 545 + "zerocopy 0.8.20", 546 + ] 547 + 548 + [[package]] 549 + name = "rand_chacha" 550 + version = "0.9.0" 551 + source = "registry+https://github.com/rust-lang/crates.io-index" 552 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 553 + dependencies = [ 554 + "ppv-lite86", 555 + "rand_core", 556 + ] 557 + 558 + [[package]] 559 + name = "rand_core" 560 + version = "0.9.1" 561 + source = "registry+https://github.com/rust-lang/crates.io-index" 562 + checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" 563 + dependencies = [ 564 + "getrandom", 565 + "zerocopy 0.8.20", 566 + ] 567 + 568 + [[package]] 569 + name = "redox_syscall" 570 + version = "0.5.9" 571 + source = "registry+https://github.com/rust-lang/crates.io-index" 572 + checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" 573 + dependencies = [ 574 + "bitflags", 575 + ] 576 + 577 + [[package]] 578 + name = "regex" 579 + version = "1.11.1" 580 + source = "registry+https://github.com/rust-lang/crates.io-index" 581 + checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 582 + dependencies = [ 583 + "aho-corasick", 584 + "memchr", 585 + "regex-automata 0.4.9", 586 + "regex-syntax 0.8.5", 587 + ] 588 + 589 + [[package]] 590 + name = "regex-automata" 591 + version = "0.1.10" 592 + source = "registry+https://github.com/rust-lang/crates.io-index" 593 + checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 594 + dependencies = [ 595 + "regex-syntax 0.6.29", 596 + ] 597 + 598 + [[package]] 599 + name = "regex-automata" 600 + version = "0.4.9" 601 + source = "registry+https://github.com/rust-lang/crates.io-index" 602 + checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 603 + dependencies = [ 604 + "aho-corasick", 605 + "memchr", 606 + "regex-syntax 0.8.5", 607 + ] 608 + 609 + [[package]] 610 + name = "regex-syntax" 611 + version = "0.6.29" 612 + source = "registry+https://github.com/rust-lang/crates.io-index" 613 + checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 614 + 615 + [[package]] 616 + name = "regex-syntax" 617 + version = "0.8.5" 618 + source = "registry+https://github.com/rust-lang/crates.io-index" 619 + checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 620 + 621 + [[package]] 622 + name = "rustc-demangle" 623 + version = "0.1.24" 624 + source = "registry+https://github.com/rust-lang/crates.io-index" 625 + checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 626 + 627 + [[package]] 628 + name = "rustversion" 629 + version = "1.0.19" 630 + source = "registry+https://github.com/rust-lang/crates.io-index" 631 + checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 632 + 633 + [[package]] 634 + name = "ryu" 635 + version = "1.0.19" 636 + source = "registry+https://github.com/rust-lang/crates.io-index" 637 + checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 638 + 639 + [[package]] 640 + name = "scopeguard" 641 + version = "1.2.0" 642 + source = "registry+https://github.com/rust-lang/crates.io-index" 643 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 644 + 645 + [[package]] 646 + name = "serde" 647 + version = "1.0.218" 648 + source = "registry+https://github.com/rust-lang/crates.io-index" 649 + checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" 650 + dependencies = [ 651 + "serde_derive", 652 + ] 653 + 654 + [[package]] 655 + name = "serde_derive" 656 + version = "1.0.218" 657 + source = "registry+https://github.com/rust-lang/crates.io-index" 658 + checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" 659 + dependencies = [ 660 + "proc-macro2", 661 + "quote", 662 + "syn", 663 + ] 664 + 665 + [[package]] 666 + name = "serde_json" 667 + version = "1.0.139" 668 + source = "registry+https://github.com/rust-lang/crates.io-index" 669 + checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" 670 + dependencies = [ 671 + "itoa", 672 + "memchr", 673 + "ryu", 674 + "serde", 675 + ] 676 + 677 + [[package]] 678 + name = "serde_path_to_error" 679 + version = "0.1.16" 680 + source = "registry+https://github.com/rust-lang/crates.io-index" 681 + checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" 682 + dependencies = [ 683 + "itoa", 684 + "serde", 685 + ] 686 + 687 + [[package]] 688 + name = "serde_urlencoded" 689 + version = "0.7.1" 690 + source = "registry+https://github.com/rust-lang/crates.io-index" 691 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 692 + dependencies = [ 693 + "form_urlencoded", 694 + "itoa", 695 + "ryu", 696 + "serde", 697 + ] 698 + 699 + [[package]] 700 + name = "sha1" 701 + version = "0.10.6" 702 + source = "registry+https://github.com/rust-lang/crates.io-index" 703 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 704 + dependencies = [ 705 + "cfg-if", 706 + "cpufeatures", 707 + "digest", 708 + ] 709 + 710 + [[package]] 711 + name = "sharded-slab" 712 + version = "0.1.7" 713 + source = "registry+https://github.com/rust-lang/crates.io-index" 714 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 715 + dependencies = [ 716 + "lazy_static", 717 + ] 718 + 719 + [[package]] 720 + name = "signal-hook-registry" 721 + version = "1.4.2" 722 + source = "registry+https://github.com/rust-lang/crates.io-index" 723 + checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 724 + dependencies = [ 725 + "libc", 726 + ] 727 + 728 + [[package]] 729 + name = "slab" 730 + version = "0.4.9" 731 + source = "registry+https://github.com/rust-lang/crates.io-index" 732 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 733 + dependencies = [ 734 + "autocfg", 735 + ] 736 + 737 + [[package]] 738 + name = "smallvec" 739 + version = "1.14.0" 740 + source = "registry+https://github.com/rust-lang/crates.io-index" 741 + checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 742 + 743 + [[package]] 744 + name = "socket2" 745 + version = "0.5.8" 746 + source = "registry+https://github.com/rust-lang/crates.io-index" 747 + checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 748 + dependencies = [ 749 + "libc", 750 + "windows-sys", 751 + ] 752 + 753 + [[package]] 754 + name = "syn" 755 + version = "2.0.98" 756 + source = "registry+https://github.com/rust-lang/crates.io-index" 757 + checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 758 + dependencies = [ 759 + "proc-macro2", 760 + "quote", 761 + "unicode-ident", 762 + ] 763 + 764 + [[package]] 765 + name = "sync_wrapper" 766 + version = "1.0.2" 767 + source = "registry+https://github.com/rust-lang/crates.io-index" 768 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 769 + 770 + [[package]] 771 + name = "thiserror" 772 + version = "2.0.11" 773 + source = "registry+https://github.com/rust-lang/crates.io-index" 774 + checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 775 + dependencies = [ 776 + "thiserror-impl", 777 + ] 778 + 779 + [[package]] 780 + name = "thiserror-impl" 781 + version = "2.0.11" 782 + source = "registry+https://github.com/rust-lang/crates.io-index" 783 + checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 784 + dependencies = [ 785 + "proc-macro2", 786 + "quote", 787 + "syn", 788 + ] 789 + 790 + [[package]] 791 + name = "thread_local" 792 + version = "1.1.8" 793 + source = "registry+https://github.com/rust-lang/crates.io-index" 794 + checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 795 + dependencies = [ 796 + "cfg-if", 797 + "once_cell", 798 + ] 799 + 800 + [[package]] 801 + name = "tokio" 802 + version = "1.43.0" 803 + source = "registry+https://github.com/rust-lang/crates.io-index" 804 + checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 805 + dependencies = [ 806 + "backtrace", 807 + "bytes", 808 + "libc", 809 + "mio", 810 + "parking_lot", 811 + "pin-project-lite", 812 + "signal-hook-registry", 813 + "socket2", 814 + "tokio-macros", 815 + "windows-sys", 816 + ] 817 + 818 + [[package]] 819 + name = "tokio-macros" 820 + version = "2.5.0" 821 + source = "registry+https://github.com/rust-lang/crates.io-index" 822 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 823 + dependencies = [ 824 + "proc-macro2", 825 + "quote", 826 + "syn", 827 + ] 828 + 829 + [[package]] 830 + name = "tokio-tungstenite" 831 + version = "0.26.2" 832 + source = "registry+https://github.com/rust-lang/crates.io-index" 833 + checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" 834 + dependencies = [ 835 + "futures-util", 836 + "log", 837 + "tokio", 838 + "tungstenite", 839 + ] 840 + 841 + [[package]] 842 + name = "tower" 843 + version = "0.5.2" 844 + source = "registry+https://github.com/rust-lang/crates.io-index" 845 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 846 + dependencies = [ 847 + "futures-core", 848 + "futures-util", 849 + "pin-project-lite", 850 + "sync_wrapper", 851 + "tokio", 852 + "tower-layer", 853 + "tower-service", 854 + "tracing", 855 + ] 856 + 857 + [[package]] 858 + name = "tower-layer" 859 + version = "0.3.3" 860 + source = "registry+https://github.com/rust-lang/crates.io-index" 861 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 862 + 863 + [[package]] 864 + name = "tower-service" 865 + version = "0.3.3" 866 + source = "registry+https://github.com/rust-lang/crates.io-index" 867 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 868 + 869 + [[package]] 870 + name = "tracing" 871 + version = "0.1.41" 872 + source = "registry+https://github.com/rust-lang/crates.io-index" 873 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 874 + dependencies = [ 875 + "log", 876 + "pin-project-lite", 877 + "tracing-attributes", 878 + "tracing-core", 879 + ] 880 + 881 + [[package]] 882 + name = "tracing-attributes" 883 + version = "0.1.28" 884 + source = "registry+https://github.com/rust-lang/crates.io-index" 885 + checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 886 + dependencies = [ 887 + "proc-macro2", 888 + "quote", 889 + "syn", 890 + ] 891 + 892 + [[package]] 893 + name = "tracing-core" 894 + version = "0.1.33" 895 + source = "registry+https://github.com/rust-lang/crates.io-index" 896 + checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 897 + dependencies = [ 898 + "once_cell", 899 + "valuable", 900 + ] 901 + 902 + [[package]] 903 + name = "tracing-log" 904 + version = "0.2.0" 905 + source = "registry+https://github.com/rust-lang/crates.io-index" 906 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 907 + dependencies = [ 908 + "log", 909 + "once_cell", 910 + "tracing-core", 911 + ] 912 + 913 + [[package]] 914 + name = "tracing-subscriber" 915 + version = "0.3.19" 916 + source = "registry+https://github.com/rust-lang/crates.io-index" 917 + checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 918 + dependencies = [ 919 + "matchers", 920 + "nu-ansi-term", 921 + "once_cell", 922 + "regex", 923 + "sharded-slab", 924 + "smallvec", 925 + "thread_local", 926 + "tracing", 927 + "tracing-core", 928 + "tracing-log", 929 + ] 930 + 931 + [[package]] 932 + name = "tungstenite" 933 + version = "0.26.2" 934 + source = "registry+https://github.com/rust-lang/crates.io-index" 935 + checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" 936 + dependencies = [ 937 + "bytes", 938 + "data-encoding", 939 + "http", 940 + "httparse", 941 + "log", 942 + "rand", 943 + "sha1", 944 + "thiserror", 945 + "utf-8", 946 + ] 947 + 948 + [[package]] 949 + name = "typenum" 950 + version = "1.18.0" 951 + source = "registry+https://github.com/rust-lang/crates.io-index" 952 + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 953 + 954 + [[package]] 955 + name = "unicode-ident" 956 + version = "1.0.17" 957 + source = "registry+https://github.com/rust-lang/crates.io-index" 958 + checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" 959 + 960 + [[package]] 961 + name = "utf-8" 962 + version = "0.7.6" 963 + source = "registry+https://github.com/rust-lang/crates.io-index" 964 + checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 965 + 966 + [[package]] 967 + name = "valuable" 968 + version = "0.1.1" 969 + source = "registry+https://github.com/rust-lang/crates.io-index" 970 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 971 + 972 + [[package]] 973 + name = "version_check" 974 + version = "0.9.5" 975 + source = "registry+https://github.com/rust-lang/crates.io-index" 976 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 977 + 978 + [[package]] 979 + name = "wasi" 980 + version = "0.11.0+wasi-snapshot-preview1" 981 + source = "registry+https://github.com/rust-lang/crates.io-index" 982 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 983 + 984 + [[package]] 985 + name = "wasi" 986 + version = "0.13.3+wasi-0.2.2" 987 + source = "registry+https://github.com/rust-lang/crates.io-index" 988 + checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 989 + dependencies = [ 990 + "wit-bindgen-rt", 991 + ] 992 + 993 + [[package]] 994 + name = "winapi" 995 + version = "0.3.9" 996 + source = "registry+https://github.com/rust-lang/crates.io-index" 997 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 998 + dependencies = [ 999 + "winapi-i686-pc-windows-gnu", 1000 + "winapi-x86_64-pc-windows-gnu", 1001 + ] 1002 + 1003 + [[package]] 1004 + name = "winapi-i686-pc-windows-gnu" 1005 + version = "0.4.0" 1006 + source = "registry+https://github.com/rust-lang/crates.io-index" 1007 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1008 + 1009 + [[package]] 1010 + name = "winapi-x86_64-pc-windows-gnu" 1011 + version = "0.4.0" 1012 + source = "registry+https://github.com/rust-lang/crates.io-index" 1013 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1014 + 1015 + [[package]] 1016 + name = "windows-sys" 1017 + version = "0.52.0" 1018 + source = "registry+https://github.com/rust-lang/crates.io-index" 1019 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1020 + dependencies = [ 1021 + "windows-targets", 1022 + ] 1023 + 1024 + [[package]] 1025 + name = "windows-targets" 1026 + version = "0.52.6" 1027 + source = "registry+https://github.com/rust-lang/crates.io-index" 1028 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1029 + dependencies = [ 1030 + "windows_aarch64_gnullvm", 1031 + "windows_aarch64_msvc", 1032 + "windows_i686_gnu", 1033 + "windows_i686_gnullvm", 1034 + "windows_i686_msvc", 1035 + "windows_x86_64_gnu", 1036 + "windows_x86_64_gnullvm", 1037 + "windows_x86_64_msvc", 1038 + ] 1039 + 1040 + [[package]] 1041 + name = "windows_aarch64_gnullvm" 1042 + version = "0.52.6" 1043 + source = "registry+https://github.com/rust-lang/crates.io-index" 1044 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1045 + 1046 + [[package]] 1047 + name = "windows_aarch64_msvc" 1048 + version = "0.52.6" 1049 + source = "registry+https://github.com/rust-lang/crates.io-index" 1050 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1051 + 1052 + [[package]] 1053 + name = "windows_i686_gnu" 1054 + version = "0.52.6" 1055 + source = "registry+https://github.com/rust-lang/crates.io-index" 1056 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1057 + 1058 + [[package]] 1059 + name = "windows_i686_gnullvm" 1060 + version = "0.52.6" 1061 + source = "registry+https://github.com/rust-lang/crates.io-index" 1062 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1063 + 1064 + [[package]] 1065 + name = "windows_i686_msvc" 1066 + version = "0.52.6" 1067 + source = "registry+https://github.com/rust-lang/crates.io-index" 1068 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1069 + 1070 + [[package]] 1071 + name = "windows_x86_64_gnu" 1072 + version = "0.52.6" 1073 + source = "registry+https://github.com/rust-lang/crates.io-index" 1074 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1075 + 1076 + [[package]] 1077 + name = "windows_x86_64_gnullvm" 1078 + version = "0.52.6" 1079 + source = "registry+https://github.com/rust-lang/crates.io-index" 1080 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1081 + 1082 + [[package]] 1083 + name = "windows_x86_64_msvc" 1084 + version = "0.52.6" 1085 + source = "registry+https://github.com/rust-lang/crates.io-index" 1086 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1087 + 1088 + [[package]] 1089 + name = "wit-bindgen-rt" 1090 + version = "0.33.0" 1091 + source = "registry+https://github.com/rust-lang/crates.io-index" 1092 + checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 1093 + dependencies = [ 1094 + "bitflags", 1095 + ] 1096 + 1097 + [[package]] 1098 + name = "zerocopy" 1099 + version = "0.7.35" 1100 + source = "registry+https://github.com/rust-lang/crates.io-index" 1101 + checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 1102 + dependencies = [ 1103 + "byteorder", 1104 + "zerocopy-derive 0.7.35", 1105 + ] 1106 + 1107 + [[package]] 1108 + name = "zerocopy" 1109 + version = "0.8.20" 1110 + source = "registry+https://github.com/rust-lang/crates.io-index" 1111 + checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" 1112 + dependencies = [ 1113 + "zerocopy-derive 0.8.20", 1114 + ] 1115 + 1116 + [[package]] 1117 + name = "zerocopy-derive" 1118 + version = "0.7.35" 1119 + source = "registry+https://github.com/rust-lang/crates.io-index" 1120 + checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 1121 + dependencies = [ 1122 + "proc-macro2", 1123 + "quote", 1124 + "syn", 1125 + ] 1126 + 1127 + [[package]] 1128 + name = "zerocopy-derive" 1129 + version = "0.8.20" 1130 + source = "registry+https://github.com/rust-lang/crates.io-index" 1131 + checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" 1132 + dependencies = [ 1133 + "proc-macro2", 1134 + "quote", 1135 + "syn", 1136 + ]
+3
Cargo.toml
··· 1 + [workspace] 2 + members = ["./server"] 3 + default-members = ["./server"]
backend/priv/static/fonts/Fira_Sans/FiraSans-Black.ttf client/priv/fonts/Fira_Sans/FiraSans-Black.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-BlackItalic.ttf client/priv/fonts/Fira_Sans/FiraSans-BlackItalic.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-Bold.ttf client/priv/fonts/Fira_Sans/FiraSans-Bold.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-BoldItalic.ttf client/priv/fonts/Fira_Sans/FiraSans-BoldItalic.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-ExtraBold.ttf client/priv/fonts/Fira_Sans/FiraSans-ExtraBold.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.ttf client/priv/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-ExtraLight.ttf client/priv/fonts/Fira_Sans/FiraSans-ExtraLight.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-ExtraLightItalic.ttf client/priv/fonts/Fira_Sans/FiraSans-ExtraLightItalic.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-Italic.ttf client/priv/fonts/Fira_Sans/FiraSans-Italic.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-Light.ttf client/priv/fonts/Fira_Sans/FiraSans-Light.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-LightItalic.ttf client/priv/fonts/Fira_Sans/FiraSans-LightItalic.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-Medium.ttf client/priv/fonts/Fira_Sans/FiraSans-Medium.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-MediumItalic.ttf client/priv/fonts/Fira_Sans/FiraSans-MediumItalic.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-Regular.ttf client/priv/fonts/Fira_Sans/FiraSans-Regular.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-SemiBold.ttf client/priv/fonts/Fira_Sans/FiraSans-SemiBold.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-SemiBoldItalic.ttf client/priv/fonts/Fira_Sans/FiraSans-SemiBoldItalic.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-Thin.ttf client/priv/fonts/Fira_Sans/FiraSans-Thin.ttf
backend/priv/static/fonts/Fira_Sans/FiraSans-ThinItalic.ttf client/priv/fonts/Fira_Sans/FiraSans-ThinItalic.ttf
+93 -93
backend/priv/static/fonts/Fira_Sans/OFL.txt client/priv/fonts/Fira_Sans/OFL.txt
··· 1 - Copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. 2 - 3 - This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 - This license is copied below, and is also available with a FAQ at: 5 - https://openfontlicense.org 6 - 7 - 8 - ----------------------------------------------------------- 9 - SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 - ----------------------------------------------------------- 11 - 12 - PREAMBLE 13 - The goals of the Open Font License (OFL) are to stimulate worldwide 14 - development of collaborative font projects, to support the font creation 15 - efforts of academic and linguistic communities, and to provide a free and 16 - open framework in which fonts may be shared and improved in partnership 17 - with others. 18 - 19 - The OFL allows the licensed fonts to be used, studied, modified and 20 - redistributed freely as long as they are not sold by themselves. The 21 - fonts, including any derivative works, can be bundled, embedded, 22 - redistributed and/or sold with any software provided that any reserved 23 - names are not used by derivative works. The fonts and derivatives, 24 - however, cannot be released under any other type of license. The 25 - requirement for fonts to remain under this license does not apply 26 - to any document created using the fonts or their derivatives. 27 - 28 - DEFINITIONS 29 - "Font Software" refers to the set of files released by the Copyright 30 - Holder(s) under this license and clearly marked as such. This may 31 - include source files, build scripts and documentation. 32 - 33 - "Reserved Font Name" refers to any names specified as such after the 34 - copyright statement(s). 35 - 36 - "Original Version" refers to the collection of Font Software components as 37 - distributed by the Copyright Holder(s). 38 - 39 - "Modified Version" refers to any derivative made by adding to, deleting, 40 - or substituting -- in part or in whole -- any of the components of the 41 - Original Version, by changing formats or by porting the Font Software to a 42 - new environment. 43 - 44 - "Author" refers to any designer, engineer, programmer, technical 45 - writer or other person who contributed to the Font Software. 46 - 47 - PERMISSION & CONDITIONS 48 - Permission is hereby granted, free of charge, to any person obtaining 49 - a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 - redistribute, and sell modified and unmodified copies of the Font 51 - Software, subject to the following conditions: 52 - 53 - 1) Neither the Font Software nor any of its individual components, 54 - in Original or Modified Versions, may be sold by itself. 55 - 56 - 2) Original or Modified Versions of the Font Software may be bundled, 57 - redistributed and/or sold with any software, provided that each copy 58 - contains the above copyright notice and this license. These can be 59 - included either as stand-alone text files, human-readable headers or 60 - in the appropriate machine-readable metadata fields within text or 61 - binary files as long as those fields can be easily viewed by the user. 62 - 63 - 3) No Modified Version of the Font Software may use the Reserved Font 64 - Name(s) unless explicit written permission is granted by the corresponding 65 - Copyright Holder. This restriction only applies to the primary font name as 66 - presented to the users. 67 - 68 - 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 - Software shall not be used to promote, endorse or advertise any 70 - Modified Version, except to acknowledge the contribution(s) of the 71 - Copyright Holder(s) and the Author(s) or with their explicit written 72 - permission. 73 - 74 - 5) The Font Software, modified or unmodified, in part or in whole, 75 - must be distributed entirely under this license, and must not be 76 - distributed under any other license. The requirement for fonts to 77 - remain under this license does not apply to any document created 78 - using the Font Software. 79 - 80 - TERMINATION 81 - This license becomes null and void if any of the above conditions are 82 - not met. 83 - 84 - DISCLAIMER 85 - THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 - OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 - COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 - INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 - DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 - FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 - OTHER DEALINGS IN THE FONT SOFTWARE. 1 + Copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. 2 + 3 + This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 + This license is copied below, and is also available with a FAQ at: 5 + https://openfontlicense.org 6 + 7 + 8 + ----------------------------------------------------------- 9 + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 + ----------------------------------------------------------- 11 + 12 + PREAMBLE 13 + The goals of the Open Font License (OFL) are to stimulate worldwide 14 + development of collaborative font projects, to support the font creation 15 + efforts of academic and linguistic communities, and to provide a free and 16 + open framework in which fonts may be shared and improved in partnership 17 + with others. 18 + 19 + The OFL allows the licensed fonts to be used, studied, modified and 20 + redistributed freely as long as they are not sold by themselves. The 21 + fonts, including any derivative works, can be bundled, embedded, 22 + redistributed and/or sold with any software provided that any reserved 23 + names are not used by derivative works. The fonts and derivatives, 24 + however, cannot be released under any other type of license. The 25 + requirement for fonts to remain under this license does not apply 26 + to any document created using the fonts or their derivatives. 27 + 28 + DEFINITIONS 29 + "Font Software" refers to the set of files released by the Copyright 30 + Holder(s) under this license and clearly marked as such. This may 31 + include source files, build scripts and documentation. 32 + 33 + "Reserved Font Name" refers to any names specified as such after the 34 + copyright statement(s). 35 + 36 + "Original Version" refers to the collection of Font Software components as 37 + distributed by the Copyright Holder(s). 38 + 39 + "Modified Version" refers to any derivative made by adding to, deleting, 40 + or substituting -- in part or in whole -- any of the components of the 41 + Original Version, by changing formats or by porting the Font Software to a 42 + new environment. 43 + 44 + "Author" refers to any designer, engineer, programmer, technical 45 + writer or other person who contributed to the Font Software. 46 + 47 + PERMISSION & CONDITIONS 48 + Permission is hereby granted, free of charge, to any person obtaining 49 + a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 + redistribute, and sell modified and unmodified copies of the Font 51 + Software, subject to the following conditions: 52 + 53 + 1) Neither the Font Software nor any of its individual components, 54 + in Original or Modified Versions, may be sold by itself. 55 + 56 + 2) Original or Modified Versions of the Font Software may be bundled, 57 + redistributed and/or sold with any software, provided that each copy 58 + contains the above copyright notice and this license. These can be 59 + included either as stand-alone text files, human-readable headers or 60 + in the appropriate machine-readable metadata fields within text or 61 + binary files as long as those fields can be easily viewed by the user. 62 + 63 + 3) No Modified Version of the Font Software may use the Reserved Font 64 + Name(s) unless explicit written permission is granted by the corresponding 65 + Copyright Holder. This restriction only applies to the primary font name as 66 + presented to the users. 67 + 68 + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 + Software shall not be used to promote, endorse or advertise any 70 + Modified Version, except to acknowledge the contribution(s) of the 71 + Copyright Holder(s) and the Author(s) or with their explicit written 72 + permission. 73 + 74 + 5) The Font Software, modified or unmodified, in part or in whole, 75 + must be distributed entirely under this license, and must not be 76 + distributed under any other license. The requirement for fonts to 77 + remain under this license does not apply to any document created 78 + using the Font Software. 79 + 80 + TERMINATION 81 + This license becomes null and void if any of the above conditions are 82 + not met. 83 + 84 + DISCLAIMER 85 + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 + OTHER DEALINGS IN THE FONT SOFTWARE.
backend/priv/static/fonts/Gantari/Gantari-Italic-VariableFont_wght.ttf client/priv/fonts/Gantari/Gantari-Italic-VariableFont_wght.ttf
backend/priv/static/fonts/Gantari/Gantari-VariableFont_wght.ttf client/priv/fonts/Gantari/Gantari-VariableFont_wght.ttf
+93 -93
backend/priv/static/fonts/Gantari/OFL.txt client/priv/fonts/Gantari/OFL.txt
··· 1 - Copyright 2022 The Gantari Project Authors (https://github.com/Lafontype/Gantari) 2 - 3 - This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 - This license is copied below, and is also available with a FAQ at: 5 - https://openfontlicense.org 6 - 7 - 8 - ----------------------------------------------------------- 9 - SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 - ----------------------------------------------------------- 11 - 12 - PREAMBLE 13 - The goals of the Open Font License (OFL) are to stimulate worldwide 14 - development of collaborative font projects, to support the font creation 15 - efforts of academic and linguistic communities, and to provide a free and 16 - open framework in which fonts may be shared and improved in partnership 17 - with others. 18 - 19 - The OFL allows the licensed fonts to be used, studied, modified and 20 - redistributed freely as long as they are not sold by themselves. The 21 - fonts, including any derivative works, can be bundled, embedded, 22 - redistributed and/or sold with any software provided that any reserved 23 - names are not used by derivative works. The fonts and derivatives, 24 - however, cannot be released under any other type of license. The 25 - requirement for fonts to remain under this license does not apply 26 - to any document created using the fonts or their derivatives. 27 - 28 - DEFINITIONS 29 - "Font Software" refers to the set of files released by the Copyright 30 - Holder(s) under this license and clearly marked as such. This may 31 - include source files, build scripts and documentation. 32 - 33 - "Reserved Font Name" refers to any names specified as such after the 34 - copyright statement(s). 35 - 36 - "Original Version" refers to the collection of Font Software components as 37 - distributed by the Copyright Holder(s). 38 - 39 - "Modified Version" refers to any derivative made by adding to, deleting, 40 - or substituting -- in part or in whole -- any of the components of the 41 - Original Version, by changing formats or by porting the Font Software to a 42 - new environment. 43 - 44 - "Author" refers to any designer, engineer, programmer, technical 45 - writer or other person who contributed to the Font Software. 46 - 47 - PERMISSION & CONDITIONS 48 - Permission is hereby granted, free of charge, to any person obtaining 49 - a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 - redistribute, and sell modified and unmodified copies of the Font 51 - Software, subject to the following conditions: 52 - 53 - 1) Neither the Font Software nor any of its individual components, 54 - in Original or Modified Versions, may be sold by itself. 55 - 56 - 2) Original or Modified Versions of the Font Software may be bundled, 57 - redistributed and/or sold with any software, provided that each copy 58 - contains the above copyright notice and this license. These can be 59 - included either as stand-alone text files, human-readable headers or 60 - in the appropriate machine-readable metadata fields within text or 61 - binary files as long as those fields can be easily viewed by the user. 62 - 63 - 3) No Modified Version of the Font Software may use the Reserved Font 64 - Name(s) unless explicit written permission is granted by the corresponding 65 - Copyright Holder. This restriction only applies to the primary font name as 66 - presented to the users. 67 - 68 - 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 - Software shall not be used to promote, endorse or advertise any 70 - Modified Version, except to acknowledge the contribution(s) of the 71 - Copyright Holder(s) and the Author(s) or with their explicit written 72 - permission. 73 - 74 - 5) The Font Software, modified or unmodified, in part or in whole, 75 - must be distributed entirely under this license, and must not be 76 - distributed under any other license. The requirement for fonts to 77 - remain under this license does not apply to any document created 78 - using the Font Software. 79 - 80 - TERMINATION 81 - This license becomes null and void if any of the above conditions are 82 - not met. 83 - 84 - DISCLAIMER 85 - THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 - OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 - COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 - INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 - DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 - FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 - OTHER DEALINGS IN THE FONT SOFTWARE. 1 + Copyright 2022 The Gantari Project Authors (https://github.com/Lafontype/Gantari) 2 + 3 + This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 + This license is copied below, and is also available with a FAQ at: 5 + https://openfontlicense.org 6 + 7 + 8 + ----------------------------------------------------------- 9 + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 + ----------------------------------------------------------- 11 + 12 + PREAMBLE 13 + The goals of the Open Font License (OFL) are to stimulate worldwide 14 + development of collaborative font projects, to support the font creation 15 + efforts of academic and linguistic communities, and to provide a free and 16 + open framework in which fonts may be shared and improved in partnership 17 + with others. 18 + 19 + The OFL allows the licensed fonts to be used, studied, modified and 20 + redistributed freely as long as they are not sold by themselves. The 21 + fonts, including any derivative works, can be bundled, embedded, 22 + redistributed and/or sold with any software provided that any reserved 23 + names are not used by derivative works. The fonts and derivatives, 24 + however, cannot be released under any other type of license. The 25 + requirement for fonts to remain under this license does not apply 26 + to any document created using the fonts or their derivatives. 27 + 28 + DEFINITIONS 29 + "Font Software" refers to the set of files released by the Copyright 30 + Holder(s) under this license and clearly marked as such. This may 31 + include source files, build scripts and documentation. 32 + 33 + "Reserved Font Name" refers to any names specified as such after the 34 + copyright statement(s). 35 + 36 + "Original Version" refers to the collection of Font Software components as 37 + distributed by the Copyright Holder(s). 38 + 39 + "Modified Version" refers to any derivative made by adding to, deleting, 40 + or substituting -- in part or in whole -- any of the components of the 41 + Original Version, by changing formats or by porting the Font Software to a 42 + new environment. 43 + 44 + "Author" refers to any designer, engineer, programmer, technical 45 + writer or other person who contributed to the Font Software. 46 + 47 + PERMISSION & CONDITIONS 48 + Permission is hereby granted, free of charge, to any person obtaining 49 + a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 + redistribute, and sell modified and unmodified copies of the Font 51 + Software, subject to the following conditions: 52 + 53 + 1) Neither the Font Software nor any of its individual components, 54 + in Original or Modified Versions, may be sold by itself. 55 + 56 + 2) Original or Modified Versions of the Font Software may be bundled, 57 + redistributed and/or sold with any software, provided that each copy 58 + contains the above copyright notice and this license. These can be 59 + included either as stand-alone text files, human-readable headers or 60 + in the appropriate machine-readable metadata fields within text or 61 + binary files as long as those fields can be easily viewed by the user. 62 + 63 + 3) No Modified Version of the Font Software may use the Reserved Font 64 + Name(s) unless explicit written permission is granted by the corresponding 65 + Copyright Holder. This restriction only applies to the primary font name as 66 + presented to the users. 67 + 68 + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 + Software shall not be used to promote, endorse or advertise any 70 + Modified Version, except to acknowledge the contribution(s) of the 71 + Copyright Holder(s) and the Author(s) or with their explicit written 72 + permission. 73 + 74 + 5) The Font Software, modified or unmodified, in part or in whole, 75 + must be distributed entirely under this license, and must not be 76 + distributed under any other license. The requirement for fonts to 77 + remain under this license does not apply to any document created 78 + using the Font Software. 79 + 80 + TERMINATION 81 + This license becomes null and void if any of the above conditions are 82 + not met. 83 + 84 + DISCLAIMER 85 + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 + OTHER DEALINGS IN THE FONT SOFTWARE.
+81 -81
backend/priv/static/fonts/Gantari/README.txt client/priv/fonts/Gantari/README.txt
··· 1 - Gantari Variable Font 2 - ===================== 3 - 4 - This download contains Gantari as both variable fonts and static fonts. 5 - 6 - Gantari is a variable font with this axis: 7 - wght 8 - 9 - This means all the styles are contained in these files: 10 - Gantari/Gantari-VariableFont_wght.ttf 11 - Gantari/Gantari-Italic-VariableFont_wght.ttf 12 - 13 - If your app fully supports variable fonts, you can now pick intermediate styles 14 - that aren’t available as static fonts. Not all apps support variable fonts, and 15 - in those cases you can use the static font files for Gantari: 16 - Gantari/static/Gantari-Thin.ttf 17 - Gantari/static/Gantari-ExtraLight.ttf 18 - Gantari/static/Gantari-Light.ttf 19 - Gantari/static/Gantari-Regular.ttf 20 - Gantari/static/Gantari-Medium.ttf 21 - Gantari/static/Gantari-SemiBold.ttf 22 - Gantari/static/Gantari-Bold.ttf 23 - Gantari/static/Gantari-ExtraBold.ttf 24 - Gantari/static/Gantari-Black.ttf 25 - Gantari/static/Gantari-ThinItalic.ttf 26 - Gantari/static/Gantari-ExtraLightItalic.ttf 27 - Gantari/static/Gantari-LightItalic.ttf 28 - Gantari/static/Gantari-Italic.ttf 29 - Gantari/static/Gantari-MediumItalic.ttf 30 - Gantari/static/Gantari-SemiBoldItalic.ttf 31 - Gantari/static/Gantari-BoldItalic.ttf 32 - Gantari/static/Gantari-ExtraBoldItalic.ttf 33 - Gantari/static/Gantari-BlackItalic.ttf 34 - 35 - Get started 36 - ----------- 37 - 38 - 1. Install the font files you want to use 39 - 40 - 2. Use your app's font picker to view the font family and all the 41 - available styles 42 - 43 - Learn more about variable fonts 44 - ------------------------------- 45 - 46 - https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts 47 - https://variablefonts.typenetwork.com 48 - https://medium.com/variable-fonts 49 - 50 - In desktop apps 51 - 52 - https://theblog.adobe.com/can-variable-fonts-illustrator-cc 53 - https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts 54 - 55 - Online 56 - 57 - https://developers.google.com/fonts/docs/getting_started 58 - https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide 59 - https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts 60 - 61 - Installing fonts 62 - 63 - MacOS: https://support.apple.com/en-us/HT201749 64 - Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux 65 - Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows 66 - 67 - Android Apps 68 - 69 - https://developers.google.com/fonts/docs/android 70 - https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts 71 - 72 - License 73 - ------- 74 - Please read the full license text (OFL.txt) to understand the permissions, 75 - restrictions and requirements for usage, redistribution, and modification. 76 - 77 - You can use them in your products & projects – print or digital, 78 - commercial or otherwise. 79 - 80 - This isn't legal advice, please consider consulting a lawyer and see the full 81 - license for all details. 1 + Gantari Variable Font 2 + ===================== 3 + 4 + This download contains Gantari as both variable fonts and static fonts. 5 + 6 + Gantari is a variable font with this axis: 7 + wght 8 + 9 + This means all the styles are contained in these files: 10 + Gantari/Gantari-VariableFont_wght.ttf 11 + Gantari/Gantari-Italic-VariableFont_wght.ttf 12 + 13 + If your app fully supports variable fonts, you can now pick intermediate styles 14 + that aren’t available as static fonts. Not all apps support variable fonts, and 15 + in those cases you can use the static font files for Gantari: 16 + Gantari/static/Gantari-Thin.ttf 17 + Gantari/static/Gantari-ExtraLight.ttf 18 + Gantari/static/Gantari-Light.ttf 19 + Gantari/static/Gantari-Regular.ttf 20 + Gantari/static/Gantari-Medium.ttf 21 + Gantari/static/Gantari-SemiBold.ttf 22 + Gantari/static/Gantari-Bold.ttf 23 + Gantari/static/Gantari-ExtraBold.ttf 24 + Gantari/static/Gantari-Black.ttf 25 + Gantari/static/Gantari-ThinItalic.ttf 26 + Gantari/static/Gantari-ExtraLightItalic.ttf 27 + Gantari/static/Gantari-LightItalic.ttf 28 + Gantari/static/Gantari-Italic.ttf 29 + Gantari/static/Gantari-MediumItalic.ttf 30 + Gantari/static/Gantari-SemiBoldItalic.ttf 31 + Gantari/static/Gantari-BoldItalic.ttf 32 + Gantari/static/Gantari-ExtraBoldItalic.ttf 33 + Gantari/static/Gantari-BlackItalic.ttf 34 + 35 + Get started 36 + ----------- 37 + 38 + 1. Install the font files you want to use 39 + 40 + 2. Use your app's font picker to view the font family and all the 41 + available styles 42 + 43 + Learn more about variable fonts 44 + ------------------------------- 45 + 46 + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts 47 + https://variablefonts.typenetwork.com 48 + https://medium.com/variable-fonts 49 + 50 + In desktop apps 51 + 52 + https://theblog.adobe.com/can-variable-fonts-illustrator-cc 53 + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts 54 + 55 + Online 56 + 57 + https://developers.google.com/fonts/docs/getting_started 58 + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide 59 + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts 60 + 61 + Installing fonts 62 + 63 + MacOS: https://support.apple.com/en-us/HT201749 64 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux 65 + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows 66 + 67 + Android Apps 68 + 69 + https://developers.google.com/fonts/docs/android 70 + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts 71 + 72 + License 73 + ------- 74 + Please read the full license text (OFL.txt) to understand the permissions, 75 + restrictions and requirements for usage, redistribution, and modification. 76 + 77 + You can use them in your products & projects – print or digital, 78 + commercial or otherwise. 79 + 80 + This isn't legal advice, please consider consulting a lawyer and see the full 81 + license for all details.
backend/priv/static/fonts/Gantari/static/Gantari-Black.ttf client/priv/fonts/Gantari/static/Gantari-Black.ttf
backend/priv/static/fonts/Gantari/static/Gantari-BlackItalic.ttf client/priv/fonts/Gantari/static/Gantari-BlackItalic.ttf
backend/priv/static/fonts/Gantari/static/Gantari-Bold.ttf client/priv/fonts/Gantari/static/Gantari-Bold.ttf
backend/priv/static/fonts/Gantari/static/Gantari-BoldItalic.ttf client/priv/fonts/Gantari/static/Gantari-BoldItalic.ttf
backend/priv/static/fonts/Gantari/static/Gantari-ExtraBold.ttf client/priv/fonts/Gantari/static/Gantari-ExtraBold.ttf
backend/priv/static/fonts/Gantari/static/Gantari-ExtraBoldItalic.ttf client/priv/fonts/Gantari/static/Gantari-ExtraBoldItalic.ttf
backend/priv/static/fonts/Gantari/static/Gantari-ExtraLight.ttf client/priv/fonts/Gantari/static/Gantari-ExtraLight.ttf
backend/priv/static/fonts/Gantari/static/Gantari-ExtraLightItalic.ttf client/priv/fonts/Gantari/static/Gantari-ExtraLightItalic.ttf
backend/priv/static/fonts/Gantari/static/Gantari-Italic.ttf client/priv/fonts/Gantari/static/Gantari-Italic.ttf
backend/priv/static/fonts/Gantari/static/Gantari-Light.ttf client/priv/fonts/Gantari/static/Gantari-Light.ttf
backend/priv/static/fonts/Gantari/static/Gantari-LightItalic.ttf client/priv/fonts/Gantari/static/Gantari-LightItalic.ttf
backend/priv/static/fonts/Gantari/static/Gantari-Medium.ttf client/priv/fonts/Gantari/static/Gantari-Medium.ttf
backend/priv/static/fonts/Gantari/static/Gantari-MediumItalic.ttf client/priv/fonts/Gantari/static/Gantari-MediumItalic.ttf
backend/priv/static/fonts/Gantari/static/Gantari-Regular.ttf client/priv/fonts/Gantari/static/Gantari-Regular.ttf
backend/priv/static/fonts/Gantari/static/Gantari-SemiBold.ttf client/priv/fonts/Gantari/static/Gantari-SemiBold.ttf
backend/priv/static/fonts/Gantari/static/Gantari-SemiBoldItalic.ttf client/priv/fonts/Gantari/static/Gantari-SemiBoldItalic.ttf
backend/priv/static/fonts/Gantari/static/Gantari-Thin.ttf client/priv/fonts/Gantari/static/Gantari-Thin.ttf
backend/priv/static/fonts/Gantari/static/Gantari-ThinItalic.ttf client/priv/fonts/Gantari/static/Gantari-ThinItalic.ttf
backend/priv/static/fonts/Josefin_Sans/JosefinSans-Italic-VariableFont_wght.ttf client/priv/fonts/Josefin_Sans/JosefinSans-Italic-VariableFont_wght.ttf
backend/priv/static/fonts/Josefin_Sans/JosefinSans-VariableFont_wght.ttf client/priv/fonts/Josefin_Sans/JosefinSans-VariableFont_wght.ttf
+93 -93
backend/priv/static/fonts/Josefin_Sans/OFL.txt client/priv/fonts/Josefin_Sans/OFL.txt
··· 1 - Copyright 2010 The Josefin Sans Project Authors (https://github.com/ThomasJockin/JosefinSansFont-master), with Reserved Font Name "Josefin Sans". 2 - 3 - This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 - This license is copied below, and is also available with a FAQ at: 5 - https://openfontlicense.org 6 - 7 - 8 - ----------------------------------------------------------- 9 - SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 - ----------------------------------------------------------- 11 - 12 - PREAMBLE 13 - The goals of the Open Font License (OFL) are to stimulate worldwide 14 - development of collaborative font projects, to support the font creation 15 - efforts of academic and linguistic communities, and to provide a free and 16 - open framework in which fonts may be shared and improved in partnership 17 - with others. 18 - 19 - The OFL allows the licensed fonts to be used, studied, modified and 20 - redistributed freely as long as they are not sold by themselves. The 21 - fonts, including any derivative works, can be bundled, embedded, 22 - redistributed and/or sold with any software provided that any reserved 23 - names are not used by derivative works. The fonts and derivatives, 24 - however, cannot be released under any other type of license. The 25 - requirement for fonts to remain under this license does not apply 26 - to any document created using the fonts or their derivatives. 27 - 28 - DEFINITIONS 29 - "Font Software" refers to the set of files released by the Copyright 30 - Holder(s) under this license and clearly marked as such. This may 31 - include source files, build scripts and documentation. 32 - 33 - "Reserved Font Name" refers to any names specified as such after the 34 - copyright statement(s). 35 - 36 - "Original Version" refers to the collection of Font Software components as 37 - distributed by the Copyright Holder(s). 38 - 39 - "Modified Version" refers to any derivative made by adding to, deleting, 40 - or substituting -- in part or in whole -- any of the components of the 41 - Original Version, by changing formats or by porting the Font Software to a 42 - new environment. 43 - 44 - "Author" refers to any designer, engineer, programmer, technical 45 - writer or other person who contributed to the Font Software. 46 - 47 - PERMISSION & CONDITIONS 48 - Permission is hereby granted, free of charge, to any person obtaining 49 - a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 - redistribute, and sell modified and unmodified copies of the Font 51 - Software, subject to the following conditions: 52 - 53 - 1) Neither the Font Software nor any of its individual components, 54 - in Original or Modified Versions, may be sold by itself. 55 - 56 - 2) Original or Modified Versions of the Font Software may be bundled, 57 - redistributed and/or sold with any software, provided that each copy 58 - contains the above copyright notice and this license. These can be 59 - included either as stand-alone text files, human-readable headers or 60 - in the appropriate machine-readable metadata fields within text or 61 - binary files as long as those fields can be easily viewed by the user. 62 - 63 - 3) No Modified Version of the Font Software may use the Reserved Font 64 - Name(s) unless explicit written permission is granted by the corresponding 65 - Copyright Holder. This restriction only applies to the primary font name as 66 - presented to the users. 67 - 68 - 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 - Software shall not be used to promote, endorse or advertise any 70 - Modified Version, except to acknowledge the contribution(s) of the 71 - Copyright Holder(s) and the Author(s) or with their explicit written 72 - permission. 73 - 74 - 5) The Font Software, modified or unmodified, in part or in whole, 75 - must be distributed entirely under this license, and must not be 76 - distributed under any other license. The requirement for fonts to 77 - remain under this license does not apply to any document created 78 - using the Font Software. 79 - 80 - TERMINATION 81 - This license becomes null and void if any of the above conditions are 82 - not met. 83 - 84 - DISCLAIMER 85 - THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 - OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 - COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 - INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 - DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 - FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 - OTHER DEALINGS IN THE FONT SOFTWARE. 1 + Copyright 2010 The Josefin Sans Project Authors (https://github.com/ThomasJockin/JosefinSansFont-master), with Reserved Font Name "Josefin Sans". 2 + 3 + This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 + This license is copied below, and is also available with a FAQ at: 5 + https://openfontlicense.org 6 + 7 + 8 + ----------------------------------------------------------- 9 + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 + ----------------------------------------------------------- 11 + 12 + PREAMBLE 13 + The goals of the Open Font License (OFL) are to stimulate worldwide 14 + development of collaborative font projects, to support the font creation 15 + efforts of academic and linguistic communities, and to provide a free and 16 + open framework in which fonts may be shared and improved in partnership 17 + with others. 18 + 19 + The OFL allows the licensed fonts to be used, studied, modified and 20 + redistributed freely as long as they are not sold by themselves. The 21 + fonts, including any derivative works, can be bundled, embedded, 22 + redistributed and/or sold with any software provided that any reserved 23 + names are not used by derivative works. The fonts and derivatives, 24 + however, cannot be released under any other type of license. The 25 + requirement for fonts to remain under this license does not apply 26 + to any document created using the fonts or their derivatives. 27 + 28 + DEFINITIONS 29 + "Font Software" refers to the set of files released by the Copyright 30 + Holder(s) under this license and clearly marked as such. This may 31 + include source files, build scripts and documentation. 32 + 33 + "Reserved Font Name" refers to any names specified as such after the 34 + copyright statement(s). 35 + 36 + "Original Version" refers to the collection of Font Software components as 37 + distributed by the Copyright Holder(s). 38 + 39 + "Modified Version" refers to any derivative made by adding to, deleting, 40 + or substituting -- in part or in whole -- any of the components of the 41 + Original Version, by changing formats or by porting the Font Software to a 42 + new environment. 43 + 44 + "Author" refers to any designer, engineer, programmer, technical 45 + writer or other person who contributed to the Font Software. 46 + 47 + PERMISSION & CONDITIONS 48 + Permission is hereby granted, free of charge, to any person obtaining 49 + a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 + redistribute, and sell modified and unmodified copies of the Font 51 + Software, subject to the following conditions: 52 + 53 + 1) Neither the Font Software nor any of its individual components, 54 + in Original or Modified Versions, may be sold by itself. 55 + 56 + 2) Original or Modified Versions of the Font Software may be bundled, 57 + redistributed and/or sold with any software, provided that each copy 58 + contains the above copyright notice and this license. These can be 59 + included either as stand-alone text files, human-readable headers or 60 + in the appropriate machine-readable metadata fields within text or 61 + binary files as long as those fields can be easily viewed by the user. 62 + 63 + 3) No Modified Version of the Font Software may use the Reserved Font 64 + Name(s) unless explicit written permission is granted by the corresponding 65 + Copyright Holder. This restriction only applies to the primary font name as 66 + presented to the users. 67 + 68 + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 + Software shall not be used to promote, endorse or advertise any 70 + Modified Version, except to acknowledge the contribution(s) of the 71 + Copyright Holder(s) and the Author(s) or with their explicit written 72 + permission. 73 + 74 + 5) The Font Software, modified or unmodified, in part or in whole, 75 + must be distributed entirely under this license, and must not be 76 + distributed under any other license. The requirement for fonts to 77 + remain under this license does not apply to any document created 78 + using the Font Software. 79 + 80 + TERMINATION 81 + This license becomes null and void if any of the above conditions are 82 + not met. 83 + 84 + DISCLAIMER 85 + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 + OTHER DEALINGS IN THE FONT SOFTWARE.
+77 -77
backend/priv/static/fonts/Josefin_Sans/README.txt client/priv/fonts/Josefin_Sans/README.txt
··· 1 - Josefin Sans Variable Font 2 - ========================== 3 - 4 - This download contains Josefin Sans as both variable fonts and static fonts. 5 - 6 - Josefin Sans is a variable font with this axis: 7 - wght 8 - 9 - This means all the styles are contained in these files: 10 - Josefin_Sans/JosefinSans-VariableFont_wght.ttf 11 - Josefin_Sans/JosefinSans-Italic-VariableFont_wght.ttf 12 - 13 - If your app fully supports variable fonts, you can now pick intermediate styles 14 - that aren’t available as static fonts. Not all apps support variable fonts, and 15 - in those cases you can use the static font files for Josefin Sans: 16 - Josefin_Sans/static/JosefinSans-Thin.ttf 17 - Josefin_Sans/static/JosefinSans-ExtraLight.ttf 18 - Josefin_Sans/static/JosefinSans-Light.ttf 19 - Josefin_Sans/static/JosefinSans-Regular.ttf 20 - Josefin_Sans/static/JosefinSans-Medium.ttf 21 - Josefin_Sans/static/JosefinSans-SemiBold.ttf 22 - Josefin_Sans/static/JosefinSans-Bold.ttf 23 - Josefin_Sans/static/JosefinSans-ThinItalic.ttf 24 - Josefin_Sans/static/JosefinSans-ExtraLightItalic.ttf 25 - Josefin_Sans/static/JosefinSans-LightItalic.ttf 26 - Josefin_Sans/static/JosefinSans-Italic.ttf 27 - Josefin_Sans/static/JosefinSans-MediumItalic.ttf 28 - Josefin_Sans/static/JosefinSans-SemiBoldItalic.ttf 29 - Josefin_Sans/static/JosefinSans-BoldItalic.ttf 30 - 31 - Get started 32 - ----------- 33 - 34 - 1. Install the font files you want to use 35 - 36 - 2. Use your app's font picker to view the font family and all the 37 - available styles 38 - 39 - Learn more about variable fonts 40 - ------------------------------- 41 - 42 - https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts 43 - https://variablefonts.typenetwork.com 44 - https://medium.com/variable-fonts 45 - 46 - In desktop apps 47 - 48 - https://theblog.adobe.com/can-variable-fonts-illustrator-cc 49 - https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts 50 - 51 - Online 52 - 53 - https://developers.google.com/fonts/docs/getting_started 54 - https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide 55 - https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts 56 - 57 - Installing fonts 58 - 59 - MacOS: https://support.apple.com/en-us/HT201749 60 - Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux 61 - Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows 62 - 63 - Android Apps 64 - 65 - https://developers.google.com/fonts/docs/android 66 - https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts 67 - 68 - License 69 - ------- 70 - Please read the full license text (OFL.txt) to understand the permissions, 71 - restrictions and requirements for usage, redistribution, and modification. 72 - 73 - You can use them in your products & projects – print or digital, 74 - commercial or otherwise. 75 - 76 - This isn't legal advice, please consider consulting a lawyer and see the full 77 - license for all details. 1 + Josefin Sans Variable Font 2 + ========================== 3 + 4 + This download contains Josefin Sans as both variable fonts and static fonts. 5 + 6 + Josefin Sans is a variable font with this axis: 7 + wght 8 + 9 + This means all the styles are contained in these files: 10 + Josefin_Sans/JosefinSans-VariableFont_wght.ttf 11 + Josefin_Sans/JosefinSans-Italic-VariableFont_wght.ttf 12 + 13 + If your app fully supports variable fonts, you can now pick intermediate styles 14 + that aren’t available as static fonts. Not all apps support variable fonts, and 15 + in those cases you can use the static font files for Josefin Sans: 16 + Josefin_Sans/static/JosefinSans-Thin.ttf 17 + Josefin_Sans/static/JosefinSans-ExtraLight.ttf 18 + Josefin_Sans/static/JosefinSans-Light.ttf 19 + Josefin_Sans/static/JosefinSans-Regular.ttf 20 + Josefin_Sans/static/JosefinSans-Medium.ttf 21 + Josefin_Sans/static/JosefinSans-SemiBold.ttf 22 + Josefin_Sans/static/JosefinSans-Bold.ttf 23 + Josefin_Sans/static/JosefinSans-ThinItalic.ttf 24 + Josefin_Sans/static/JosefinSans-ExtraLightItalic.ttf 25 + Josefin_Sans/static/JosefinSans-LightItalic.ttf 26 + Josefin_Sans/static/JosefinSans-Italic.ttf 27 + Josefin_Sans/static/JosefinSans-MediumItalic.ttf 28 + Josefin_Sans/static/JosefinSans-SemiBoldItalic.ttf 29 + Josefin_Sans/static/JosefinSans-BoldItalic.ttf 30 + 31 + Get started 32 + ----------- 33 + 34 + 1. Install the font files you want to use 35 + 36 + 2. Use your app's font picker to view the font family and all the 37 + available styles 38 + 39 + Learn more about variable fonts 40 + ------------------------------- 41 + 42 + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts 43 + https://variablefonts.typenetwork.com 44 + https://medium.com/variable-fonts 45 + 46 + In desktop apps 47 + 48 + https://theblog.adobe.com/can-variable-fonts-illustrator-cc 49 + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts 50 + 51 + Online 52 + 53 + https://developers.google.com/fonts/docs/getting_started 54 + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide 55 + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts 56 + 57 + Installing fonts 58 + 59 + MacOS: https://support.apple.com/en-us/HT201749 60 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux 61 + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows 62 + 63 + Android Apps 64 + 65 + https://developers.google.com/fonts/docs/android 66 + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts 67 + 68 + License 69 + ------- 70 + Please read the full license text (OFL.txt) to understand the permissions, 71 + restrictions and requirements for usage, redistribution, and modification. 72 + 73 + You can use them in your products & projects – print or digital, 74 + commercial or otherwise. 75 + 76 + This isn't legal advice, please consider consulting a lawyer and see the full 77 + license for all details.
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-Bold.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-Bold.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-BoldItalic.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-BoldItalic.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-ExtraLight.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-ExtraLight.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-ExtraLightItalic.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-ExtraLightItalic.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-Italic.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-Italic.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-Light.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-Light.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-LightItalic.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-LightItalic.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-Medium.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-Medium.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-MediumItalic.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-MediumItalic.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-Regular.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-Regular.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-SemiBold.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-SemiBold.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-SemiBoldItalic.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-SemiBoldItalic.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-Thin.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-Thin.ttf
backend/priv/static/fonts/Josefin_Sans/static/JosefinSans-ThinItalic.ttf client/priv/fonts/Josefin_Sans/static/JosefinSans-ThinItalic.ttf
+93 -93
backend/priv/static/fonts/Syne/OFL.txt client/priv/fonts/Syne/OFL.txt
··· 1 - Copyright 2017 The Syne Project Authors (https://gitlab.com/bonjour-monde/fonderie/syne-typeface) 2 - 3 - This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 - This license is copied below, and is also available with a FAQ at: 5 - https://openfontlicense.org 6 - 7 - 8 - ----------------------------------------------------------- 9 - SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 - ----------------------------------------------------------- 11 - 12 - PREAMBLE 13 - The goals of the Open Font License (OFL) are to stimulate worldwide 14 - development of collaborative font projects, to support the font creation 15 - efforts of academic and linguistic communities, and to provide a free and 16 - open framework in which fonts may be shared and improved in partnership 17 - with others. 18 - 19 - The OFL allows the licensed fonts to be used, studied, modified and 20 - redistributed freely as long as they are not sold by themselves. The 21 - fonts, including any derivative works, can be bundled, embedded, 22 - redistributed and/or sold with any software provided that any reserved 23 - names are not used by derivative works. The fonts and derivatives, 24 - however, cannot be released under any other type of license. The 25 - requirement for fonts to remain under this license does not apply 26 - to any document created using the fonts or their derivatives. 27 - 28 - DEFINITIONS 29 - "Font Software" refers to the set of files released by the Copyright 30 - Holder(s) under this license and clearly marked as such. This may 31 - include source files, build scripts and documentation. 32 - 33 - "Reserved Font Name" refers to any names specified as such after the 34 - copyright statement(s). 35 - 36 - "Original Version" refers to the collection of Font Software components as 37 - distributed by the Copyright Holder(s). 38 - 39 - "Modified Version" refers to any derivative made by adding to, deleting, 40 - or substituting -- in part or in whole -- any of the components of the 41 - Original Version, by changing formats or by porting the Font Software to a 42 - new environment. 43 - 44 - "Author" refers to any designer, engineer, programmer, technical 45 - writer or other person who contributed to the Font Software. 46 - 47 - PERMISSION & CONDITIONS 48 - Permission is hereby granted, free of charge, to any person obtaining 49 - a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 - redistribute, and sell modified and unmodified copies of the Font 51 - Software, subject to the following conditions: 52 - 53 - 1) Neither the Font Software nor any of its individual components, 54 - in Original or Modified Versions, may be sold by itself. 55 - 56 - 2) Original or Modified Versions of the Font Software may be bundled, 57 - redistributed and/or sold with any software, provided that each copy 58 - contains the above copyright notice and this license. These can be 59 - included either as stand-alone text files, human-readable headers or 60 - in the appropriate machine-readable metadata fields within text or 61 - binary files as long as those fields can be easily viewed by the user. 62 - 63 - 3) No Modified Version of the Font Software may use the Reserved Font 64 - Name(s) unless explicit written permission is granted by the corresponding 65 - Copyright Holder. This restriction only applies to the primary font name as 66 - presented to the users. 67 - 68 - 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 - Software shall not be used to promote, endorse or advertise any 70 - Modified Version, except to acknowledge the contribution(s) of the 71 - Copyright Holder(s) and the Author(s) or with their explicit written 72 - permission. 73 - 74 - 5) The Font Software, modified or unmodified, in part or in whole, 75 - must be distributed entirely under this license, and must not be 76 - distributed under any other license. The requirement for fonts to 77 - remain under this license does not apply to any document created 78 - using the Font Software. 79 - 80 - TERMINATION 81 - This license becomes null and void if any of the above conditions are 82 - not met. 83 - 84 - DISCLAIMER 85 - THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 - OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 - COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 - INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 - DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 - FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 - OTHER DEALINGS IN THE FONT SOFTWARE. 1 + Copyright 2017 The Syne Project Authors (https://gitlab.com/bonjour-monde/fonderie/syne-typeface) 2 + 3 + This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 + This license is copied below, and is also available with a FAQ at: 5 + https://openfontlicense.org 6 + 7 + 8 + ----------------------------------------------------------- 9 + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 + ----------------------------------------------------------- 11 + 12 + PREAMBLE 13 + The goals of the Open Font License (OFL) are to stimulate worldwide 14 + development of collaborative font projects, to support the font creation 15 + efforts of academic and linguistic communities, and to provide a free and 16 + open framework in which fonts may be shared and improved in partnership 17 + with others. 18 + 19 + The OFL allows the licensed fonts to be used, studied, modified and 20 + redistributed freely as long as they are not sold by themselves. The 21 + fonts, including any derivative works, can be bundled, embedded, 22 + redistributed and/or sold with any software provided that any reserved 23 + names are not used by derivative works. The fonts and derivatives, 24 + however, cannot be released under any other type of license. The 25 + requirement for fonts to remain under this license does not apply 26 + to any document created using the fonts or their derivatives. 27 + 28 + DEFINITIONS 29 + "Font Software" refers to the set of files released by the Copyright 30 + Holder(s) under this license and clearly marked as such. This may 31 + include source files, build scripts and documentation. 32 + 33 + "Reserved Font Name" refers to any names specified as such after the 34 + copyright statement(s). 35 + 36 + "Original Version" refers to the collection of Font Software components as 37 + distributed by the Copyright Holder(s). 38 + 39 + "Modified Version" refers to any derivative made by adding to, deleting, 40 + or substituting -- in part or in whole -- any of the components of the 41 + Original Version, by changing formats or by porting the Font Software to a 42 + new environment. 43 + 44 + "Author" refers to any designer, engineer, programmer, technical 45 + writer or other person who contributed to the Font Software. 46 + 47 + PERMISSION & CONDITIONS 48 + Permission is hereby granted, free of charge, to any person obtaining 49 + a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 + redistribute, and sell modified and unmodified copies of the Font 51 + Software, subject to the following conditions: 52 + 53 + 1) Neither the Font Software nor any of its individual components, 54 + in Original or Modified Versions, may be sold by itself. 55 + 56 + 2) Original or Modified Versions of the Font Software may be bundled, 57 + redistributed and/or sold with any software, provided that each copy 58 + contains the above copyright notice and this license. These can be 59 + included either as stand-alone text files, human-readable headers or 60 + in the appropriate machine-readable metadata fields within text or 61 + binary files as long as those fields can be easily viewed by the user. 62 + 63 + 3) No Modified Version of the Font Software may use the Reserved Font 64 + Name(s) unless explicit written permission is granted by the corresponding 65 + Copyright Holder. This restriction only applies to the primary font name as 66 + presented to the users. 67 + 68 + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 + Software shall not be used to promote, endorse or advertise any 70 + Modified Version, except to acknowledge the contribution(s) of the 71 + Copyright Holder(s) and the Author(s) or with their explicit written 72 + permission. 73 + 74 + 5) The Font Software, modified or unmodified, in part or in whole, 75 + must be distributed entirely under this license, and must not be 76 + distributed under any other license. The requirement for fonts to 77 + remain under this license does not apply to any document created 78 + using the Font Software. 79 + 80 + TERMINATION 81 + This license becomes null and void if any of the above conditions are 82 + not met. 83 + 84 + DISCLAIMER 85 + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 + OTHER DEALINGS IN THE FONT SOFTWARE.
+67 -67
backend/priv/static/fonts/Syne/README.txt client/priv/fonts/Syne/README.txt
··· 1 - Syne Variable Font 2 - ================== 3 - 4 - This download contains Syne as both a variable font and static fonts. 5 - 6 - Syne is a variable font with this axis: 7 - wght 8 - 9 - This means all the styles are contained in a single file: 10 - Syne/Syne-VariableFont_wght.ttf 11 - 12 - If your app fully supports variable fonts, you can now pick intermediate styles 13 - that aren’t available as static fonts. Not all apps support variable fonts, and 14 - in those cases you can use the static font files for Syne: 15 - Syne/static/Syne-Regular.ttf 16 - Syne/static/Syne-Medium.ttf 17 - Syne/static/Syne-SemiBold.ttf 18 - Syne/static/Syne-Bold.ttf 19 - Syne/static/Syne-ExtraBold.ttf 20 - 21 - Get started 22 - ----------- 23 - 24 - 1. Install the font files you want to use 25 - 26 - 2. Use your app's font picker to view the font family and all the 27 - available styles 28 - 29 - Learn more about variable fonts 30 - ------------------------------- 31 - 32 - https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts 33 - https://variablefonts.typenetwork.com 34 - https://medium.com/variable-fonts 35 - 36 - In desktop apps 37 - 38 - https://theblog.adobe.com/can-variable-fonts-illustrator-cc 39 - https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts 40 - 41 - Online 42 - 43 - https://developers.google.com/fonts/docs/getting_started 44 - https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide 45 - https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts 46 - 47 - Installing fonts 48 - 49 - MacOS: https://support.apple.com/en-us/HT201749 50 - Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux 51 - Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows 52 - 53 - Android Apps 54 - 55 - https://developers.google.com/fonts/docs/android 56 - https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts 57 - 58 - License 59 - ------- 60 - Please read the full license text (OFL.txt) to understand the permissions, 61 - restrictions and requirements for usage, redistribution, and modification. 62 - 63 - You can use them in your products & projects – print or digital, 64 - commercial or otherwise. 65 - 66 - This isn't legal advice, please consider consulting a lawyer and see the full 67 - license for all details. 1 + Syne Variable Font 2 + ================== 3 + 4 + This download contains Syne as both a variable font and static fonts. 5 + 6 + Syne is a variable font with this axis: 7 + wght 8 + 9 + This means all the styles are contained in a single file: 10 + Syne/Syne-VariableFont_wght.ttf 11 + 12 + If your app fully supports variable fonts, you can now pick intermediate styles 13 + that aren’t available as static fonts. Not all apps support variable fonts, and 14 + in those cases you can use the static font files for Syne: 15 + Syne/static/Syne-Regular.ttf 16 + Syne/static/Syne-Medium.ttf 17 + Syne/static/Syne-SemiBold.ttf 18 + Syne/static/Syne-Bold.ttf 19 + Syne/static/Syne-ExtraBold.ttf 20 + 21 + Get started 22 + ----------- 23 + 24 + 1. Install the font files you want to use 25 + 26 + 2. Use your app's font picker to view the font family and all the 27 + available styles 28 + 29 + Learn more about variable fonts 30 + ------------------------------- 31 + 32 + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts 33 + https://variablefonts.typenetwork.com 34 + https://medium.com/variable-fonts 35 + 36 + In desktop apps 37 + 38 + https://theblog.adobe.com/can-variable-fonts-illustrator-cc 39 + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts 40 + 41 + Online 42 + 43 + https://developers.google.com/fonts/docs/getting_started 44 + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide 45 + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts 46 + 47 + Installing fonts 48 + 49 + MacOS: https://support.apple.com/en-us/HT201749 50 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux 51 + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows 52 + 53 + Android Apps 54 + 55 + https://developers.google.com/fonts/docs/android 56 + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts 57 + 58 + License 59 + ------- 60 + Please read the full license text (OFL.txt) to understand the permissions, 61 + restrictions and requirements for usage, redistribution, and modification. 62 + 63 + You can use them in your products & projects – print or digital, 64 + commercial or otherwise. 65 + 66 + This isn't legal advice, please consider consulting a lawyer and see the full 67 + license for all details.
backend/priv/static/fonts/Syne/Syne-VariableFont_wght.ttf client/priv/fonts/Syne/Syne-VariableFont_wght.ttf
backend/priv/static/fonts/Syne/static/Syne-Bold.ttf client/priv/fonts/Syne/static/Syne-Bold.ttf
backend/priv/static/fonts/Syne/static/Syne-ExtraBold.ttf client/priv/fonts/Syne/static/Syne-ExtraBold.ttf
backend/priv/static/fonts/Syne/static/Syne-Medium.ttf client/priv/fonts/Syne/static/Syne-Medium.ttf
backend/priv/static/fonts/Syne/static/Syne-Regular.ttf client/priv/fonts/Syne/static/Syne-Regular.ttf
backend/priv/static/fonts/Syne/static/Syne-SemiBold.ttf client/priv/fonts/Syne/static/Syne-SemiBold.ttf
+69
build.rs
··· 1 + const MINIMUM_GLEAM_VERSION: (u32, u32, u32) = (1, 8, 1); 2 + fn main() { 3 + // The build script will be ran from the server directory, so we need to go up one directory to get to the root 4 + let root_path = match std::env::var("CARGO_MANIFEST_DIR") { 5 + Ok(path) => path + "/..", 6 + Err(_) => panic!("Failed to get root path"), 7 + }; 8 + // Tell Cargo that if the given file changes, to rerun this build script. 9 + println!("cargo::rerun-if-changed={}client/src", root_path); 10 + 11 + // Check if Gleam is installed and is the correct version 12 + let gleam_version = match std::process::Command::new("gleam") 13 + .arg("--version") 14 + .output() 15 + { 16 + Ok(output) => output, 17 + Err(_) => { 18 + let minimum_gleam_version = MINIMUM_GLEAM_VERSION.0.to_string() 19 + + "." 20 + + &MINIMUM_GLEAM_VERSION.1.to_string() 21 + + "." 22 + + &MINIMUM_GLEAM_VERSION.2.to_string(); 23 + 24 + panic!( 25 + "Could not find Gleam in path. Please install Gleam {} or higher.", 26 + minimum_gleam_version 27 + ); 28 + } 29 + }; 30 + let gleam_version = String::from_utf8_lossy(&gleam_version.stdout); 31 + let gleam_version = gleam_version.trim(); 32 + let gleam_version = gleam_version.split_whitespace().nth(1).unwrap(); 33 + let gleam_version = gleam_version.split('.').collect::<Vec<&str>>(); 34 + let gleam_version: (u32, u32, u32) = ( 35 + gleam_version[0].parse::<u32>().unwrap(), 36 + gleam_version[1].parse::<u32>().unwrap(), 37 + gleam_version[2].parse::<u32>().unwrap(), 38 + ); 39 + if gleam_version < MINIMUM_GLEAM_VERSION { 40 + let gleam_version = gleam_version.0.to_string() 41 + + "." 42 + + &gleam_version.1.to_string() 43 + + "." 44 + + &gleam_version.2.to_string(); 45 + let minimum_gleam_version = MINIMUM_GLEAM_VERSION.0.to_string() 46 + + "." 47 + + &MINIMUM_GLEAM_VERSION.1.to_string() 48 + + "." 49 + + &MINIMUM_GLEAM_VERSION.2.to_string(); 50 + panic!( 51 + "Gleam version {} or higher is required, found {}", 52 + minimum_gleam_version, gleam_version 53 + ); 54 + } 55 + 56 + // Compile the Gleam code: gleam run -m lustre/dev build --minify=true 57 + let lustre_result = std::process::Command::new("gleam") 58 + .current_dir(root_path + "/client") 59 + .args(&["run", "-m", "lustre/dev", "build", "--minify=true"]) 60 + .output() 61 + .expect("Failed to compile Gleam code"); 62 + if !lustre_result.status.success() { 63 + println!( 64 + "cargo:error={}", 65 + String::from_utf8_lossy(&lustre_result.stderr) 66 + ); 67 + panic!("Failed to compile Gleam code."); 68 + } 69 + }
+4
client/.gitignore
··· 1 + *.beam 2 + *.ez 3 + /build 4 + erl_crash.dump
+24
client/README.md
··· 1 + # lumina 2 + 3 + [![Package Version](https://img.shields.io/hexpm/v/lumina)](https://hex.pm/packages/lumina) 4 + [![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/lumina/) 5 + 6 + ```sh 7 + gleam add lumina@1 8 + ``` 9 + ```gleam 10 + import lumina 11 + 12 + pub fn main() { 13 + // TODO: An example of the project in use 14 + } 15 + ``` 16 + 17 + Further documentation can be found at <https://hexdocs.pm/lumina>. 18 + 19 + ## Development 20 + 21 + ```sh 22 + gleam run # Run the project 23 + gleam test # Run the tests 24 + ```
+14
client/gleam.toml
··· 1 + name = "lumina_client" 2 + version = "1.0.0" 3 + target = "javascript" 4 + 5 + [dependencies] 6 + gleam_json = "1.0.1" 7 + gleam_stdlib = "0.43.0" 8 + lustre = "4.6.3" 9 + lustre_ui = "~> 0.4" 10 + lustre_http = "~> 0.5.2" 11 + 12 + [dev-dependencies] 13 + gleeunit = "~> 1.0" 14 + lustre_dev_tools = "~> 1.0"
+19
client/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 + 7 + <title>Lumina</title> 8 + 9 + <link 10 + rel="stylesheet" 11 + href="/static/lumina.css" 12 + /> 13 + <script type="module" src="/static/lumina.min.mjs"></script> 14 + </head> 15 + 16 + <body> 17 + <div id="app"></div> 18 + </body> 19 + </html>
+58
client/manifest.toml
··· 1 + # This file was generated by Gleam 2 + # You typically do not need to edit this file 3 + 4 + packages = [ 5 + { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, 6 + { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, 7 + { name = "directories", version = "1.1.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "BDA521A4EB9EE3A7894F0DC863797878E91FF5C7826F7084B2E731E208BDB076" }, 8 + { name = "envoy", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "95FD059345AA982E89A0B6E2A3BF1CF43E17A7048DCD85B5B65D3B9E4E39D359" }, 9 + { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, 10 + { name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" }, 11 + { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, 12 + { name = "gleam_community_ansi", version = "1.4.2", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_regexp", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "479DEDC748D08B310C9FEB9C4CBEC46B95C874F7F4F2844304D6D20CA78A8BB5" }, 13 + { name = "gleam_community_colour", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "386CB9B01B33371538672EEA8A6375A0A0ADEF41F17C86DDCB81C92AD00DA610" }, 14 + { name = "gleam_crypto", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "8AE56026B3E05EBB1F076778478A762E9EB62B31AEEB4285755452F397029D22" }, 15 + { name = "gleam_erlang", version = "0.33.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "A1D26B80F01901B59AABEE3475DD4C18D27D58FA5C897D922FCB9B099749C064" }, 16 + { name = "gleam_fetch", version = "0.4.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "gleam_fetch", source = "hex", outer_checksum = "7446410A44A1D1328F5BC1FF4FC9CBD1570479EA69349237B3F82E34521CCC10" }, 17 + { name = "gleam_http", version = "3.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "A9EE0722106FCCAB8AD3BF9D0A3EFF92BFE8561D59B83BAE96EB0BE1938D4E0F" }, 18 + { name = "gleam_httpc", version = "4.1.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "1A38507AF26CACA145248733688703EADCB734EA971D4E34FB97B7613DECF132" }, 19 + { name = "gleam_javascript", version = "0.13.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "F98328FCF573DA6F3A35D7F6CB3F9FF19FD5224CCBA9151FCBEAA0B983AF2F58" }, 20 + { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, 21 + { name = "gleam_otp", version = "0.16.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "50DA1539FC8E8FA09924EB36A67A2BBB0AD6B27BCDED5A7EF627057CF69D035E" }, 22 + { name = "gleam_package_interface", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "80D8B1842ACC6CF50E53FF1B220FF57E2B3A60FAF19DD885EC683CDED64C2C52" }, 23 + { name = "gleam_regexp", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "7F5E0C0BBEB3C58E57C9CB05FA9002F970C85AD4A63BA1E55CBCB35C15809179" }, 24 + { name = "gleam_stdlib", version = "0.43.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "69EF22E78FDCA9097CBE7DF91C05B2A8B5436826D9F66680D879182C0860A747" }, 25 + { name = "glearray", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "2CDF973B9ECE4A1AB8FBFB719AA37D9F3F1FF947B260C1B21ED5B608B52BC111" }, 26 + { name = "gleeunit", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "0E6C83834BA65EDCAAF4FE4FB94AC697D9262D83E6F58A750D63C9F6C8A9D9FF" }, 27 + { name = "glint", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "EA4B47B5A6147CA524AE81862EE1BE1C5A194757B26897233BD26BD3F7A54930" }, 28 + { name = "glisten", version = "6.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging", "telemetry"], otp_app = "glisten", source = "hex", outer_checksum = "912132751031473CB38F454120124FFC96AF6B0EA33D92C9C90DB16327A2A972" }, 29 + { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, 30 + { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, 31 + { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, 32 + { name = "lustre", version = "4.6.3", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "BDF833368F6C8F152F948D5B6A79866E9881CB80CB66C0685B3327E7DCBFB12F" }, 33 + { name = "lustre_dev_tools", version = "1.6.2", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_regexp", "gleam_stdlib", "glint", "glisten", "lustre", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "A0CBC323AA7E03EC91D785CEB644776082D76BE46F1624FB920BB92BD79853F7" }, 34 + { name = "lustre_http", version = "0.5.2", build_tools = ["gleam"], requirements = ["gleam_fetch", "gleam_http", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_http", source = "hex", outer_checksum = "FB0478CBFA6B16DBE8ECA326DAE2EC15645E04900595EF2C4F039ABFA0512ABA" }, 35 + { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, 36 + { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, 37 + { name = "mist", version = "3.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "CDA1A74E768419235E16886463EC4722EFF4AB3F8D820A76EAD45D7C167D7282" }, 38 + { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, 39 + { name = "ranger", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "B8F3AFF23A3A5B5D9526B8D18E7C43A7DFD3902B151B97EC65397FE29192B695" }, 40 + { name = "repeatedly", version = "2.1.2", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "93AE1938DDE0DC0F7034F32C1BF0D4E89ACEBA82198A1FE21F604E849DA5F589" }, 41 + { name = "simplifile", version = "2.2.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0DFABEF7DC7A9E2FF4BB27B108034E60C81BEBFCB7AB816B9E7E18ED4503ACD8" }, 42 + { name = "snag", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "7E9F06390040EB5FAB392CE642771484136F2EC103A92AE11BA898C8167E6E17" }, 43 + { name = "spinner", version = "1.3.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "21BDE7FF9D7D9ACBB4086C0D5C86F0A90CE6B0F3CB593B41D03384AE7724B5B4" }, 44 + { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, 45 + { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, 46 + { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, 47 + { name = "tom", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0910EE688A713994515ACAF1F486A4F05752E585B9E3209D8F35A85B234C2719" }, 48 + { name = "wisp", version = "1.5.1", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "DB7968F777CA77B41AAC8067A5151B022E857E1EECF16BFC9D5F914D0F628844" }, 49 + ] 50 + 51 + [requirements] 52 + gleam_json = { version = "1.0.1" } 53 + gleam_stdlib = { version = "0.43.0" } 54 + gleeunit = { version = "~> 1.0" } 55 + lustre = { version = "4.6.3" } 56 + lustre_dev_tools = { version = "~> 1.0" } 57 + lustre_http = { version = "~> 0.5.2" } 58 + lustre_ui = { version = "~> 0.4" }
+3
client/priv/static/lumina_client.min.mjs
··· 1 + var a=class{withFields(t){let r=Object.keys(this).map(n=>n in t?t[n]:this[n]);return new this.constructor(...r)}},B=class{static fromArray(t,r){let n=r||new nt;for(let i=t.length-1;i>=0;--i)n=new Be(t[i],n);return n}[Symbol.iterator](){return new Qt(this)}toArray(){return[...this]}atLeastLength(t){for(let r of this){if(t<=0)return!0;t--}return t<=0}hasLength(t){for(let r of this){if(t<=0)return!1;t--}return t===0}countLength(){let t=0;for(let r of this)t++;return t}};function f(e,t){return new Be(e,t)}function c(e,t){return B.fromArray(e,t)}var Qt=class{#e;constructor(t){this.#e=t}next(){if(this.#e instanceof nt)return{done:!0};{let{head:t,tail:r}=this.#e;return this.#e=r,{value:t,done:!1}}}},nt=class extends B{},Be=class extends B{constructor(t,r){super(),this.head=t,this.tail=r}},it=class e{constructor(t){if(!(t instanceof Uint8Array))throw"BitArray can only be constructed from a Uint8Array";this.buffer=t}get length(){return this.buffer.length}byteAt(t){return this.buffer[t]}floatFromSlice(t,r,n){return Mi(this.buffer,t,r,n)}intFromSlice(t,r,n,i){return Ii(this.buffer,t,r,n,i)}binaryFromSlice(t,r){let n=new Uint8Array(this.buffer.buffer,this.buffer.byteOffset+t,r-t);return new e(n)}sliceAfter(t){let r=new Uint8Array(this.buffer.buffer,this.buffer.byteOffset+t,this.buffer.byteLength-t);return new e(r)}};function Ii(e,t,r,n,i){let s=r-t;if(s<=6){let o=0;if(n)for(let u=t;u<r;u++)o=o*256+e[u];else for(let u=r-1;u>=t;u--)o=o*256+e[u];if(i){let u=2**(s*8-1);o>=u&&(o-=u*2)}return o}else{let o=0n;if(n)for(let u=t;u<r;u++)o=(o<<8n)+BigInt(e[u]);else for(let u=r-1;u>=t;u--)o=(o<<8n)+BigInt(e[u]);if(i){let u=1n<<BigInt(s*8-1);o>=u&&(o-=u*2n)}return Number(o)}}function Mi(e,t,r,n){let i=new DataView(e.buffer),s=r-t;if(s===8)return i.getFloat64(t,!n);if(s===4)return i.getFloat32(t,!n);{let o=`Sized floats must be 32-bit or 64-bit on JavaScript, got size of ${s*8} bits`;throw new globalThis.Error(o)}}var xe=class e extends a{static isResult(t){return t instanceof e}},p=class extends xe{constructor(t){super(),this[0]=t}isOk(){return!0}},d=class extends xe{constructor(t){super(),this[0]=t}isOk(){return!1}};function g(e,t){let r=[e,t];for(;r.length;){let n=r.pop(),i=r.pop();if(n===i)continue;if(!Xr(n)||!Xr(i)||!Ki(n,i)||Ui(n,i)||Wi(n,i)||Hi(n,i)||Gi(n,i)||Ji(n,i)||Yi(n,i))return!1;let o=Object.getPrototypeOf(n);if(o!==null&&typeof o.equals=="function")try{if(n.equals(i))continue;return!1}catch{}let[u,l]=Ri(n);for(let x of u(n))r.push(l(n,x),l(i,x))}return!0}function Ri(e){if(e instanceof Map)return[t=>t.keys(),(t,r)=>t.get(r)];{let t=e instanceof globalThis.Error?["message"]:[];return[r=>[...t,...Object.keys(r)],(r,n)=>r[n]]}}function Ui(e,t){return e instanceof Date&&(e>t||e<t)}function Wi(e,t){return e.buffer instanceof ArrayBuffer&&e.BYTES_PER_ELEMENT&&!(e.byteLength===t.byteLength&&e.every((r,n)=>r===t[n]))}function Hi(e,t){return Array.isArray(e)&&e.length!==t.length}function Gi(e,t){return e instanceof Map&&e.size!==t.size}function Ji(e,t){return e instanceof Set&&(e.size!=t.size||[...e].some(r=>!t.has(r)))}function Yi(e,t){return e instanceof RegExp&&(e.source!==t.source||e.flags!==t.flags)}function Xr(e){return typeof e=="object"&&e!==null}function Ki(e,t){return typeof e!="object"&&typeof t!="object"&&(!e||!t)||[Promise,WeakSet,WeakMap,Function].some(n=>e instanceof n)?!1:e.constructor===t.constructor}function se(e,t,r,n,i,s){let o=new globalThis.Error(i);o.gleam_error=e,o.module=t,o.line=r,o.function=n,o.fn=n;for(let u in s)o[u]=s[u];return o}var _=class extends a{constructor(t){super(),this[0]=t}},m=class extends a{};function oe(e,t){if(e instanceof _){let r=e[0];return new p(r)}else return new d(t)}function st(e){if(e.isOk()){let t=e[0];return new _(t)}else return new m}function me(e,t){return e instanceof _?e[0]:t}function er(e,t){if(e instanceof _){let r=e[0];return new _(t(r))}else return new m}var ot=class extends a{constructor(t,r){super(),this.content=t,this.submatches=r}},ut=class extends a{constructor(t,r){super(),this.error=t,this.byte_index=r}},lt=class extends a{constructor(t,r){super(),this.case_insensitive=t,this.multi_line=r}};function Zr(e,t){return tn(e,t)}function Qr(e,t){return rn(e,t)}var nn=new WeakMap,tr=new DataView(new ArrayBuffer(8)),rr=0;function nr(e){let t=nn.get(e);if(t!==void 0)return t;let r=rr++;return rr===2147483647&&(rr=0),nn.set(e,r),r}function ir(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}function or(e){let t=0,r=e.length;for(let n=0;n<r;n++)t=Math.imul(31,t)+e.charCodeAt(n)|0;return t}function sn(e){tr.setFloat64(0,e);let t=tr.getInt32(0),r=tr.getInt32(4);return Math.imul(73244475,t>>16^t)^r}function Vi(e){return or(e.toString())}function Xi(e){let t=Object.getPrototypeOf(e);if(t!==null&&typeof t.hashCode=="function")try{let n=e.hashCode(e);if(typeof n=="number")return n}catch{}if(e instanceof Promise||e instanceof WeakSet||e instanceof WeakMap)return nr(e);if(e instanceof Date)return sn(e.getTime());let r=0;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),Array.isArray(e)||e instanceof Uint8Array)for(let n=0;n<e.length;n++)r=Math.imul(31,r)+z(e[n])|0;else if(e instanceof Set)e.forEach(n=>{r=r+z(n)|0});else if(e instanceof Map)e.forEach((n,i)=>{r=r+ir(z(n),z(i))|0});else{let n=Object.keys(e);for(let i=0;i<n.length;i++){let s=n[i],o=e[s];r=r+ir(z(o),or(s))|0}}return r}function z(e){if(e===null)return 1108378658;if(e===void 0)return 1108378659;if(e===!0)return 1108378657;if(e===!1)return 1108378656;switch(typeof e){case"number":return sn(e);case"string":return or(e);case"bigint":return Vi(e);case"object":return Xi(e);case"symbol":return nr(e);case"function":return nr(e);default:return 0}}var H=5,ur=Math.pow(2,H),Zi=ur-1,Qi=ur/2,es=ur/4,C=0,W=1,L=2,ue=3,lr={type:L,bitmap:0,array:[]};function je(e,t){return e>>>t&Zi}function ct(e,t){return 1<<je(e,t)}function ts(e){return e-=e>>1&1431655765,e=(e&858993459)+(e>>2&858993459),e=e+(e>>4)&252645135,e+=e>>8,e+=e>>16,e&127}function ar(e,t){return ts(e&t-1)}function P(e,t,r){let n=e.length,i=new Array(n);for(let s=0;s<n;++s)i[s]=e[s];return i[t]=r,i}function rs(e,t,r){let n=e.length,i=new Array(n+1),s=0,o=0;for(;s<t;)i[o++]=e[s++];for(i[o++]=r;s<n;)i[o++]=e[s++];return i}function sr(e,t){let r=e.length,n=new Array(r-1),i=0,s=0;for(;i<t;)n[s++]=e[i++];for(++i;i<r;)n[s++]=e[i++];return n}function on(e,t,r,n,i,s){let o=z(t);if(o===n)return{type:ue,hash:o,array:[{type:C,k:t,v:r},{type:C,k:i,v:s}]};let u={val:!1};return Le(cr(lr,e,o,t,r,u),e,n,i,s,u)}function Le(e,t,r,n,i,s){switch(e.type){case W:return ns(e,t,r,n,i,s);case L:return cr(e,t,r,n,i,s);case ue:return is(e,t,r,n,i,s)}}function ns(e,t,r,n,i,s){let o=je(r,t),u=e.array[o];if(u===void 0)return s.val=!0,{type:W,size:e.size+1,array:P(e.array,o,{type:C,k:n,v:i})};if(u.type===C)return g(n,u.k)?i===u.v?e:{type:W,size:e.size,array:P(e.array,o,{type:C,k:n,v:i})}:(s.val=!0,{type:W,size:e.size,array:P(e.array,o,on(t+H,u.k,u.v,r,n,i))});let l=Le(u,t+H,r,n,i,s);return l===u?e:{type:W,size:e.size,array:P(e.array,o,l)}}function cr(e,t,r,n,i,s){let o=ct(r,t),u=ar(e.bitmap,o);if(e.bitmap&o){let l=e.array[u];if(l.type!==C){let $=Le(l,t+H,r,n,i,s);return $===l?e:{type:L,bitmap:e.bitmap,array:P(e.array,u,$)}}let x=l.k;return g(n,x)?i===l.v?e:{type:L,bitmap:e.bitmap,array:P(e.array,u,{type:C,k:n,v:i})}:(s.val=!0,{type:L,bitmap:e.bitmap,array:P(e.array,u,on(t+H,x,l.v,r,n,i))})}else{let l=e.array.length;if(l>=Qi){let x=new Array(32),$=je(r,t);x[$]=cr(lr,t+H,r,n,i,s);let y=0,b=e.bitmap;for(let U=0;U<32;U++){if(b&1){let j=e.array[y++];x[U]=j}b=b>>>1}return{type:W,size:l+1,array:x}}else{let x=rs(e.array,u,{type:C,k:n,v:i});return s.val=!0,{type:L,bitmap:e.bitmap|o,array:x}}}}function is(e,t,r,n,i,s){if(r===e.hash){let o=fr(e,n);if(o!==-1)return e.array[o].v===i?e:{type:ue,hash:r,array:P(e.array,o,{type:C,k:n,v:i})};let u=e.array.length;return s.val=!0,{type:ue,hash:r,array:P(e.array,u,{type:C,k:n,v:i})}}return Le({type:L,bitmap:ct(e.hash,t),array:[e]},t,r,n,i,s)}function fr(e,t){let r=e.array.length;for(let n=0;n<r;n++)if(g(t,e.array[n].k))return n;return-1}function at(e,t,r,n){switch(e.type){case W:return ss(e,t,r,n);case L:return os(e,t,r,n);case ue:return us(e,n)}}function ss(e,t,r,n){let i=je(r,t),s=e.array[i];if(s!==void 0){if(s.type!==C)return at(s,t+H,r,n);if(g(n,s.k))return s}}function os(e,t,r,n){let i=ct(r,t);if(!(e.bitmap&i))return;let s=ar(e.bitmap,i),o=e.array[s];if(o.type!==C)return at(o,t+H,r,n);if(g(n,o.k))return o}function us(e,t){let r=fr(e,t);if(!(r<0))return e.array[r]}function pr(e,t,r,n){switch(e.type){case W:return ls(e,t,r,n);case L:return as(e,t,r,n);case ue:return cs(e,n)}}function ls(e,t,r,n){let i=je(r,t),s=e.array[i];if(s===void 0)return e;let o;if(s.type===C){if(!g(s.k,n))return e}else if(o=pr(s,t+H,r,n),o===s)return e;if(o===void 0){if(e.size<=es){let u=e.array,l=new Array(e.size-1),x=0,$=0,y=0;for(;x<i;){let b=u[x];b!==void 0&&(l[$]=b,y|=1<<x,++$),++x}for(++x;x<u.length;){let b=u[x];b!==void 0&&(l[$]=b,y|=1<<x,++$),++x}return{type:L,bitmap:y,array:l}}return{type:W,size:e.size-1,array:P(e.array,i,o)}}return{type:W,size:e.size,array:P(e.array,i,o)}}function as(e,t,r,n){let i=ct(r,t);if(!(e.bitmap&i))return e;let s=ar(e.bitmap,i),o=e.array[s];if(o.type!==C){let u=pr(o,t+H,r,n);return u===o?e:u!==void 0?{type:L,bitmap:e.bitmap,array:P(e.array,s,u)}:e.bitmap===i?void 0:{type:L,bitmap:e.bitmap^i,array:sr(e.array,s)}}return g(n,o.k)?e.bitmap===i?void 0:{type:L,bitmap:e.bitmap^i,array:sr(e.array,s)}:e}function cs(e,t){let r=fr(e,t);if(r<0)return e;if(e.array.length!==1)return{type:ue,hash:e.hash,array:sr(e.array,r)}}function un(e,t){if(e===void 0)return;let r=e.array,n=r.length;for(let i=0;i<n;i++){let s=r[i];if(s!==void 0){if(s.type===C){t(s.v,s.k);continue}un(s,t)}}}var le=class e{static fromObject(t){let r=Object.keys(t),n=e.new();for(let i=0;i<r.length;i++){let s=r[i];n=n.set(s,t[s])}return n}static fromMap(t){let r=e.new();return t.forEach((n,i)=>{r=r.set(i,n)}),r}static new(){return new e(void 0,0)}constructor(t,r){this.root=t,this.size=r}get(t,r){if(this.root===void 0)return r;let n=at(this.root,0,z(t),t);return n===void 0?r:n.v}set(t,r){let n={val:!1},i=this.root===void 0?lr:this.root,s=Le(i,0,z(t),t,r,n);return s===this.root?this:new e(s,n.val?this.size+1:this.size)}delete(t){if(this.root===void 0)return this;let r=pr(this.root,0,z(t),t);return r===this.root?this:r===void 0?e.new():new e(r,this.size-1)}has(t){return this.root===void 0?!1:at(this.root,0,z(t),t)!==void 0}entries(){if(this.root===void 0)return[];let t=[];return this.forEach((r,n)=>t.push([n,r])),t}forEach(t){un(this.root,t)}hashCode(){let t=0;return this.forEach((r,n)=>{t=t+ir(z(r),z(n))|0}),t}equals(t){if(!(t instanceof e)||this.size!==t.size)return!1;let r=!0;return this.forEach((n,i)=>{r=r&&g(t.get(i,!n),n)}),r}};var dr=void 0,ln={};function pn(e){return/^[-+]?(\d+)$/.test(e)?new p(parseInt(e)):new d(dr)}function dn(e){return e.toString()}function xn(e){if(e==="")return 0;let t=xr(e);if(t){let r=0;for(let n of t)r++;return r}else return e.match(/./gsu).length}var an;function xr(e){if(globalThis.Intl&&Intl.Segmenter)return an||=new Intl.Segmenter,an.segment(e)[Symbol.iterator]()}function mn(e){let t,r=xr(e);return r?t=r.next().value?.segment:t=e.match(/./su)?.[0],t?new p([t,e.slice(t.length)]):new d(dr)}function mr(e){return e.toLowerCase()}function _r(e){let t="";for(let r of e)t=t+r;return t}function $r(e,t,r){if(r<=0||t>=e.length)return"";let n=xr(e);if(n){for(;t-- >0;)n.next();let i="";for(;r-- >0;){let s=n.next().value;if(s===void 0)break;i+=s.segment}return i}else return e.match(/./gsu).slice(t,t+r).join("")}function _n(e,t){return e.startsWith(t)}var $n=[" "," ",` 2 + `,"\v","\f","\r","\x85","\u2028","\u2029"].join(""),Bu=new RegExp(`^([${$n}]*)`,"g"),Ou=new RegExp(`([${$n}]*)$`,"g");function tn(e,t){try{let r="gu";return t.case_insensitive&&(r+="i"),t.multi_line&&(r+="m"),new p(new RegExp(e,r))}catch(r){let n=(r.columnNumber||0)|0;return new d(new ut(r.message,n))}}function rn(e,t){let r=Array.from(t.matchAll(e)).map(n=>{let i=n[0],s=[];for(let o=n.length-1;o>0;o--){if(n[o]){s[o-1]=new _(n[o]);continue}s.length>0&&(s[o-1]=new m)}return new ot(i,B.fromArray(s))});return B.fromArray(r)}function hn(){return le.new()}function ft(e){return B.fromArray(e.entries())}function wn(e,t){let r=e.get(t,ln);return r===ln?new d(dr):new p(r)}function gn(e,t,r){return r.set(e,t)}function hr(e){if(typeof e=="string")return"String";if(typeof e=="boolean")return"Bool";if(e instanceof xe)return"Result";if(e instanceof B)return"List";if(e instanceof it)return"BitArray";if(e instanceof le)return"Dict";if(Number.isInteger(e))return"Int";if(Array.isArray(e))return`Tuple of ${e.length} elements`;if(typeof e=="number")return"Float";if(e===null)return"Null";if(e===void 0)return"Nil";{let t=typeof e;return t.charAt(0).toUpperCase()+t.slice(1)}}function wr(e,t){return fs(e,hr(t))}function fs(e,t){return new d(B.fromArray([new te(e,t,B.fromArray([]))]))}function yn(e){return typeof e=="string"?new p(e):wr("String",e)}function bn(e){return Number.isInteger(e)?new p(e):wr("Int",e)}function Fn(e,t){let r=()=>wr("Dict",e);if(e instanceof le||e instanceof WeakMap||e instanceof Map){let n=wn(e,t);return new p(n.isOk()?new _(n[0]):new m)}else return e===null?r():Object.getPrototypeOf(e)==Object.prototype?cn(e,t,()=>new p(new m)):cn(e,t,r)}function cn(e,t,r){try{return t in e?new p(new _(e[t])):r()}catch{return r()}}function dt(e){return pn(e)}function I(e){return dn(e)}function ne(){return hn()}function qe(e,t,r){return gn(t,r,e)}function ws(e,t){for(;;){let r=e,n=t;if(r.hasLength(0))return n;{let i=r.head;e=r.tail,t=f(i,n)}}}function gs(e,t){for(;;){let r=e,n=t;if(r.hasLength(0))return ws(n,c([]));{let i=r.head;e=r.tail,t=f(i[0],n)}}}function ys(e){let t=ft(e);return gs(t,c([]))}function gr(e){return ys(e)}function An(e){return e[1]}function Fs(e,t){for(;;){let r=e,n=t;if(r.hasLength(0))return n;{let i=r.head;e=r.tail,t=f(i,n)}}}function V(e){return Fs(e,c([]))}function vn(e){if(e.hasLength(0))return new d(void 0);{let t=e.head;return new p(t)}}function Es(e,t,r){for(;;){let n=e,i=t,s=r;if(n.hasLength(0))return V(s);{let o=n.head;e=n.tail,t=i,r=f(i(o),s)}}}function X(e,t){return Es(e,t,c([]))}function ks(e,t){for(;;){let r=e,n=t;if(r.hasLength(0))return n;{let i=r.head;e=r.tail,t=f(i,n)}}}function Se(e,t){return ks(V(e),t)}function As(e,t){for(;;){let r=e,n=t;if(r.hasLength(0))return n;{let i=r.head;e=r.tail,t=f(i,n)}}}function Ds(e,t){for(;;){let r=e,n=t;if(r.hasLength(0))return V(n);{let i=r.head;e=r.tail,t=As(i,n)}}}function xt(e){return Ds(e,c([]))}function ae(e,t,r){for(;;){let n=e,i=t,s=r;if(n.hasLength(0))return i;{let o=n.head;e=n.tail,t=s(i,o),r=s}}}function Cs(e,t,r,n){for(;;){let i=e,s=t,o=r,u=n;if(i.hasLength(0))return s;{let l=i.head;e=i.tail,t=o(s,l,u),r=o,n=u+1}}}function mt(e,t,r){return Cs(e,t,r,0)}function vs(e,t,r){for(;;){let n=e,i=t,s=r;if(i<=0)return s;e=n,t=i-1,r=f(n,s)}}function Bn(e,t){return vs(e,t,c([]))}function ce(e){return _r(e)}function fe(e){return e}function Ln(e){return xn(e)}function pe(e){return mr(e)}function qs(e,t,r){if(r<0)return"";if(t<0){let s=Ln(e)+t;return s<0?"":$r(e,s,r)}else return $r(e,t,r)}function Er(e,t){return t<0?e:qs(e,t,Ln(e)-t)}function qn(e,t){return _n(e,t)}function kr(e){let r=ce(e);return fe(r)}function Ne(e){return mn(e)}function J(e,t){if(e.isOk()){let r=e[0];return new p(t(r))}else{let r=e[0];return new d(r)}}function _t(e,t){if(e.isOk()){let r=e[0];return new p(r)}else{let r=e[0];return new d(t(r))}}function Z(e,t){if(e.isOk()){let r=e[0];return t(r)}else{let r=e[0];return new d(r)}}function q(e,t){return Z(e,t)}function Ar(e,t){return e.isOk()?e[0]:t}function Nn(e,t){if(e.isOk()){let r=e[0];return new p(r)}else return new d(t)}var te=class extends a{constructor(t,r,n){super(),this.expected=t,this.found=r,this.path=n}};function $t(e){return hr(e)}function Ps(e){return bn(e)}function ht(e){return t=>{if(e.hasLength(0))return new d(c([new te("another type",$t(t),c([]))]));{let r=e.head,n=e.tail,i=r(t);if(i.isOk()){let s=i[0];return new p(s)}else return ht(n)(t)}}}function zn(e){return e.isOk()?c([]):e[0]}function Is(e,t){let r=t,n=ht(c([ye,o=>J(Ps(o),I)])),i=(()=>{let o=n(r);if(o.isOk())return o[0];{let u=c(["<",$t(r),">"]),l=ce(u);return fe(l)}})(),s=e;return new te(s.expected,s.found,f(i,e.path))}function Ms(e,t){return _t(e,r=>X(r,t))}function ye(e){return yn(e)}function de(e,t){return r=>{let n=new te("field","nothing",c([]));return Z(Fn(r,e),i=>{let o=oe(i,c([n])),u=Z(o,t);return Ms(u,l=>Is(l,e))})}}function Dr(e,t,r){return n=>{let i=t(n),s=r(n);if(i.isOk()&&s.isOk()){let o=i[0],u=s[0];return new p(e(o,u))}else{let o=i,u=s;return new d(xt(c([zn(o),zn(u)])))}}}function wt(e,t,r){return e?t:r()}function Pn(e){try{let t=JSON.parse(e);return new p(t)}catch(t){return new d(Hs(t,e))}}function Hs(e,t){return Gs(e)?new yt:Js(e,t)}function Gs(e){return/((unexpected (end|eof))|(end of data)|(unterminated string)|(json( parse error|\.parse)\: expected '(\:|\}|\])'))/i.test(e.message)}function Js(e,t){let r=[Ys,Ks,Xs,Vs];for(let n of r){let i=n(e,t);if(i)return i}return new ie("",0)}function Ys(e){let r=/unexpected token '(.)', ".+" is not valid JSON/i.exec(e.message);if(!r)return null;let n=gt(r[1]);return new ie(n,-1)}function Ks(e){let r=/unexpected token (.) in JSON at position (\d+)/i.exec(e.message);if(!r)return null;let n=gt(r[1]),i=Number(r[2]);return new ie(n,i)}function Vs(e,t){let n=/(unexpected character|expected .*) at line (\d+) column (\d+)/i.exec(e.message);if(!n)return null;let i=Number(n[2]),s=Number(n[3]),o=Zs(i,s,t),u=gt(t[o]);return new ie(u,o)}function Xs(e){let r=/unexpected (identifier|token) "(.)"/i.exec(e.message);if(!r)return null;let n=gt(r[2]);return new ie(n,0)}function gt(e){return"0x"+e.charCodeAt(0).toString(16).toUpperCase()}function Zs(e,t,r){if(e===1)return t-1;let n=1,i=0;return r.split("").find((s,o)=>(s===` 3 + `&&(n+=1),n===e?(i=o+t,!0):!1)),i}var yt=class extends a{},ie=class extends a{constructor(t,r){super(),this.byte=t,this.position=r}};var vr=class extends a{constructor(t){super(),this[0]=t}};function to(e,t){return q(Pn(e),r=>{let n=t(r);return _t(n,i=>new vr(i))})}function In(e,t){return to(e,t)}var bt=class extends a{constructor(t){super(),this.all=t}};function Mn(e){return new bt(c([t=>e(t.dispatch,t.emit,t.select,t.root)]))}function Rn(e){return Mn((t,r,n,i)=>e(t))}function Pe(){return new bt(c([]))}var Fe=class extends a{constructor(t){super(),this.content=t}},k=class extends a{constructor(t,r,n,i,s,o,u){super(),this.key=t,this.namespace=r,this.tag=n,this.attrs=i,this.children=s,this.self_closing=o,this.void=u}},Re=class extends a{constructor(t){super(),this.subtree=t}},Ee=class extends a{constructor(t,r,n){super(),this[0]=t,this[1]=r,this.as_property=n}},Ue=class extends a{constructor(t,r){super(),this[0]=t,this[1]=r}};function uo(e){if(e instanceof Ee)return new d(void 0);{let t=e[0],r=e[1],n=Er(t,2);return new p([n,r])}}function lo(e,t,r){return mt(e,t,(n,i,s)=>{let o=r+"-"+I(s);return Hn(i,n,o)})}function Hn(e,t,r){for(;;){let n=e,i=t,s=r;if(n instanceof Fe)return i;if(n instanceof Re){let o=n.subtree;e=o(),t=i,r=s}else{let o=n.attrs,u=n.children,l=ae(o,i,(x,$)=>{let y=uo($);if(y.isOk()){let b=y[0][0],U=y[0][1];return qe(x,s+"-"+b,U)}else return x});return lo(u,l,s)}}}function Gn(e){return Hn(e,ne(),"0")}function R(e,t){return new Ee(e,t,!1)}function Yn(e,t){return new Ue("on"+e,t)}function O(e){return R("style",ae(e,"",(t,r)=>{let n=r[0],i=r[1];return t+n+":"+i+";"}))}function A(e){return R("class",e)}function Kn(e){return R("type",e)}function We(e,t,r){return e==="area"?new k("","",e,t,c([]),!1,!0):e==="base"?new k("","",e,t,c([]),!1,!0):e==="br"?new k("","",e,t,c([]),!1,!0):e==="col"?new k("","",e,t,c([]),!1,!0):e==="embed"?new k("","",e,t,c([]),!1,!0):e==="hr"?new k("","",e,t,c([]),!1,!0):e==="img"?new k("","",e,t,c([]),!1,!0):e==="input"?new k("","",e,t,c([]),!1,!0):e==="link"?new k("","",e,t,c([]),!1,!0):e==="meta"?new k("","",e,t,c([]),!1,!0):e==="param"?new k("","",e,t,c([]),!1,!0):e==="source"?new k("","",e,t,c([]),!1,!0):e==="track"?new k("","",e,t,c([]),!1,!0):e==="wbr"?new k("","",e,t,c([]),!1,!0):new k("","",e,t,r,!1,!1)}function ke(e){return new Fe(e)}var jr=class extends a{constructor(t){super(),this.dict=t}};function Xn(){return new jr(ne())}var Ft=class extends a{constructor(t){super(),this[0]=t}},Et=class extends a{constructor(t,r){super(),this[0]=t,this[1]=r}},kt=class extends a{constructor(t,r){super(),this[0]=t,this[1]=r}};function Qn(e){return g(e.created,ne())&&g(e.removed,Xn())&&g(e.updated,ne())}var At=class extends a{constructor(t){super(),this[0]=t}},Dt=class extends a{constructor(t,r){super(),this[0]=t,this[1]=r}},He=class extends a{constructor(t){super(),this[0]=t}},K=class extends a{constructor(t){super(),this[0]=t}},Ge=class extends a{constructor(t,r){super(),this[0]=t,this[1]=r}},Ct=class extends a{constructor(t,r){super(),this[0]=t,this[1]=r}};var Je=class extends a{},vt=class extends a{constructor(t,r){super(),this[0]=t,this[1]=r}},Bt=class extends a{constructor(t){super(),this[0]=t}},Ot=class extends a{constructor(t){super(),this[0]=t}};globalThis.customElements&&!globalThis.customElements.get("lustre-fragment")&&globalThis.customElements.define("lustre-fragment",class extends HTMLElement{constructor(){super()}});function Lr(e,t,r){let n,i=[{prev:e,next:t,parent:e.parentNode}];for(;i.length;){let{prev:s,next:o,parent:u}=i.pop();for(;o.subtree!==void 0;)o=o.subtree();if(o.content!==void 0)if(s)if(s.nodeType===Node.TEXT_NODE)s.textContent!==o.content&&(s.textContent=o.content),n??=s;else{let l=document.createTextNode(o.content);u.replaceChild(l,s),n??=l}else{let l=document.createTextNode(o.content);u.appendChild(l),n??=l}else if(o.tag!==void 0){let l=mo({prev:s,next:o,dispatch:r,stack:i});s?s!==l&&u.replaceChild(l,s):u.appendChild(l),n??=l}}return n}function mo({prev:e,next:t,dispatch:r,stack:n}){let i=t.namespace||"http://www.w3.org/1999/xhtml",s=e&&e.nodeType===Node.ELEMENT_NODE&&e.localName===t.tag&&e.namespaceURI===(t.namespace||"http://www.w3.org/1999/xhtml"),o=s?e:i?document.createElementNS(i,t.tag):document.createElement(t.tag),u;if(Ye.has(o))u=Ye.get(o);else{let h=new Map;Ye.set(o,h),u=h}let l=s?new Set(u.keys()):null,x=s?new Set(Array.from(e.attributes,h=>h.name)):null,$=null,y=null,b=null;if(s&&t.tag==="textarea"){let h=t.children[Symbol.iterator]().next().value?.content;h!==void 0&&(o.value=h)}let U=[];for(let h of t.attrs){let w=h[0],F=h[1];if(h.as_property)o[w]!==F&&(o[w]=F),s&&x.delete(w);else if(w.startsWith("on")){let N=w.slice(2),Zt=r(F,N==="input");u.has(N)||o.addEventListener(N,Ke),u.set(N,Zt),s&&l.delete(N)}else if(w.startsWith("data-lustre-on-")){let N=w.slice(15),Zt=r(_o);u.has(N)||o.addEventListener(N,Ke),u.set(N,Zt),o.setAttribute(w,F),s&&(l.delete(N),x.delete(w))}else w.startsWith("delegate:data-")||w.startsWith("delegate:aria-")?(o.setAttribute(w,F),U.push([w.slice(10),F])):w==="class"?$=$===null?F:$+" "+F:w==="style"?y=y===null?F:y+F:w==="dangerous-unescaped-html"?b=F:(o.getAttribute(w)!==F&&o.setAttribute(w,F),(w==="value"||w==="selected")&&(o[w]=F),s&&x.delete(w))}if($!==null&&(o.setAttribute("class",$),s&&x.delete("class")),y!==null&&(o.setAttribute("style",y),s&&x.delete("style")),s){for(let h of x)o.removeAttribute(h);for(let h of l)u.delete(h),o.removeEventListener(h,Ke)}if(t.tag==="slot"&&window.queueMicrotask(()=>{for(let h of o.assignedElements())for(let[w,F]of U)h.hasAttribute(w)||h.setAttribute(w,F)}),t.key!==void 0&&t.key!=="")o.setAttribute("data-lustre-key",t.key);else if(b!==null)return o.innerHTML=b,o;let j=o.firstChild,et=null,tt=null,rt=null,ee=jt(t).next().value;if(s&&ee!==void 0&&ee.key!==void 0&&ee.key!==""){et=new Set,tt=ei(e),rt=ei(t);for(let h of jt(t))j=$o(j,h,o,n,rt,tt,et)}else for(let h of jt(t))n.unshift({prev:j,next:h,parent:o}),j=j?.nextSibling;for(;j;){let h=j.nextSibling;o.removeChild(j),j=h}return o}var Ye=new WeakMap;function Ke(e){let t=e.currentTarget;if(!Ye.has(t)){t.removeEventListener(e.type,Ke);return}let r=Ye.get(t);if(!r.has(e.type)){t.removeEventListener(e.type,Ke);return}r.get(e.type)(e)}function _o(e){let t=e.currentTarget,r=t.getAttribute(`data-lustre-on-${e.type}`),n=JSON.parse(t.getAttribute("data-lustre-data")||"{}"),i=JSON.parse(t.getAttribute("data-lustre-include")||"[]");switch(e.type){case"input":case"change":i.push("target.value");break}return{tag:r,data:i.reduce((s,o)=>{let u=o.split(".");for(let l=0,x=s,$=e;l<u.length;l++)l===u.length-1?x[u[l]]=$[u[l]]:(x[u[l]]??={},$=$[u[l]],x=x[u[l]]);return s},{data:n})}}function ei(e){let t=new Map;if(e)for(let r of jt(e)){let n=r?.key||r?.getAttribute?.("data-lustre-key");n&&t.set(n,r)}return t}function $o(e,t,r,n,i,s,o){for(;e&&!i.has(e.getAttribute("data-lustre-key"));){let l=e.nextSibling;r.removeChild(e),e=l}if(s.size===0)return n.unshift({prev:e,next:t,parent:r}),e=e?.nextSibling,e;if(o.has(t.key))return console.warn(`Duplicate key found in Lustre vnode: ${t.key}`),n.unshift({prev:null,next:t,parent:r}),e;o.add(t.key);let u=s.get(t.key);if(!u&&!e)return n.unshift({prev:null,next:t,parent:r}),e;if(!u&&e!==null){let l=document.createTextNode("");return r.insertBefore(l,e),n.unshift({prev:l,next:t,parent:r}),e}return!u||u===e?(n.unshift({prev:e,next:t,parent:r}),e=e?.nextSibling,e):(r.insertBefore(u,e),n.unshift({prev:u,next:t,parent:r}),e)}function*jt(e){for(let t of e.children)yield*ti(t)}function*ti(e){e.subtree!==void 0?yield*ti(e.subtree()):yield e}var qr=class e{static start({init:t,update:r,view:n},i,s){if(!Sr())return new d(new Ve);let o=i instanceof HTMLElement?i:document.querySelector(i);if(!o)return new d(new Lt(i));let u=new e(o,t(s),r,n);return new p(l=>u.send(l))}constructor(t,[r,n],i,s){this.root=t,this.#e=r,this.#s=i,this.#r=s,this.#t=window.requestAnimationFrame(()=>this.#n(n.all.toArray(),!0))}root;send(t){if(t instanceof He){if(t[0]instanceof Ot){this.#t=window.cancelAnimationFrame(this.#t),this.#i=[],this.#e=t[0][0];let r=this.#r(this.#e),n=(s,o=!1)=>u=>{let l=s(u);l instanceof p&&this.send(new K(l[0],o))},i=this.root.firstChild??this.root.appendChild(document.createTextNode(""));Lr(i,r,n)}}else if(t instanceof K){let r=t[0],n=t[1]??!1;this.#i.push(r),n?(this.#t=window.cancelAnimationFrame(this.#t),this.#n()):this.#t||(this.#t=window.requestAnimationFrame(()=>this.#n()))}else if(t instanceof Ge){let r=t[0],n=t[1];this.root.dispatchEvent(new CustomEvent(r,{detail:n,bubbles:!0,composed:!0}))}else if(t instanceof Je)for(this.#t=window.cancelAnimationFrame(this.#t),this.#e=null,this.#s=null,this.#r=null,this.#i=null;this.root.firstChild;)this.root.firstChild.remove()}#e;#s;#r;#i=[];#t;#n(t=[]){this.#t=void 0,this.#o(t);let r=this.#r(this.#e),n=(s,o=!1)=>u=>{let l=s(u);l instanceof p&&this.send(new K(l[0],o))},i=this.root.firstChild??this.root.appendChild(document.createTextNode(""));Lr(i,r,n)}#o(t=[]){for(;this.#i.length>0;){let r=this.#i.shift(),[n,i]=this.#s(this.#e,r);t=t.concat(i.all.toArray()),this.#e=n}for(;t.length>0;){let r=t.shift(),n=u=>this.send(new K(u)),i=(u,l)=>this.root.dispatchEvent(new CustomEvent(u,{detail:l,bubbles:!0,composed:!0})),s=()=>{},o=this.root;r({dispatch:n,emit:i,select:s,root:o})}this.#i.length>0&&this.#o(t)}},ri=qr.start;var Tr=class e{static start({init:t,update:r,view:n,on_attribute_change:i},s){let o=new e(t(s),r,n,i);return new p(u=>o.send(u))}constructor([t,r],n,i,s){this.#e=t,this.#s=n,this.#i=i,this.#t=i(t),this.#l=s,this.#n=new Map,this.#o=Gn(this.#t),this.#u(r.all.toArray())}send(t){if(t instanceof At){for(let r of t[0]){let n=this.#l.get(r[0]);if(!n)continue;let i=n(r[1]);i instanceof d||this.#r.push(i)}this.#u()}else if(t instanceof Dt)this.#r=this.#r.concat(t[0].toArray()),this.#u(t[1].all.toArray());else if(!(t instanceof He))if(t instanceof K)this.#r.push(t[0]),this.#u();else if(t instanceof Ge){let r=new Et(t[0],t[1]);for(let[n,i]of this.#n)i(r)}else if(t instanceof Ct){let r=this.#o.get(t[0]);if(!r)return;let n=r(t[1]);if(n instanceof d)return;this.#r.push(n[0]),this.#u()}else if(t instanceof vt){let r=gr(this.#l),n=new kt(r,this.#t);this.#n=this.#n.set(t[0],t[1]),t[1](n)}else t instanceof Bt&&(this.#n=this.#n.delete(t[0]))}#e;#s;#r;#i;#t;#n;#o;#l;#u(t=[]){this.#a(t);let r=this.#i(this.#e),n=elements(this.#t,r);if(!Qn(n)){let i=new Ft(n);for(let[s,o]of this.#n)o(i)}this.#t=r,this.#o=n.handlers}#a(t=[]){for(;this.#r.length>0;){let r=this.#r.shift(),[n,i]=this.#s(this.#e,r);t=t.concat(i.all.toArray()),this.#e=n}for(;t.length>0;)t.shift()({dispatch:u=>this.send(new K(u)),emit:(u,l)=>this.root.dispatchEvent(new CustomEvent(u,{detail:l,bubbles:!0,composed:!0})),select:()=>{},root:null});this.#r.length>0&&this.#a(t)}},ho=Tr.start,Sr=()=>globalThis.window&&window.document;var Nr=class extends a{constructor(t,r,n,i){super(),this.init=t,this.update=r,this.view=n,this.on_attribute_change=i}};var Lt=class extends a{constructor(t){super(),this.selector=t}},Ve=class extends a{};function ni(e,t,r){return new Nr(e,t,r,new m)}function ii(e,t,r){return wt(!Sr(),new d(new Ve),()=>ri(e,t,r))}function S(e,t){return We("div",e,t)}function zr(e,t){return We("p",e,t)}function si(e,t){return We("button",e,t)}function go(e,t){return Yn(e,t)}function ui(e){return go("click",t=>new p(e))}var Xe=class extends a{constructor(t,r,n,i,s,o,u){super(),this.scheme=t,this.userinfo=r,this.host=n,this.port=i,this.path=s,this.query=o,this.fragment=u}};function li(e,t){let n=Zr(e,new lt(!0,!1)),i=Nn(n,void 0),s=J(i,l=>Qr(l,t)),o=Z(s,vn),u=J(o,l=>l.submatches);return Ar(u,c([]))}function bo(e){if(e instanceof m)return new m;{let t=e[0],r=Ne(t);if(r.isOk()&&r[0][0]==="?"){let n=r[0][1];return new _(n)}else return new m}}function qt(e){return e instanceof _&&e[0]===""?new m:e instanceof m?new m:e}function Fo(e,t){for(;;){let r=e,n=t;if(n===0)return 0;if(r.hasLength(0))return n;e=r.tail,t=n-1}}function ai(e,t){return Se(e,Bn(new m,Fo(e,t)))}function Eo(e){let t=me(e,"");if(t==="")return[new m,new m,new m];if(t==="//")return[new m,new _(""),new m];{let r=t,n=(()=>{let s=li("^(//)?((.*)@)?(\\[[a-zA-Z0-9:.]*\\]|[^:]*)(:(\\d*))?",r);return ai(s,6)})();if(n.hasLength(6)){let i=n.tail.tail.head,s=n.tail.tail.tail.head,o=n.tail.tail.tail.tail.tail.head,u=qt(i),l=qt(s),x=(()=>{let y=me(o,""),b=dt(y);return st(b)})();return[u,l,x]}else return[new m,new m,new m]}}function ko(e){let t="^(([a-z][a-z0-9\\+\\-\\.]*):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#.*)?",r=(()=>{let h=li(t,e);return ai(h,8)})(),n=(()=>{if(r.hasLength(8)){let ee=r.tail.head,h=r.tail.tail.head,w=r.tail.tail.tail.tail.head,F=r.tail.tail.tail.tail.tail.head,N=r.tail.tail.tail.tail.tail.tail.tail.head;return[ee,h,w,F,N]}else return[new m,new m,new m,new m,new m]})(),i=n[0],s=n[1],o=n[2],u=n[3],l=n[4],x=qt(i),$=me(o,""),y=bo(u),b=Eo(s),U=b[0],j=b[1],et=b[2],tt=(()=>{let h=oe(l,void 0),w=Z(h,Ne),F=J(w,An);return st(F)})(),rt=(()=>{let h=qt(x);return er(h,pe)})();return new p(new Xe(rt,U,j,et,$,y,tt))}function ci(e){return ko(e)}function fi(e){let t=(()=>{let u=e.fragment;if(u instanceof _){let l=u[0];return c(["#",l])}else return c([])})(),r=(()=>{let u=e.query;if(u instanceof _){let l=u[0];return f("?",f(l,t))}else return t})(),n=f(e.path,r),i=(()=>{let u=e.host,l=qn(e.path,"/");if(u instanceof _&&!l&&u[0]!==""){let x=u[0];return f("/",n)}else return n})(),s=(()=>{let u=e.host,l=e.port;if(u instanceof _&&l instanceof _){let x=l[0];return f(":",f(I(x),i))}else return i})(),o=(()=>{let u=e.scheme,l=e.userinfo,x=e.host;if(u instanceof _&&l instanceof _&&x instanceof _){let $=u[0],y=l[0],b=x[0];return f($,f("://",f(y,f("@",f(b,s)))))}else if(u instanceof _&&l instanceof m&&x instanceof _){let $=u[0],y=x[0];return f($,f("://",f(y,s)))}else if(u instanceof _&&l instanceof _&&x instanceof m){let $=u[0];return f($,f(":",s))}else if(u instanceof _&&l instanceof m&&x instanceof m){let $=u[0];return f($,f(":",s))}else if(u instanceof m&&l instanceof m&&x instanceof _){let $=x[0];return f("//",f($,s))}else return s})();return kr(o)}var Ae=class extends a{},Ze=class extends a{},Tt=class extends a{},St=class extends a{},Nt=class extends a{},zt=class extends a{},Pt=class extends a{},It=class extends a{},Mt=class extends a{};var Rt=class extends a{},Qe=class extends a{};function pi(e){return e instanceof Pt?"connect":e instanceof Nt?"delete":e instanceof Ae?"get":e instanceof Tt?"head":e instanceof It?"options":e instanceof Mt?"patch":e instanceof Ze?"post":e instanceof St?"put":e instanceof zt?"trace":e[0]}function di(e){return e instanceof Rt?"http":"https"}function xi(e){let t=pe(e);return t==="http"?new p(new Rt):t==="https"?new p(new Qe):new d(void 0)}var Ir=class extends a{constructor(t,r,n,i,s,o,u,l){super(),this.method=t,this.headers=r,this.body=n,this.scheme=i,this.host=s,this.port=o,this.path=u,this.query=l}};function _i(e){return new Xe(new _(di(e.scheme)),new m,new _(e.host),e.port,e.path,e.query,new m)}function jo(e){return q((()=>{let t=e.scheme,r=me(t,"");return xi(r)})(),t=>q((()=>{let r=e.host;return oe(r,void 0)})(),r=>{let n=new Ir(new Ae,c([]),"",t,r,e.port,e.path,e.query);return new p(n)}))}function $i(e){let r=ci(e);return q(r,jo)}var Q=class extends a{constructor(t,r,n){super(),this.status=t,this.headers=r,this.body=n}};var De=class e{constructor(t){this.promise=t}static wrap(t){return t instanceof Promise?new e(t):t}static unwrap(t){return t instanceof e?t.promise:t}};function Ut(e){return Promise.resolve(De.wrap(e))}function hi(e,t){return e.then(r=>t(De.unwrap(r)))}function Wt(e,t){return e.then(r=>De.wrap(t(De.unwrap(r))))}function Mr(e,t){return e.catch(r=>t(r))}function wi(e,t){return Wt(e,n=>(t(n),n))}function Ht(e,t){return hi(e,n=>{if(n.isOk()){let i=n[0];return t(i)}else{let i=n[0];return Ut(new d(i))}})}async function yi(e){try{return new p(await fetch(e))}catch(t){return new d(new Gt(t.toString()))}}function bi(e){return new Q(e.status,B.fromArray([...e.headers]),e)}function Fi(e){let t=fi(_i(e)),r=pi(e.method).toUpperCase(),n={headers:To(e.headers),method:r};return r!=="GET"&&r!=="HEAD"&&(n.body=e.body),new globalThis.Request(t,n)}function To(e){let t=new globalThis.Headers;for(let[r,n]of e)t.append(r.toLowerCase(),n);return t}async function Rr(e){let t;try{t=await e.body.text()}catch{return new d(new Jt)}return new p(e.withFields({body:t}))}var Gt=class extends a{constructor(t){super(),this[0]=t}},Jt=class extends a{};function Ei(e){let r=Fi(e),n=yi(r);return Ht(n,i=>Ut(new p(bi(i))))}var Ur=class extends a{constructor(t){super(),this[0]=t}},Wr=class extends a{constructor(t){super(),this[0]=t}},Hr=class extends a{constructor(t){super(),this[0]=t}},Yt=class extends a{},Gr=class extends a{},Jr=class extends a{constructor(t,r){super(),this[0]=t,this[1]=r}},Yr=class extends a{},Kr=class extends a{constructor(t){super(),this.run=t}};function No(e,t,r){let n=Ei(e),i=Ht(n,Rr),s=Wt(i,u=>{if(u.isOk()){let l=u[0];return t.run(new p(l))}else return t.run(new d(new Yt))}),o=Mr(s,u=>t.run(new d(new Yt)));wi(o,r)}function ki(e,t){return Rn(r=>{let n=$i(e);if(n.isOk()){let i=n[0];return No(i,t,r)}else return r(t.run(new d(new Ur(e))))})}function zo(e){if(e instanceof Q&&200<=e.status&&e.status<=299){let t=e.status,r=e.body;return new p(r)}else{if(e instanceof Q&&e.status===401)return new d(new Yr);if(e instanceof Q&&e.status===404)return new d(new Gr);if(e instanceof Q&&e.status===500){let t=e.body;return new d(new Wr(t))}else{let t=e.status,r=e.body;return new d(new Jr(t,r))}}}function Ai(e,t){return new Kr(r=>{let i=q(r,zo),s=q(i,o=>{let u=In(o,e);if(u.isOk()){let l=u[0];return new p(l)}else{let l=u[0];return new d(new Hr(l))}});return t(s)})}function Di(e,t){return si(f(A("lustre-ui-button"),f(Kn("button"),e)),t)}function Ci(e,t,r){return e(f(A("lustre-ui-stack"),t),r)}function vi(e,t){return Ci(S,e,t)}function Go(e,t,r,n){return e(f(A("lustre-ui-aside"),t),c([r,n]))}function Oi(e,t,r){return Go(S,e,t,r)}function ji(e){let t=e<10,r=e>90;return t?O(c([["--min","10%"]])):!t&&!r?O(c([["--min",I(e)+"%"]])):O(c([["--min","90%"]]))}function Yo(e,t,r){return e(f(A("lustre-ui-centre"),t),c([r]))}function qi(e,t){return Yo(S,e,t)}var Ti=Oi;var Si=Di,Ni=qi;var zi=vi;var Kt=class extends a{constructor(t){super(),this.quote=t}},Vr=class extends a{constructor(t,r){super(),this.author=t,this.content=r}},Vt=class extends a{},Xt=class extends a{constructor(t){super(),this[0]=t}};function iu(e){return[new Kt(new m),Pe()]}function su(){let e="https://dummyjson.com/quotes/random",t=Dr((r,n)=>new Vr(r,n),de("author",ye),de("quote",ye));return ki(e,Ai(t,r=>new Xt(r)))}function ou(e,t){if(t instanceof Vt)return[e,su()];if(t instanceof Xt&&t[0].isOk()){let r=t[0][0];return[new Kt(new _(r)),Pe()]}else return[e,Pe()]}function uu(e){if(e instanceof _){let t=e[0];return zi(c([]),c([ke(t.author+" once said..."),zr(c([O(c([["font-style","italic"]]))]),c([ke(t.content)]))]))}else return zr(c([]),c([ke("Click the button to get a quote!")]))}function lu(e){let t=c([["width","100vw"],["height","100vh"],["padding","1rem"]]);return Ni(c([O(t)]),Ti(c([ji(70),O(c([["width","60ch"]]))]),uu(e.quote),Si(c([ui(new Vt)]),c([ke("New quote")]))))}function Pi(){let e=ni(iu,ou,lu),t=ii(e,"#app",void 0);if(!t.isOk())throw se("let_assert","lumina_client",21,"main","Pattern match failed, no pattern matched the value.",{value:t});return t}Pi();
+93
client/src/lumina_client.gleam
··· 1 + import gleam/dynamic 2 + import gleam/option.{type Option, None, Some} 3 + import lustre 4 + import lustre/attribute 5 + import lustre/effect.{type Effect} 6 + import lustre/element.{type Element} 7 + import lustre/element/html 8 + import lustre/event 9 + 10 + // Lustre_http is a community package that provides a simple API for making 11 + // HTTP requests from your update function. You can find the docs for the package 12 + // here: https://hexdocs.pm/lustre_http/index.html 13 + import lustre/ui 14 + import lustre/ui/layout/aside 15 + import lustre_http.{type HttpError} 16 + 17 + // MAIN ------------------------------------------------------------------------ 18 + 19 + pub fn main() { 20 + let app = lustre.application(init, update, view) 21 + let assert Ok(_) = lustre.start(app, "#app", Nil) 22 + } 23 + 24 + // MODEL ----------------------------------------------------------------------- 25 + 26 + type Model { 27 + Model(quote: Option(Quote)) 28 + } 29 + 30 + type Quote { 31 + Quote(author: String, content: String) 32 + } 33 + 34 + fn init(_flags) -> #(Model, Effect(Msg)) { 35 + #(Model(quote: None), effect.none()) 36 + } 37 + 38 + // UPDATE ---------------------------------------------------------------------- 39 + 40 + pub opaque type Msg { 41 + UserClickedRefresh 42 + ApiUpdatedQuote(Result(Quote, HttpError)) 43 + } 44 + 45 + fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { 46 + case msg { 47 + UserClickedRefresh -> #(model, get_quote()) 48 + ApiUpdatedQuote(Ok(quote)) -> #(Model(quote: Some(quote)), effect.none()) 49 + ApiUpdatedQuote(Error(_)) -> #(model, effect.none()) 50 + } 51 + } 52 + 53 + fn get_quote() -> Effect(Msg) { 54 + let url = "https://dummyjson.com/quotes/random" 55 + let decoder = 56 + dynamic.decode2( 57 + Quote, 58 + dynamic.field("author", dynamic.string), 59 + dynamic.field("quote", dynamic.string), 60 + ) 61 + 62 + lustre_http.get(url, lustre_http.expect_json(decoder, ApiUpdatedQuote)) 63 + } 64 + 65 + // VIEW ------------------------------------------------------------------------ 66 + 67 + fn view(model: Model) -> Element(Msg) { 68 + let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] 69 + 70 + ui.centre( 71 + [attribute.style(styles)], 72 + ui.aside( 73 + [aside.min_width(70), attribute.style([#("width", "60ch")])], 74 + view_quote(model.quote), 75 + ui.button([event.on_click(UserClickedRefresh)], [ 76 + element.text("New quote"), 77 + ]), 78 + ), 79 + ) 80 + } 81 + 82 + fn view_quote(quote: Option(Quote)) -> Element(msg) { 83 + case quote { 84 + Some(quote) -> 85 + ui.stack([], [ 86 + element.text(quote.author <> " once said..."), 87 + html.p([attribute.style([#("font-style", "italic")])], [ 88 + element.text(quote.content), 89 + ]), 90 + ]) 91 + None -> html.p([], [element.text("Click the button to get a quote!")]) 92 + } 93 + }
+12
client/test/lumina_client_test.gleam
··· 1 + import gleeunit 2 + import gleeunit/should 3 + 4 + pub fn main() { 5 + gleeunit.main() 6 + } 7 + 8 + // gleeunit test functions end in `_test` 9 + pub fn hello_world_test() { 10 + 1 11 + |> should.equal(1) 12 + }
+17
server/Cargo.toml
··· 1 + [package] 2 + name = "lumina-server" 3 + version = "0.1.0" 4 + edition = "2024" 5 + build="../build.rs" 6 + 7 + [[bin]] 8 + name = "lumina-server" 9 + path = "src/main.rs" 10 + 11 + 12 + [dependencies] 13 + axum = {version = "0.8.1", features = ["form", "http1", "json", "matched-path", "original-uri", "query", "tokio", "tower-log", "tracing", "ws"]} 14 + tokio = { version = "1.0", features = ["full"] } 15 + serde = { version = "1.0", features = ["derive"] } 16 + tracing = "0.1" 17 + tracing-subscriber = { version = "0.3", features = ["env-filter"] }
+26
server/src/main.rs
··· 1 + use axum::{ 2 + routing::{get, post}, 3 + http::StatusCode, 4 + Json, Router, 5 + response::{Html, IntoResponse}, 6 + }; 7 + use axum::http::header; 8 + use serde::{Deserialize, Serialize}; 9 + 10 + #[tokio::main] 11 + async fn main() { 12 + // initialize tracing 13 + tracing_subscriber::fmt::init(); 14 + 15 + // build our application with a route 16 + let app = Router::new() 17 + // `GET /` goes to `root` 18 + .route("/", get(|| async { Html(include_str!("../../client/index.html")) })) 19 + .route("/static/lumina.min.mjs", get(|| async { ([(header::CONTENT_TYPE, "text/javascript")], include_str!("../../client/priv/static/lumina_client.min.mjs")) })) 20 + .route("/static/lumina.css", get(|| async { ([(header::CONTENT_TYPE, "text/css")], include_str!("../../client/build/dev/javascript/lustre_ui/priv/static/lustre-ui.css")) })); 21 + 22 + // run our app with hyper, listening globally on port 3000 23 + println!("Listening on http://localhost:3000"); 24 + let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); 25 + axum::serve(listener, app).await.unwrap(); 26 + }