diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 25735115..00000000 --- a/.dockerignore +++ /dev/null @@ -1,15 +0,0 @@ -node_modules -.next -.git -.gitignore -*.md -.env* -!.env.example -.cursor -.vscode -diffs -docs -agent-transcripts -mcps -terminals -apps/web/.font-cache diff --git a/.gitignore b/.gitignore index 2909d741..40b878db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# asdf version management -.tool-versions - -node_modules -.cursorignore -.turbo - -.env* -!*.env.example - -# cursor -bun.lockb - -# content-collections -.content-collections - -# Twiggy -.cursor/ - -.open-next - -target/ - -.cargo-tools/ \ No newline at end of file +node_modules/ \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100644 index c5465713..00000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -install-strategy="nested" -node-linker=isolated \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index d326ac5d..00000000 --- a/AGENTS.md +++ /dev/null @@ -1,37 +0,0 @@ -# Agents.md - -## Architecture - -An ongoing migration is moving all business logic into `rust/`. Each app under `apps/` is a UI shell — it owns rendering, interaction, and platform-specific concerns, but never owns logic. The UI framework for any given app is a replaceable detail. - -### `rust/` - -The single source of truth for all non-UI code. Everything platform-agnostic belongs here: no components, no hooks, no framework imports. - -### `apps/` - -Each app is a frontend that calls into Rust. Logic is never duplicated between apps — only UI is, because each platform may use an entirely different framework and language to build it. - -- `web/` — Next.js -- `desktop/` — GPUI - -## Web - -### React - -- Read components before using them. They may already apply classes, which affects what you need to pass and how to override them. - -### TypeScript - -Function signatures should make the call site readable and let the function evolve without breaking callers. Positional parameters fail both: `formatTime(30, 24)` hides which number is which, and adding, removing, or reordering an argument silently breaks every caller whose types happen to still line up. A single destructured object fixes both at once - each argument names itself at the call site, and the shape can grow without churn. So signatures default to one object parameter: - -```tsx -// ❌ meaning depends on order; the shape can't evolve without touching every caller -function formatTime(seconds: number, fps: number) { ... } - -// ✅ each argument names itself; fields can be added, reordered, or made optional freely -function formatTime({ seconds, fps }: { seconds: number; fps: number }) { ... } -``` - -The one real exception is type predicates (`element is VideoElement`) — the language requires a positional subject, so the reasoning above doesn't get to apply. - diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 04c00a6c..00000000 --- a/Cargo.lock +++ /dev/null @@ -1,7885 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", - "zeroize", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "const-random", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "aligned" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" -dependencies = [ - "as-slice", -] - -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" - -[[package]] -name = "ar_archive_writer" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" -dependencies = [ - "object", -] - -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" - -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - -[[package]] -name = "as-slice" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" -dependencies = [ - "stable_deref_trait", -] - -[[package]] -name = "ash" -version = "0.38.0+1.3.281" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" -dependencies = [ - "libloading", -] - -[[package]] -name = "ash-window" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52bca67b61cb81e5553babde81b8211f713cb6db79766f80168f3e5f40ea6c82" -dependencies = [ - "ash", - "raw-window-handle", - "raw-window-metal 0.4.0", -] - -[[package]] -name = "ashpd" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.2", - "serde", - "serde_repr", - "url", - "wayland-backend", - "wayland-client", - "wayland-protocols 0.32.11", - "zbus", -] - -[[package]] -name = "ashpd" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a3c86f3fd70c0ffa500ed189abfa90b5a52398a45d5dc372fcc38ebeb7a645" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.2", - "serde", - "serde_repr", - "url", - "zbus", -] - -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-compression" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" -dependencies = [ - "compression-codecs", - "compression-core", - "futures-io", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand 2.3.0", - "futures-lite 2.6.1", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite 2.6.1", - "once_cell", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite 2.6.1", - "parking", - "polling", - "rustix 1.1.4", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "async-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel 2.5.0", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.4.1", - "futures-lite 2.6.1", - "rustix 1.1.4", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "async-signal" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.1.4", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-std" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" -dependencies = [ - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite 2.6.1", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "async_zip" -version = "0.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b9f7252833d5ed4b00aa9604b563529dd5e11de9c23615de2dcdf91eb87b52" -dependencies = [ - "async-compression", - "crc32fast", - "futures-lite 2.6.1", - "pin-project", - "thiserror 1.0.69", -] - -[[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "av-scenechange" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" -dependencies = [ - "aligned", - "anyhow", - "arg_enum_proc_macro", - "arrayvec", - "log", - "num-rational", - "num-traits", - "pastey", - "rayon", - "thiserror 2.0.18", - "v_frame", - "y4m", -] - -[[package]] -name = "av1-grain" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom 8.0.0", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bindgen" -version = "0.71.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" -dependencies = [ - "bitflags 2.11.0", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 2.1.1", - "shlex", - "syn 2.0.117", -] - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec 0.8.0", -] - -[[package]] -name = "bit-set" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ddef2995421ab6a5c779542c81ee77c115206f4ad9d5a8e05f4ff49716a3dd" -dependencies = [ - "bit-vec 0.9.1", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bit-vec" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" - -[[package]] -name = "bit_field" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" - -[[package]] -name = "bitstream-io" -version = "4.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" -dependencies = [ - "core2", -] - -[[package]] -name = "blade-graphics" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e71cfb73b98eb9f58ee84048aa1bdf4e7497fd20c141b57523499fa066b48fed" -dependencies = [ - "ash", - "ash-window", - "bitflags 2.11.0", - "bytemuck", - "codespan-reporting 0.12.0", - "glow 0.16.0", - "gpu-alloc", - "gpu-alloc-ash", - "hidden-trait", - "js-sys", - "khronos-egl", - "libloading", - "log", - "mint", - "naga 25.0.1", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", - "objc2-quartz-core", - "objc2-ui-kit", - "once_cell", - "raw-window-handle", - "slab", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "blade-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27142319e2f4c264581067eaccb9f80acccdde60d8b4bf57cc50cd3152f109ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "blade-util" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6be3a82c001ba7a17b6f8e413ede5d1004e6047213f8efaf0ffc15b5c4904c" -dependencies = [ - "blade-graphics", - "bytemuck", - "log", - "profiling", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel 2.5.0", - "async-task", - "futures-io", - "futures-lite 2.6.1", - "piper", -] - -[[package]] -name = "bridge" -version = "0.1.0" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "bstr" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "built" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" - -[[package]] -name = "bumpalo" -version = "3.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" - -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" - -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.11.0", - "log", - "polling", - "rustix 0.38.44", - "slab", - "thiserror 1.0.69", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop", - "rustix 0.38.44", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cbindgen" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" -dependencies = [ - "heck 0.4.1", - "indexmap", - "log", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn 2.0.117", - "tempfile", - "toml 0.8.23", -] - -[[package]] -name = "cc" -version = "1.2.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom 7.1.3", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "cgl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" -dependencies = [ - "libc", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cocoa" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation 0.1.2", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" -dependencies = [ - "bitflags 2.11.0", - "block", - "cocoa-foundation 0.2.0", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" -dependencies = [ - "bitflags 2.11.0", - "block", - "core-foundation 0.10.0", - "core-graphics-types 0.2.0", - "libc", - "objc", -] - -[[package]] -name = "codespan-reporting" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - -[[package]] -name = "codespan-reporting" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "command-fds" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f849b92c694fe237ecd8fafd1ba0df7ae0d45c1df6daeb7f68ed4220d51640bd" -dependencies = [ - "nix 0.30.1", - "thiserror 2.0.18", -] - -[[package]] -name = "compositor" -version = "0.1.0" -dependencies = [ - "bytemuck", - "effects", - "gpu", - "masks", - "serde", - "thiserror 2.0.18", -] - -[[package]] -name = "compression-codecs" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" -dependencies = [ - "compression-core", - "deflate64", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.0", - "core-graphics-types 0.2.0", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-helmer-fork" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32eb7c354ae9f6d437a6039099ce7ecd049337a8109b23d73e48e8ffba8e9cd5" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.0", - "libc", -] - -[[package]] -name = "core-graphics2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4583956b9806b69f73fcb23aee05eb3620efc282972f08f6a6db7504f8334d" -dependencies = [ - "bitflags 2.11.0", - "block", - "cfg-if", - "core-foundation 0.10.0", - "libc", -] - -[[package]] -name = "core-text" -version = "21.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a593227b66cbd4007b2a050dfdd9e1d1318311409c8d600dc82ba1b15ca9c130" -dependencies = [ - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "foreign-types", - "libc", -] - -[[package]] -name = "core-video" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45e71d5be22206bed53c3c3cb99315fc4c3d31b8963808c6bc4538168c4f8ef" -dependencies = [ - "block", - "core-foundation 0.10.0", - "core-graphics2", - "io-surface", - "libc", - "metal", -] - -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "core_maths" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" -dependencies = [ - "libm", -] - -[[package]] -name = "cosmic-text" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da46a9d5a8905cc538a4a5bceb6a4510de7a51049c5588c0114efce102bcbbe8" -dependencies = [ - "bitflags 2.11.0", - "fontdb 0.16.2", - "log", - "rangemap", - "rustc-hash 1.1.0", - "rustybuzz 0.14.1", - "self_cell", - "smol_str", - "swash", - "sys-locale", - "ttf-parser 0.21.1", - "unicode-bidi", - "unicode-linebreak", - "unicode-script", - "unicode-segmentation", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctor" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" -dependencies = [ - "ctor-proc-macro", - "dtor", -] - -[[package]] -name = "ctor-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" - -[[package]] -name = "data-url" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" - -[[package]] -name = "deflate64" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.117", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys 0.3.7", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.11.0", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "dlib" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" -dependencies = [ - "libloading", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dtor" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" -dependencies = [ - "dtor-proc-macro", -] - -[[package]] -name = "dtor-proc-macro" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dwrote" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02" -dependencies = [ - "lazy_static", - "libc", - "winapi", - "wio", -] - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "effects" -version = "0.1.0" -dependencies = [ - "bytemuck", - "gpu", - "thiserror 2.0.18", - "wgpu", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "embed-resource" -version = "3.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 0.9.12+spec-1.1.0", - "vswhom", - "winreg", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "endi" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "erased-serde" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "etagere" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" -dependencies = [ - "euclid", - "svg_fmt", -] - -[[package]] -name = "euclid" -version = "0.22.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" -dependencies = [ - "num-traits", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.1", - "pin-project-lite", -] - -[[package]] -name = "exr" -version = "1.74.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fax" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" -dependencies = [ - "fax_derive", -] - -[[package]] -name = "fax_derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "filedescriptor" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" -dependencies = [ - "libc", - "thiserror 1.0.69", - "winapi", -] - -[[package]] -name = "filetime" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" -dependencies = [ - "cfg-if", - "libc", - "libredox", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" - -[[package]] -name = "float-ord" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" - -[[package]] -name = "float_next_after" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "font-types" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73829a7b5c91198af28a99159b7ae4afbb252fb906159ff7f189f3a2ceaa3df2" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "fontconfig-parser" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" -dependencies = [ - "roxmltree", -] - -[[package]] -name = "fontdb" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.20.0", -] - -[[package]] -name = "fontdb" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.25.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "freetype-sys" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand 2.3.0", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix 1.1.4", - "windows-link 0.2.1", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 5.3.0", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", - "wasip2", - "wasip3", -] - -[[package]] -name = "gif" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "gl_generator" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "globset" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glow" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glow" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glutin_wgl_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" -dependencies = [ - "gl_generator", -] - -[[package]] -name = "gpu" -version = "0.1.0" -dependencies = [ - "bytemuck", - "thiserror 2.0.18", - "wasm-bindgen", - "web-sys", - "wgpu", -] - -[[package]] -name = "gpu-alloc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags 2.11.0", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-ash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbda7a18a29bc98c2e0de0435c347df935bf59489935d0cbd0b73f1679b6f79a" -dependencies = [ - "ash", - "gpu-alloc-types", - "tinyvec", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "gpu-allocator" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51255ea7cfaadb6c5f1528d43e92a82acb2b96c43365989a28b2d44ee38f8795" -dependencies = [ - "ash", - "hashbrown 0.16.1", - "log", - "presser", - "thiserror 2.0.18", - "windows 0.62.2", -] - -[[package]] -name = "gpu-descriptor" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" -dependencies = [ - "bitflags 2.11.0", - "gpu-descriptor-types", - "hashbrown 0.15.5", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "gpui" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "979b45cfa6ec723b6f42330915a1b3769b930d02b2d505f9697f8ca602bee707" -dependencies = [ - "anyhow", - "as-raw-xcb-connection", - "ashpd 0.11.1", - "async-task", - "bindgen", - "blade-graphics", - "blade-macros", - "blade-util", - "block", - "bytemuck", - "calloop", - "calloop-wayland-source", - "cbindgen", - "cocoa 0.26.0", - "cocoa-foundation 0.2.0", - "core-foundation 0.10.0", - "core-foundation-sys", - "core-graphics 0.24.0", - "core-text", - "core-video", - "cosmic-text", - "ctor", - "derive_more", - "embed-resource", - "etagere", - "filedescriptor", - "flume", - "foreign-types", - "futures", - "gpui-macros", - "gpui_collections", - "gpui_http_client", - "gpui_media", - "gpui_refineable", - "gpui_semantic_version", - "gpui_sum_tree", - "gpui_util", - "gpui_util_macros", - "image", - "inventory", - "itertools 0.14.0", - "libc", - "log", - "lyon", - "metal", - "naga 25.0.1", - "num_cpus", - "objc", - "oo7", - "open", - "parking", - "parking_lot", - "pathfinder_geometry", - "pin-project", - "postage", - "profiling", - "rand 0.9.2", - "raw-window-handle", - "resvg", - "schemars", - "seahash", - "serde", - "serde_json", - "slotmap", - "smallvec", - "smol", - "stacksafe", - "strum 0.27.2", - "taffy", - "thiserror 2.0.18", - "usvg", - "uuid", - "waker-fn", - "wayland-backend", - "wayland-client", - "wayland-cursor", - "wayland-protocols 0.31.2", - "wayland-protocols-plasma", - "windows 0.61.3", - "windows-core 0.61.2", - "windows-numerics 0.2.0", - "windows-registry 0.5.3", - "x11-clipboard", - "x11rb", - "xkbcommon", - "zed-font-kit", - "zed-scap", - "zed-xim", -] - -[[package]] -name = "gpui-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcb02dd63a2859714ac7b6b476937617c3c744157af1b49f7c904023a79039be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "gpui_collections" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae39dc6d3d201be97e4bc08d96dbef2bc5b5c3d5734e05786e8cc3043342351c" -dependencies = [ - "indexmap", - "rustc-hash 2.1.1", -] - -[[package]] -name = "gpui_derive_refineable" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644de174341a87b3478bd65b66bca38af868bcf2b2e865700523734f83cfc664" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "gpui_http_client" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23822b0a6d2c5e6a42507980a0ab3848610ea908942c8ef98187f646f690335e" -dependencies = [ - "anyhow", - "async-compression", - "async-fs", - "bytes", - "derive_more", - "futures", - "gpui_util", - "http", - "http-body", - "log", - "parking_lot", - "serde", - "serde_json", - "sha2", - "tempfile", - "url", - "zed-async-tar", - "zed-reqwest", -] - -[[package]] -name = "gpui_media" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cb8912ae17371725132d2b7eec6797a255accc95d58ee5c1134b529810f14b" -dependencies = [ - "anyhow", - "bindgen", - "core-foundation 0.10.0", - "core-video", - "ctor", - "foreign-types", - "metal", - "objc", -] - -[[package]] -name = "gpui_perf" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40a0961dcf598955130e867f4b731150a20546427b41b1a63767c1037a86d77" -dependencies = [ - "gpui_collections", - "serde", - "serde_json", -] - -[[package]] -name = "gpui_refineable" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258cb099254e9468181aee5614410fba61db4ae115fc1d51b4a0b985f60d6641" -dependencies = [ - "gpui_derive_refineable", -] - -[[package]] -name = "gpui_semantic_version" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201e45eff7b695528fb3af6560a534943fbc2db5323d755b9d198bd743948e35" -dependencies = [ - "anyhow", - "serde", -] - -[[package]] -name = "gpui_sum_tree" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f3bedd573fafafa13d1200b356c588cf094fb2786e3684bb3f5ea59b549fa9" -dependencies = [ - "arrayvec", - "log", - "rayon", -] - -[[package]] -name = "gpui_util" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68faea25903ae524de9af83990b9aa51bcbc8dd085929ac0aea7fd41905e05c3" -dependencies = [ - "anyhow", - "async-fs", - "async_zip", - "command-fds", - "dirs 4.0.0", - "dunce", - "futures", - "futures-lite 1.13.0", - "globset", - "gpui_collections", - "itertools 0.14.0", - "libc", - "log", - "nix 0.29.0", - "regex", - "rust-embed", - "schemars", - "serde", - "serde_json", - "serde_json_lenient", - "shlex", - "smol", - "take-until", - "tempfile", - "tendril", - "unicase", - "walkdir", - "which", -] - -[[package]] -name = "gpui_util_macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c28f65ef47fb97e21e82fd4dd75ccc2506eda010c846dc8054015ea234f1a22" -dependencies = [ - "gpui_perf", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "grid" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681" - -[[package]] -name = "h2" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "num-traits", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash 0.1.5", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "hidden-trait" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ed9e850438ac849bec07e7d09fbe9309cbd396a5988c30b010580ce08860df" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "image" -version = "0.25.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" -dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", - "moxcms", - "num-traits", - "png 0.18.1", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "image-webp" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imagesize" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" - -[[package]] -name = "imgref" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" - -[[package]] -name = "indexmap" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "inventory" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009ae045c87e7082cb72dab0ccd01ae075dd00141ddc108f43a0ea150a9e7227" -dependencies = [ - "rustversion", -] - -[[package]] -name = "io-surface" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "554b8c5d64ec09a3a520fe58e4d48a73e00ff32899cdcbe32a4877afd4968b8e" -dependencies = [ - "cgl", - "core-foundation 0.10.0", - "core-foundation-sys", - "leaky-cow", -] - -[[package]] -name = "ipnet" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - -[[package]] -name = "jni-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" -dependencies = [ - "jni-sys-macros", -] - -[[package]] -name = "jni-sys-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "797146bb2677299a1eb6b7b50a890f4c361b29ef967addf5b2fa45dae1bb6d7d" -dependencies = [ - "cfg-if", - "futures-util", - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" -dependencies = [ - "libc", - "libloading", - "pkg-config", -] - -[[package]] -name = "khronos_api" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" - -[[package]] -name = "kurbo" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" -dependencies = [ - "arrayvec", - "euclid", - "smallvec", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "leak" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd100e01f1154f2908dfa7d02219aeab25d0b9c7fa955164192e3245255a0c73" - -[[package]] -name = "leaky-cow" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a8225d44241fd324a8af2806ba635fc7c8a7e9a7de4d5cf3ef54e71f5926fc" -dependencies = [ - "leak", -] - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "lebe" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" - -[[package]] -name = "libc" -version = "0.2.183" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" -dependencies = [ - "arbitrary", - "cc", -] - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link 0.2.1", -] - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" -dependencies = [ - "bitflags 2.11.0", - "libc", - "plain", - "redox_syscall 0.7.3", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -dependencies = [ - "serde_core", - "value-bag", -] - -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "lyon" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0578bdecb7d6d88987b8b2b1e3a4e2f81df9d0ece1078623324a567904e7b7" -dependencies = [ - "lyon_algorithms", - "lyon_tessellation", -] - -[[package]] -name = "lyon_algorithms" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9815fac08e6fd96733a11dce4f9d15a3f338e96a2e2311ee21e1b738efc2bc0f" -dependencies = [ - "lyon_path", - "num-traits", -] - -[[package]] -name = "lyon_geom" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4336502e29e32af93cf2dad2214ed6003c17ceb5bd499df77b1de663b9042b92" -dependencies = [ - "arrayvec", - "euclid", - "num-traits", -] - -[[package]] -name = "lyon_path" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c463f9c428b7fc5ec885dcd39ce4aa61e29111d0e33483f6f98c74e89d8621e" -dependencies = [ - "lyon_geom", - "num-traits", -] - -[[package]] -name = "lyon_tessellation" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" -dependencies = [ - "float_next_after", - "lyon_path", - "num-traits", -] - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "masks" -version = "0.1.0" -dependencies = [ - "bytemuck", - "gpu", - "wgpu", -] - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "memmap2" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.11.0", - "block", - "core-graphics-types 0.1.3", - "foreign-types", - "log", - "objc", - "paste", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mint" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" - -[[package]] -name = "mio" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "moxcms" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "naga" -version = "25.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" -dependencies = [ - "arrayvec", - "bit-set 0.8.0", - "bitflags 2.11.0", - "cfg_aliases", - "codespan-reporting 0.12.0", - "half", - "hashbrown 0.15.5", - "hexf-parse", - "indexmap", - "log", - "num-traits", - "once_cell", - "rustc-hash 1.1.0", - "spirv 0.3.0+sdk-1.3.268.0", - "strum 0.26.3", - "thiserror 2.0.18", - "unicode-ident", -] - -[[package]] -name = "naga" -version = "29.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2630921705b9b01dcdd0b6864b9562ca3c1951eecd0f0c4f5f04f61e412647" -dependencies = [ - "arrayvec", - "bit-set 0.9.1", - "bitflags 2.11.0", - "cfg-if", - "cfg_aliases", - "codespan-reporting 0.13.1", - "half", - "hashbrown 0.16.1", - "hexf-parse", - "indexmap", - "libm", - "log", - "num-traits", - "once_cell", - "rustc-hash 1.1.0", - "spirv 0.4.0+sdk-1.4.341.0", - "thiserror 2.0.18", - "unicode-ident", -] - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys 0.3.1", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.11.0", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags 2.11.0", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - -[[package]] -name = "ntapi" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" -dependencies = [ - "winapi", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "serde", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.11.0", - "dispatch2", - "objc2", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-metal" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" -dependencies = [ - "bitflags 2.11.0", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "object" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "oo7" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3299dd401feaf1d45afd8fd1c0586f10fcfb22f244bb9afa942cec73503b89d" -dependencies = [ - "aes", - "ashpd 0.12.3", - "async-fs", - "async-io", - "async-lock", - "blocking", - "cbc", - "cipher", - "digest", - "endi", - "futures-lite 2.6.1", - "futures-util", - "getrandom 0.3.4", - "hkdf", - "hmac", - "md-5", - "num", - "num-bigint-dig", - "pbkdf2", - "rand 0.9.2", - "serde", - "sha2", - "subtle", - "zbus", - "zbus_macros", - "zeroize", - "zvariant", -] - -[[package]] -name = "open" -version = "5.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" -dependencies = [ - "is-wsl", - "libc", - "pathdiff", -] - -[[package]] -name = "opencut-desktop" -version = "0.1.0" -dependencies = [ - "gpui", -] - -[[package]] -name = "opencut-wasm" -version = "0.2.10" -dependencies = [ - "bridge", - "compositor", - "console_error_panic_hook", - "effects", - "gpu", - "js-sys", - "masks", - "num-traits", - "serde", - "serde-wasm-bindgen", - "time", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" -dependencies = [ - "num-traits", -] - -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pastey" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "pathfinder_geometry" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" -dependencies = [ - "log", - "pathfinder_simd", -] - -[[package]] -name = "pathfinder_simd" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf9027960355bf3afff9841918474a81a5f972ac6d226d518060bba758b5ad57" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest", - "hmac", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pico-args" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" - -[[package]] -name = "pin-project" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" -dependencies = [ - "atomic-waker", - "fastrand 2.3.0", - "futures-io", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "png" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" -dependencies = [ - "bitflags 2.11.0", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - -[[package]] -name = "pollster" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" - -[[package]] -name = "portable-atomic" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" - -[[package]] -name = "portable-atomic-util" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "postage" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" -dependencies = [ - "atomic", - "crossbeam-queue", - "futures", - "log", - "parking_lot", - "pin-project", - "pollster", - "static_assertions", - "thiserror 1.0.69", -] - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "presser" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.117", -] - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.8+spec-1.1.0", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "profiling" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "psm" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" -dependencies = [ - "ar_archive_writer", - "cc", -] - -[[package]] -name = "pxfm" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.39.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" -dependencies = [ - "memchr", -] - -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.1", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash 2.1.1", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", -] - -[[package]] -name = "quote" -version = "1.0.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "range-alloc" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" - -[[package]] -name = "rangemap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" - -[[package]] -name = "rav1e" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" -dependencies = [ - "aligned-vec", - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av-scenechange", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.14.0", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "paste", - "profiling", - "rand 0.9.2", - "rand_chacha 0.9.0", - "simd_helpers", - "thiserror 2.0.18", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "raw-window-metal" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e8caa82e31bb98fee12fa8f051c94a6aa36b07cddb03f0d4fc558988360ff1" -dependencies = [ - "cocoa 0.25.0", - "core-graphics 0.23.2", - "objc", - "raw-window-handle", -] - -[[package]] -name = "raw-window-metal" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" -dependencies = [ - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "read-fonts" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b634fabf032fab15307ffd272149b622260f55974d9fad689292a5d33df02e5" -dependencies = [ - "bytemuck", - "font-types", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "redox_syscall" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" - -[[package]] -name = "renderdoc-sys" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" - -[[package]] -name = "resvg" -version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" -dependencies = [ - "log", - "pico-args", - "rgb", - "svgtypes", - "tiny-skia", - "usvg", -] - -[[package]] -name = "rgb" -version = "0.8.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "roxmltree" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" - -[[package]] -name = "rust-embed" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn 2.0.117", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" -dependencies = [ - "globset", - "sha2", - "walkdir", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.11.0", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags 2.11.0", - "errno", - "libc", - "linux-raw-sys 0.12.1", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "rustybuzz" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" -dependencies = [ - "bitflags 2.11.0", - "bytemuck", - "libm", - "smallvec", - "ttf-parser 0.21.1", - "unicode-bidi-mirroring 0.2.0", - "unicode-ccc 0.2.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "rustybuzz" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" -dependencies = [ - "bitflags 2.11.0", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser 0.25.1", - "unicode-bidi-mirroring 0.4.0", - "unicode-ccc 0.4.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "indexmap", - "ref-cast", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.117", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "screencapturekit" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5eeeb57ac94960cfe5ff4c402be6585ae4c8d29a2cf41b276048c2e849d64e" -dependencies = [ - "screencapturekit-sys", -] - -[[package]] -name = "screencapturekit-sys" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22411b57f7d49e7fe08025198813ee6fd65e1ee5eff4ebc7880c12c82bde4c60" -dependencies = [ - "block", - "dispatch", - "objc", - "objc-foundation", - "objc_id", - "once_cell", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.0", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "self_cell" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-wasm-bindgen" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_fmt" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "indexmap", - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_json_lenient" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e033097bf0d2b59a62b42c18ebbb797503839b26afdda2c4e1415cb6c813540" -dependencies = [ - "indexmap", - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876ac351060d4f882bb1032b6369eb0aef79ad9df1ea8bc404874d8cc3d0cd98" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" - -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - -[[package]] -name = "simplecss" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" -dependencies = [ - "log", -] - -[[package]] -name = "siphasher" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" - -[[package]] -name = "skrifa" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" -dependencies = [ - "bytemuck", - "read-fonts", -] - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "slotmap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "smol" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-net", - "async-process", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" - -[[package]] -name = "socket2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spirv" -version = "0.3.0+sdk-1.3.268.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "spirv" -version = "0.4.0+sdk-1.4.341.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "stacker" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.59.0", -] - -[[package]] -name = "stacksafe" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9c1172965d317e87ddb6d364a040d958b40a1db82b6ef97da26253a8b3d090" -dependencies = [ - "stacker", - "stacksafe-macro", -] - -[[package]] -name = "stacksafe-macro" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172175341049678163e979d9107ca3508046d4d2a7c6682bee46ac541b17db69" -dependencies = [ - "proc-macro-error2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" -dependencies = [ - "float-cmp", -] - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros 0.27.2", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.117", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "sval" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb9318255ebd817902d7e279d8f8e39b35b1b9954decd5eb9ea0e30e5fd2b6a" - -[[package]] -name = "sval_buffer" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12571299185e653fdb0fbfe36cd7f6529d39d4e747a60b15a3f34574b7b97c61" -dependencies = [ - "sval", - "sval_ref", -] - -[[package]] -name = "sval_dynamic" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39526f24e997706c0de7f03fb7371f7f5638b66a504ded508e20ad173d0a3677" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_fmt" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "933dd3bb26965d682280fcc49400ac2a05036f4ee1e6dbd61bf8402d5a5c3a54" -dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_json" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0cda08f6d5c9948024a6551077557b1fdcc3880ff2f20ae839667d2ec2d87ed" -dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_nested" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d49d5e6c1f9fd0e53515819b03a97ca4eb1bff5c8ee097c43391c09ecfb19f" -dependencies = [ - "sval", - "sval_buffer", - "sval_ref", -] - -[[package]] -name = "sval_ref" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f876c5a78405375b4e19cbb9554407513b59c93dea12dc6a4af4e1d30899ca" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_serde" -version = "2.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9ccd3b7f7200239a655e517dd3fd48d960b9111ad24bd6a5e055bef17607c7" -dependencies = [ - "serde_core", - "sval", - "sval_nested", -] - -[[package]] -name = "svg_fmt" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" - -[[package]] -name = "svgtypes" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" -dependencies = [ - "kurbo", - "siphasher", -] - -[[package]] -name = "swash" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "842f3cd369c2ba38966204f983eaa5e54a8e84a7d7159ed36ade2b6c335aae64" -dependencies = [ - "skrifa", - "yazi", - "zeno", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "sys-locale" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" -dependencies = [ - "libc", -] - -[[package]] -name = "sysinfo" -version = "0.31.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" -dependencies = [ - "core-foundation-sys", - "libc", - "memchr", - "ntapi", - "rayon", - "windows 0.57.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "taffy" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13e5d13f79d558b5d353a98072ca8ca0e99da429467804de959aa8c83c9a004" -dependencies = [ - "arrayvec", - "grid", - "serde", - "slotmap", -] - -[[package]] -name = "take-until" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bdb6fa0dfa67b38c1e66b7041ba9dcf23b99d8121907cd31c807a332f7a0bbb" - -[[package]] -name = "tao-core-video-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "objc", -] - -[[package]] -name = "tempfile" -version = "3.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand 2.3.0", - "getrandom 0.4.2", - "once_cell", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tiff" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" -dependencies = [ - "fax", - "flate2", - "half", - "quick-error", - "weezl", - "zune-jpeg", -] - -[[package]] -name = "time" -version = "0.1.0" -dependencies = [ - "bridge", - "num-traits", - "serde", - "tsify-next", - "wasm-bindgen", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "png 0.17.16", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" -dependencies = [ - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-socks" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" -dependencies = [ - "either", - "futures-util", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "0.9.12+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" -dependencies = [ - "indexmap", - "serde_core", - "serde_spanned 1.1.0", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.15", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_datetime" -version = "1.1.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.15", -] - -[[package]] -name = "toml_edit" -version = "0.25.8+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" -dependencies = [ - "indexmap", - "toml_datetime 1.1.0+spec-1.1.0", - "toml_parser", - "winnow 1.0.0", -] - -[[package]] -name = "toml_parser" -version = "1.1.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" -dependencies = [ - "winnow 1.0.0", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "toml_writer" -version = "1.1.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d282ade6016312faf3e41e57ebbba0c073e4056dab1232ab1cb624199648f8ed" - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tsify-next" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d0f2208feeb5f7a6edb15a2389c14cd42480ef6417318316bb866da5806a61d" -dependencies = [ - "gloo-utils", - "serde", - "serde-wasm-bindgen", - "serde_json", - "tsify-next-macros", - "wasm-bindgen", -] - -[[package]] -name = "tsify-next-macros" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81253930d0d388a3ab8fa4ae56da9973ab171ef833d1be2e9080fc3ce502bd6" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.117", -] - -[[package]] -name = "ttf-parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" - -[[package]] -name = "ttf-parser" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -dependencies = [ - "core_maths", -] - -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[package]] -name = "uds_windows" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" -dependencies = [ - "memoffset", - "tempfile", - "windows-sys 0.61.2", -] - -[[package]] -name = "unicase" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" - -[[package]] -name = "unicode-ccc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" - -[[package]] -name = "unicode-ccc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-linebreak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" - -[[package]] -name = "unicode-properties" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" - -[[package]] -name = "unicode-script" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" - -[[package]] -name = "unicode-segmentation" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" - -[[package]] -name = "unicode-vo" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[package]] -name = "usvg" -version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" -dependencies = [ - "base64", - "data-url", - "flate2", - "fontdb 0.23.0", - "imagesize", - "kurbo", - "log", - "pico-args", - "roxmltree", - "rustybuzz 0.20.1", - "simplecss", - "siphasher", - "strict-num", - "svgtypes", - "tiny-skia-path", - "unicode-bidi", - "unicode-script", - "unicode-vo", - "xmlwriter", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" -dependencies = [ - "getrandom 0.4.2", - "js-sys", - "serde_core", - "sha1_smol", - "wasm-bindgen", -] - -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - -[[package]] -name = "value-bag" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" -dependencies = [ - "value-bag-serde1", - "value-bag-sval2", -] - -[[package]] -name = "value-bag-serde1" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16530907bfe2999a1773ca5900a65101e092c70f642f25cc23ca0c43573262c5" -dependencies = [ - "erased-serde", - "serde_core", - "serde_fmt", -] - -[[package]] -name = "value-bag-sval2" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00ae130edd690eaa877e4f40605d534790d1cf1d651e7685bd6a144521b251f" -dependencies = [ - "sval", - "sval_buffer", - "sval_dynamic", - "sval_fmt", - "sval_json", - "sval_ref", - "sval_serde", -] - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dc0882f7b5bb01ae8c5215a1230832694481c1a4be062fd410e12ea3da5b631" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19280959e2844181895ef62f065c63e0ca07ece4771b53d89bfdb967d97cbf05" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75973d3066e01d035dbedaad2864c398df42f8dd7b1ea057c35b8407c015b537" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91af5e4be765819e0bcfee7322c14374dc821e35e72fa663a830bbc7dc199eac" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.117", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9bf0406a78f02f336bf1e451799cca198e8acde4ffa278f0fb20487b150a633" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.11.0", - "hashbrown 0.15.5", - "indexmap", - "semver", -] - -[[package]] -name = "wayland-backend" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa75f400b7f719bcd68b3f47cd939ba654cedeef690f486db71331eec4c6a406" -dependencies = [ - "cc", - "downcast-rs", - "rustix 1.1.4", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab51d9f7c071abeee76007e2b742499e535148035bb835f97aaed1338cf516c3" -dependencies = [ - "bitflags 2.11.0", - "rustix 1.1.4", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b3298683470fbdc6ca40151dfc48c8f2fd4c41a26e13042f801f85002384091" -dependencies = [ - "rustix 1.1.4", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" -dependencies = [ - "bitflags 2.11.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23b5df31ceff1328f06ac607591d5ba360cf58f90c8fad4ac8d3a55a3c4aec7" -dependencies = [ - "bitflags 2.11.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" -dependencies = [ - "bitflags 2.11.0", - "wayland-backend", - "wayland-client", - "wayland-protocols 0.31.2", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86287151a309799b821ca709b7345a048a2956af05957c89cb824ab919fa4e3" -dependencies = [ - "proc-macro2", - "quick-xml 0.39.2", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374f6b70e8e0d6bf9461a32988fd553b59ff630964924dad6e4a4eb6bd538d17" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "749466a37ee189057f54748b200186b59a03417a117267baf3fd89cecc9fb837" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "weezl" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" - -[[package]] -name = "wgpu" -version = "29.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c239a9a747bbd379590985bac952c2e53cb19873f7072b3370c6a6a8e06837" -dependencies = [ - "arrayvec", - "bitflags 2.11.0", - "bytemuck", - "cfg-if", - "cfg_aliases", - "document-features", - "hashbrown 0.16.1", - "js-sys", - "log", - "naga 29.0.1", - "parking_lot", - "portable-atomic", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-core" -version = "29.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e80ac6cf1895df6342f87d975162108f9d98772a0d74bc404ab7304ac29469e" -dependencies = [ - "arrayvec", - "bit-set 0.9.1", - "bit-vec 0.9.1", - "bitflags 2.11.0", - "bytemuck", - "cfg_aliases", - "document-features", - "hashbrown 0.16.1", - "indexmap", - "log", - "naga 29.0.1", - "once_cell", - "parking_lot", - "portable-atomic", - "profiling", - "raw-window-handle", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 2.0.18", - "wgpu-core-deps-apple", - "wgpu-core-deps-emscripten", - "wgpu-core-deps-wasm", - "wgpu-core-deps-windows-linux-android", - "wgpu-hal", - "wgpu-naga-bridge", - "wgpu-types", -] - -[[package]] -name = "wgpu-core-deps-apple" -version = "29.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43acd053312501689cd92a01a9638d37f3e41a5fd9534875efa8917ee2d11ac0" -dependencies = [ - "wgpu-hal", -] - -[[package]] -name = "wgpu-core-deps-emscripten" -version = "29.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef043bf135cc68b6f667c55ff4e345ce2b5924d75bad36a47921b0287ca4b24a" -dependencies = [ - "wgpu-hal", -] - -[[package]] -name = "wgpu-core-deps-wasm" -version = "29.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7b75e72f49035f000dd5262e4126242e92a090a4fd75931ecfe7e60784e6fa" -dependencies = [ - "wgpu-hal", -] - -[[package]] -name = "wgpu-core-deps-windows-linux-android" -version = "29.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "725d5c006a8c02967b6d93ef04f6537ec4593313e330cfe86d9d3f946eb90f28" -dependencies = [ - "wgpu-hal", -] - -[[package]] -name = "wgpu-hal" -version = "29.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a47aef47636562f3937285af4c44b4b5b404b46577471411cc5313a921da7e" -dependencies = [ - "android_system_properties", - "arrayvec", - "ash", - "bit-set 0.9.1", - "bitflags 2.11.0", - "block2", - "bytemuck", - "cfg-if", - "cfg_aliases", - "glow 0.17.0", - "glutin_wgl_sys", - "gpu-allocator", - "gpu-descriptor", - "hashbrown 0.16.1", - "js-sys", - "khronos-egl", - "libc", - "libloading", - "log", - "naga 29.0.1", - "ndk-sys", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", - "objc2-quartz-core", - "once_cell", - "ordered-float", - "parking_lot", - "portable-atomic", - "portable-atomic-util", - "profiling", - "range-alloc", - "raw-window-handle", - "raw-window-metal 1.1.0", - "renderdoc-sys", - "smallvec", - "thiserror 2.0.18", - "wasm-bindgen", - "wayland-sys", - "web-sys", - "wgpu-naga-bridge", - "wgpu-types", - "windows 0.62.2", - "windows-core 0.62.2", -] - -[[package]] -name = "wgpu-naga-bridge" -version = "29.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4684f4410da0cf95a4cb63bb5edaac022461dedb6adf0b64d0d9b5f6890d51" -dependencies = [ - "naga 29.0.1", - "wgpu-types", -] - -[[package]] -name = "wgpu-types" -version = "29.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2675540fb1a5cfa5ef122d3d5f390e2c75711a0b946410f2d6ac3a0f77d1f6" -dependencies = [ - "bitflags 2.11.0", - "bytemuck", - "js-sys", - "log", - "raw-window-handle", - "web-sys", -] - -[[package]] -name = "which" -version = "6.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" -dependencies = [ - "either", - "home", - "rustix 0.38.44", - "winsafe", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections 0.2.0", - "windows-core 0.61.2", - "windows-future 0.2.1", - "windows-link 0.1.3", - "windows-numerics 0.2.0", -] - -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections 0.3.2", - "windows-core 0.62.2", - "windows-future 0.3.2", - "windows-numerics 0.3.1", -] - -[[package]] -name = "windows-capture" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a4df73e95feddb9ec1a7e9c2ca6323b8c97d5eeeff78d28f1eccdf19c882b24" -dependencies = [ - "parking_lot", - "rayon", - "thiserror 2.0.18", - "windows 0.61.3", - "windows-future 0.2.1", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core 0.62.2", -] - -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading 0.1.0", -] - -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", - "windows-threading 0.2.1", -] - -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", -] - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result 0.3.4", - "windows-strings 0.3.1", - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-registry" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" -dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - -[[package]] -name = "wio" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" -dependencies = [ - "winapi", -] - -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck 0.5.0", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.11.0", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-clipboard" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" -dependencies = [ - "libc", - "x11rb", -] - -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "rustix 1.1.4", - "x11rb-protocol", - "xcursor", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - -[[package]] -name = "xattr" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" -dependencies = [ - "libc", -] - -[[package]] -name = "xcb" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4c580d8205abb0a5cf4eb7e927bd664e425b6c3263f9c5310583da96970cf6" -dependencies = [ - "bitflags 1.3.2", - "libc", - "quick-xml 0.30.0", - "x11", -] - -[[package]] -name = "xcursor" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" - -[[package]] -name = "xim-ctext" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac61a7062c40f3c37b6e82eeeef835d5cc7824b632a72784a89b3963c33284c" -dependencies = [ - "encoding_rs", -] - -[[package]] -name = "xim-parser" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dcee45f89572d5a65180af3a84e7ddb24f5ea690a6d3aa9de231281544dd7b7" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "xkbcommon" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" -dependencies = [ - "as-raw-xcb-connection", - "libc", - "memmap2", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "xml-rs" -version = "0.8.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" - -[[package]] -name = "xmlwriter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" - -[[package]] -name = "y4m" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" - -[[package]] -name = "yazi" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" - -[[package]] -name = "yeslogic-fontconfig-sys" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd" -dependencies = [ - "dlib", - "once_cell", - "pkg-config", -] - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure", -] - -[[package]] -name = "zbus" -version = "5.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" -dependencies = [ - "async-broadcast", - "async-executor", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener 5.4.1", - "futures-core", - "futures-lite 2.6.1", - "hex", - "libc", - "ordered-stream", - "rustix 1.1.4", - "serde", - "serde_repr", - "tracing", - "uds_windows", - "uuid", - "windows-sys 0.61.2", - "winnow 0.7.15", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "5.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.117", - "zbus_names", - "zvariant", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" -dependencies = [ - "serde", - "winnow 0.7.15", - "zvariant", -] - -[[package]] -name = "zed-async-tar" -version = "0.5.0-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cf4b5f655e29700e473cb1acd914ab112b37b62f96f7e642d5fc6a0c02eb881" -dependencies = [ - "async-std", - "filetime", - "libc", - "pin-project", - "redox_syscall 0.2.16", - "xattr", -] - -[[package]] -name = "zed-font-kit" -version = "0.14.1-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3898e450f36f852edda72e3f985c34426042c4951790b23b107f93394f9bff5" -dependencies = [ - "bitflags 2.11.0", - "byteorder", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "core-text", - "dirs 5.0.1", - "dwrote", - "float-ord", - "freetype-sys", - "lazy_static", - "libc", - "log", - "pathfinder_geometry", - "pathfinder_simd", - "walkdir", - "winapi", - "yeslogic-fontconfig-sys", -] - -[[package]] -name = "zed-reqwest" -version = "0.12.15-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2d05756ff48539950c3282ad7acf3817ad3f08797c205ad1c34a2ce03b9970" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-native-certs", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-rustls", - "tokio-socks", - "tokio-util", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "windows-registry 0.4.0", -] - -[[package]] -name = "zed-scap" -version = "0.0.8-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b338d705ae33a43ca00287c11129303a7a0aa57b101b72a1c08c863f698ac8" -dependencies = [ - "anyhow", - "cocoa 0.25.0", - "core-graphics-helmer-fork", - "log", - "objc", - "rand 0.8.5", - "screencapturekit", - "screencapturekit-sys", - "sysinfo", - "tao-core-video-sys", - "windows 0.61.3", - "windows-capture", - "x11", - "xcb", -] - -[[package]] -name = "zed-xim" -version = "0.4.0-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b46ed118eba34d9ba53d94ddc0b665e0e06a2cf874cfa2dd5dec278148642" -dependencies = [ - "ahash", - "hashbrown 0.14.5", - "log", - "x11rb", - "xim-ctext", - "xim-parser", -] - -[[package]] -name = "zeno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" - -[[package]] -name = "zerocopy" -version = "0.8.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[package]] -name = "zune-core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zune-jpeg" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" -dependencies = [ - "zune-core", -] - -[[package]] -name = "zvariant" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" -dependencies = [ - "endi", - "enumflags2", - "serde", - "url", - "winnow 0.7.15", - "zvariant_derive", - "zvariant_utils", -] - -[[package]] -name = "zvariant_derive" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.117", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.117", - "winnow 0.7.15", -] diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index b00c78e8..00000000 --- a/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[workspace] -resolver = "2" -members = [ - "apps/desktop", - "rust/crates/time", - "rust/crates/bridge", - "rust/crates/effects", - "rust/crates/gpu", - "rust/crates/masks", - "rust/wasm", "rust/crates/compositor", -] diff --git a/LICENSE b/LICENSE index e2c5ff28..ad719023 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2025 OpenCut +Copyright 2026 OpenCut Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/apps/desktop/Cargo.toml b/apps/desktop/Cargo.toml deleted file mode 100644 index e09443ab..00000000 --- a/apps/desktop/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "opencut-desktop" -version = "0.1.0" -edition = "2021" - -[[bin]] -name = "opencut" -path = "src/main.rs" - -[dependencies] -gpui = "0.2.2" diff --git a/apps/desktop/README.md b/apps/desktop/README.md deleted file mode 100644 index 9cff04e1..00000000 --- a/apps/desktop/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Desktop - -The native desktop app, built with [GPUI](https://gpui.rs). - -## Getting started - -**1. Install Rust:** - -```bash -# Linux / macOS / WSL -./script/setup-rust -``` - -```powershell -# Windows -powershell -ExecutionPolicy Bypass -File .\script\setup-rust.ps1 -``` - -Both scripts skip installation if Rust is already present. On Linux/macOS/WSL only: after a fresh install, reload your shell with `source "$HOME/.cargo/env"` - -**2. Install native dependencies:** - -```bash -# Linux / macOS / WSL -./apps/desktop/script/setup -``` - -```powershell -# Windows -powershell -ExecutionPolicy Bypass -File .\apps\desktop\script\setup.ps1 -``` - -**3. Run:** - -```bash -cargo run -p opencut-desktop -``` - -## Platform notes - -**Linux:** supports apt (Debian/Ubuntu/Mint), dnf (Fedora/RHEL), and pacman (Arch). - -**macOS:** installs Xcode Command Line Tools if missing. - -**Windows:** the setup script checks for Visual Studio Build Tools. If missing, it prints the install link. - -**WSL:** runs the same scripts as Linux. Window rendering works via WSLg on Windows 11 and Windows 10 22H2+. If you're on an older build, test on the host instead. diff --git a/apps/desktop/script/setup b/apps/desktop/script/setup deleted file mode 100644 index 3152a080..00000000 --- a/apps/desktop/script/setup +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env bash - -# Installs the native system libraries GPUI needs to compile on Linux/macOS. -# Run script/setup-rust first if you don't have Rust installed yet. - -set -euo pipefail - -if [ "$(id -u)" -eq 0 ]; then - maysudo='' -else - maysudo="$(command -v sudo || command -v doas || true)" -fi - -# Ubuntu, Debian, Mint, Pop!_OS, Kali, Raspbian, etc. -apt=$(command -v apt-get || true) -if [[ -n $apt ]]; then - deps=( - curl - build-essential - pkg-config - gcc - g++ - make - libasound2-dev - libfontconfig-dev - libglib2.0-dev - libssl-dev - libva-dev - libvulkan1 - libwayland-dev - libx11-xcb-dev - libxkbcommon-x11-dev - libzstd-dev - libsqlite3-dev - ) - - $maysudo "$apt" update - $maysudo "$apt" install -y "${deps[@]}" - echo "Desktop native dependencies installed." - exit 0 -fi - -# Fedora, RHEL, CentOS, Alma, etc. -dnf=$(command -v dnf || true) -if [[ -n $dnf ]]; then - deps=( - gcc - gcc-c++ - make - pkg-config - alsa-lib-devel - fontconfig-devel - glib2-devel - openssl-devel - libva-devel - vulkan-loader - wayland-devel - libxcb-devel - libxkbcommon-x11-devel - libzstd-devel - sqlite-devel - curl - ) - - $maysudo "$dnf" install -y "${deps[@]}" - echo "Desktop native dependencies installed." - exit 0 -fi - -# Arch, Manjaro, etc. -pacman=$(command -v pacman || true) -if [[ -n $pacman ]]; then - deps=( - gcc - make - pkgconf - alsa-lib - fontconfig - glib2 - openssl - libva - vulkan-loader - wayland - libxcb - libxkbcommon-x11 - zstd - sqlite - curl - ) - - $maysudo "$pacman" -Syu --needed --noconfirm "${deps[@]}" - echo "Desktop native dependencies installed." - exit 0 -fi - -# macOS -if [[ "$(uname)" == "Darwin" ]]; then - if ! xcode-select -p &> /dev/null; then - echo "Installing Xcode Command Line Tools..." - xcode-select --install - echo "Re-run this script after the Xcode install completes." - exit 0 - fi - - echo "Desktop native dependencies installed." - exit 0 -fi - -echo "Unsupported platform. See apps/desktop/README.md for manual setup instructions." -exit 1 diff --git a/apps/desktop/script/setup.ps1 b/apps/desktop/script/setup.ps1 deleted file mode 100644 index 63f7fd1a..00000000 --- a/apps/desktop/script/setup.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -# Installs the native build tools GPUI needs to compile on Windows. -# Run script/setup-rust.ps1 first if you don't have Rust installed yet. - -$ErrorActionPreference = "Stop" - -function Check-VSBuildTools { - $vswhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" - - if (-not (Test-Path $vswhere)) { - return $false - } - - $result = & $vswhere -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -property installationPath - return $result -and $result.Trim().Length -gt 0 -} - -if (-not (Check-VSBuildTools)) { - Write-Output "" - Write-Output "Visual Studio Build Tools with 'Desktop development with C++' not found." - Write-Output "" - Write-Output "Install it from: https://visualstudio.microsoft.com/visual-cpp-build-tools/" - Write-Output "Check the 'Desktop development with C++' workload during setup, then re-run this script." - Write-Output "" - exit 1 -} - -Write-Output "Desktop native dependencies ready." diff --git a/apps/desktop/src/main.rs b/apps/desktop/src/main.rs deleted file mode 100644 index 0ba70959..00000000 --- a/apps/desktop/src/main.rs +++ /dev/null @@ -1,41 +0,0 @@ -use gpui::{ - div, prelude::*, px, rgb, size, App, Application, Bounds, Context, SharedString, Window, - WindowBounds, WindowOptions, -}; - -struct AppWindow { - title: SharedString, -} - -impl Render for AppWindow { - fn render(&mut self, _window: &mut Window, _cx: &mut Context) -> impl IntoElement { - div() - .size_full() - .bg(rgb(0x0f0f0f)) - .flex() - .justify_center() - .items_center() - .text_xl() - .text_color(rgb(0xffffff)) - .child(self.title.clone()) - } -} - -fn main() { - Application::new().run(|cx: &mut App| { - let bounds = Bounds::centered(None, size(px(1280.), px(720.)), cx); - cx.open_window( - WindowOptions { - window_bounds: Some(WindowBounds::Windowed(bounds)), - ..Default::default() - }, - |_, cx| { - cx.new(|_| AppWindow { - title: "OpenCut".into(), - }) - }, - ) - .unwrap(); - cx.activate(true); - }); -} diff --git a/apps/web/.env.example b/apps/web/.env.example deleted file mode 100644 index b15779a5..00000000 --- a/apps/web/.env.example +++ /dev/null @@ -1,21 +0,0 @@ -# Environment variables example -# Copy this file to .env.local and update the values as needed - -# Node -NODE_ENV=development - -# Public -NEXT_PUBLIC_SITE_URL=http://localhost:3000 -NEXT_PUBLIC_MARBLE_API_URL=https://api.marblecms.com - -# Server -DATABASE_URL="postgresql://opencut:opencut@localhost:5432/opencut" -BETTER_AUTH_SECRET=your_better_auth_secret - -UPSTASH_REDIS_REST_URL=http://localhost:8079 -UPSTASH_REDIS_REST_TOKEN=example_token - -MARBLE_WORKSPACE_KEY=your_workspace_key_here - -FREESOUND_CLIENT_ID=your_client_id_here -FREESOUND_API_KEY=your_api_key_here diff --git a/apps/web/.gitignore b/apps/web/.gitignore deleted file mode 100644 index 2c4edca4..00000000 --- a/apps/web/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Turborepo -.turbo - -# Env vars -.env* -!.env.example - -.next/ - -.font-cache/ - -next-env.d.ts - -*.tsbuildinfo \ No newline at end of file diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile deleted file mode 100644 index a08d9b68..00000000 --- a/apps/web/Dockerfile +++ /dev/null @@ -1,62 +0,0 @@ -FROM oven/bun:alpine AS base - -FROM base AS builder - -WORKDIR /app - -ARG FREESOUND_CLIENT_ID -ARG FREESOUND_API_KEY -ARG NEXT_PUBLIC_MARBLE_API_URL=https://api.marblecms.com -ARG MARBLE_WORKSPACE_KEY=build-placeholder - -COPY package.json package.json -COPY bun.lock bun.lock -COPY turbo.json turbo.json - -COPY apps/web/package.json apps/web/package.json -RUN bun install - -COPY apps/web/ apps/web/ - -ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 - -# Build-time env stubs to pass zod validation -ENV DATABASE_URL="postgresql://opencut:opencut@localhost:5432/opencut" -ENV BETTER_AUTH_SECRET="build-time-secret" -ENV UPSTASH_REDIS_REST_URL="http://localhost:8079" -ENV UPSTASH_REDIS_REST_TOKEN="example_token" -ENV NEXT_PUBLIC_SITE_URL="http://localhost:3000" -ENV NEXT_PUBLIC_MARBLE_API_URL=$NEXT_PUBLIC_MARBLE_API_URL -ENV MARBLE_WORKSPACE_KEY=$MARBLE_WORKSPACE_KEY - -ENV FREESOUND_CLIENT_ID=$FREESOUND_CLIENT_ID -ENV FREESOUND_API_KEY=$FREESOUND_API_KEY - -WORKDIR /app/apps/web -RUN bun run build - -# Production image -FROM base AS runner -WORKDIR /app - -ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 - -RUN addgroup --system --gid 1001 nodejs -RUN adduser --system --uid 1001 nextjs - -COPY --from=builder --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public -COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static - -RUN chown nextjs:nodejs apps - -USER nextjs - -EXPOSE 3000 - -ENV PORT=3000 -ENV HOSTNAME="0.0.0.0" - -CMD ["bun", "apps/web/server.js"] diff --git a/apps/web/components.json b/apps/web/components.json deleted file mode 100644 index 3c84e31a..00000000 --- a/apps/web/components.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": true, - "tsx": true, - "tailwind": { - "config": "", - "css": "src/app/globals.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils", - "ui": "@/components/ui", - "lib": "@/lib", - "hooks": "@/hooks" - }, - "iconLibrary": "lucide" -} diff --git a/apps/web/content-collections.ts b/apps/web/content-collections.ts deleted file mode 100644 index 0fdd7234..00000000 --- a/apps/web/content-collections.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { defineCollection, defineConfig } from "@content-collections/core"; -import { z } from "zod"; - -const changelog = defineCollection({ - name: "changelog", - directory: "src/lib/changelog/entries", - include: "*.md", - schema: z.object({ - content: z.string(), - version: z.string(), - date: z.string(), - published: z.boolean().default(true), - title: z.string(), - description: z.string().optional(), - summary: z.string().optional(), - changes: z.array( - z.object({ - type: z.string(), - text: z.string(), - }), - ), - }), - transform: async (doc, { collection }) => { - const allDocs = await collection.documents(); - const publishedDocs = allDocs.filter((entry) => entry.published !== false); - const sorted = [...publishedDocs].sort((a, b) => - b.version.localeCompare(a.version, undefined, { numeric: true }), - ); - const isLatest = - doc.published !== false && sorted[0]?.version === doc.version; - return { ...doc, isLatest }; - }, -}); - -export default defineConfig({ - content: [changelog], -}); diff --git a/apps/web/drizzle.config.ts b/apps/web/drizzle.config.ts deleted file mode 100644 index f3c4b357..00000000 --- a/apps/web/drizzle.config.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Config } from "drizzle-kit"; -import * as dotenv from "dotenv"; - -if (process.env.NODE_ENV === "production") { - dotenv.config({ path: ".env.production" }); -} else { - dotenv.config({ path: ".env.local" }); -} - -const databaseUrl = process.env.DATABASE_URL; -if (!databaseUrl) { - throw new Error("DATABASE_URL is not set"); -} - -export default { - schema: "./src/lib/db/schema.ts", - dialect: "postgresql", - migrations: { - table: "drizzle_migrations", - }, - dbCredentials: { - url: databaseUrl, - }, - out: "./migrations", - strict: process.env.NODE_ENV === "production", -} satisfies Config; diff --git a/apps/web/migrations/0000_brainy_saracen.sql b/apps/web/migrations/0000_brainy_saracen.sql deleted file mode 100644 index 3179d6c5..00000000 --- a/apps/web/migrations/0000_brainy_saracen.sql +++ /dev/null @@ -1,62 +0,0 @@ -CREATE TABLE "accounts" ( - "id" text PRIMARY KEY NOT NULL, - "account_id" text NOT NULL, - "provider_id" text NOT NULL, - "user_id" text NOT NULL, - "access_token" text, - "refresh_token" text, - "id_token" text, - "access_token_expires_at" timestamp, - "refresh_token_expires_at" timestamp, - "scope" text, - "password" text, - "created_at" timestamp NOT NULL, - "updated_at" timestamp NOT NULL -); ---> statement-breakpoint -ALTER TABLE "accounts" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint -CREATE TABLE "sessions" ( - "id" text PRIMARY KEY NOT NULL, - "expires_at" timestamp NOT NULL, - "token" text NOT NULL, - "created_at" timestamp NOT NULL, - "updated_at" timestamp NOT NULL, - "ip_address" text, - "user_agent" text, - "user_id" text NOT NULL, - CONSTRAINT "sessions_token_unique" UNIQUE("token") -); ---> statement-breakpoint -ALTER TABLE "sessions" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint -CREATE TABLE "users" ( - "id" text PRIMARY KEY NOT NULL, - "name" text NOT NULL, - "email" text NOT NULL, - "email_verified" boolean NOT NULL, - "image" text, - "created_at" timestamp NOT NULL, - "updated_at" timestamp NOT NULL, - CONSTRAINT "users_email_unique" UNIQUE("email") -); ---> statement-breakpoint -ALTER TABLE "users" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint -CREATE TABLE "verifications" ( - "id" text PRIMARY KEY NOT NULL, - "identifier" text NOT NULL, - "value" text NOT NULL, - "expires_at" timestamp NOT NULL, - "created_at" timestamp, - "updated_at" timestamp -); ---> statement-breakpoint -ALTER TABLE "verifications" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint -CREATE TABLE "waitlist" ( - "id" text PRIMARY KEY NOT NULL, - "email" text NOT NULL, - "created_at" timestamp NOT NULL, - CONSTRAINT "waitlist_email_unique" UNIQUE("email") -); ---> statement-breakpoint -ALTER TABLE "waitlist" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint -ALTER TABLE "accounts" ADD CONSTRAINT "accounts_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/apps/web/migrations/meta/0000_snapshot.json b/apps/web/migrations/meta/0000_snapshot.json deleted file mode 100644 index 42bae1c6..00000000 --- a/apps/web/migrations/meta/0000_snapshot.json +++ /dev/null @@ -1,344 +0,0 @@ -{ - "id": "33a6742f-89da-4ac5-958f-421aa1cf9bd6", - "prevId": "00000000-0000-0000-0000-000000000000", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.accounts": { - "name": "accounts", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "account_id": { - "name": "account_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "provider_id": { - "name": "provider_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "access_token": { - "name": "access_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "refresh_token": { - "name": "refresh_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "id_token": { - "name": "id_token", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "access_token_expires_at": { - "name": "access_token_expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "refresh_token_expires_at": { - "name": "refresh_token_expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "scope": { - "name": "scope", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "accounts_user_id_users_id_fk": { - "name": "accounts_user_id_users_id_fk", - "tableFrom": "accounts", - "tableTo": "users", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": true - }, - "public.sessions": { - "name": "sessions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "sessions_user_id_users_id_fk": { - "name": "sessions_user_id_users_id_fk", - "tableFrom": "sessions", - "tableTo": "users", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "sessions_token_unique": { - "name": "sessions_token_unique", - "nullsNotDistinct": false, - "columns": ["token"] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": true - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "email_verified": { - "name": "email_verified", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "image": { - "name": "image", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_email_unique": { - "name": "users_email_unique", - "nullsNotDistinct": false, - "columns": ["email"] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": true - }, - "public.verifications": { - "name": "verifications", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "identifier": { - "name": "identifier", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "value": { - "name": "value", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": true - }, - "public.waitlist": { - "name": "waitlist", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "waitlist_email_unique": { - "name": "waitlist_email_unique", - "nullsNotDistinct": false, - "columns": ["email"] - } - }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": true - } - }, - "enums": {}, - "schemas": {}, - "sequences": {}, - "roles": {}, - "policies": {}, - "views": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} diff --git a/apps/web/migrations/meta/_journal.json b/apps/web/migrations/meta/_journal.json deleted file mode 100644 index a91398ed..00000000 --- a/apps/web/migrations/meta/_journal.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "7", - "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1750753385927, - "tag": "0000_brainy_saracen", - "breakpoints": true - } - ] -} diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts deleted file mode 100644 index 71d96c23..00000000 --- a/apps/web/next.config.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { NextConfig } from "next"; -import { withBotId } from "botid/next/config"; -import { withContentCollections } from "@content-collections/next"; - -const nextConfig: NextConfig = { - compiler: { - removeConsole: process.env.NODE_ENV === "production", - }, - reactStrictMode: true, - productionBrowserSourceMaps: true, - output: "standalone", - images: { - remotePatterns: [ - { - protocol: "https", - hostname: "plus.unsplash.com", - }, - { - protocol: "https", - hostname: "images.unsplash.com", - }, - { - protocol: "https", - hostname: "images.marblecms.com", - }, - { - protocol: "https", - hostname: "lh3.googleusercontent.com", - }, - { - protocol: "https", - hostname: "avatars.githubusercontent.com", - }, - { - protocol: "https", - hostname: "api.iconify.design", - }, - { - protocol: "https", - hostname: "api.simplesvg.com", - }, - { - protocol: "https", - hostname: "api.unisvg.com", - }, - { - protocol: "https", - hostname: "cdn.brandfetch.io", - }, - ], - }, -}; - -export default withContentCollections(withBotId(nextConfig)); diff --git a/apps/web/open-next.config.ts b/apps/web/open-next.config.ts deleted file mode 100644 index 36144eb1..00000000 --- a/apps/web/open-next.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { defineCloudflareConfig } from "@opennextjs/cloudflare"; - -export default defineCloudflareConfig(); \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json deleted file mode 100644 index bbc3ad0a..00000000 --- a/apps/web/package.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "name": "@opencut/web", - "version": "0.1.0", - "private": true, - "packageManager": "bun@1.2.18", - "scripts": { - "dev": "next dev --turbopack", - "build": "next build", - "start": "next start", - "preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview", - "deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy", - "lint": "biome check src/", - "lint:fix": "biome check src/ --write", - "format": "biome format src/ --write", - "db:generate": "drizzle-kit generate", - "db:migrate": "drizzle-kit migrate", - "db:push:local": "cross-env NODE_ENV=development drizzle-kit push", - "db:push:prod": "cross-env NODE_ENV=production drizzle-kit push" - }, - "dependencies": { - "@hello-pangea/dnd": "^18.0.1", - "@hugeicons/core-free-icons": "^3.3.0", - "@hugeicons/react": "^1.1.6", - "@huggingface/transformers": "^3.8.1", - "@opennextjs/cloudflare": "^1.18.0", - "@radix-ui/react-accordion": "^1.2.12", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-primitive": "^2.1.4", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-tooltip": "^1.2.8", - "@types/culori": "^4.0.1", - "@upstash/ratelimit": "^2.0.6", - "@upstash/redis": "^1.35.4", - "better-auth": "^1.2.7", - "botid": "^1.5.11", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.0.0", - "culori": "^4.0.2", - "drizzle-orm": "^0.44.2", - "embla-carousel-react": "^8.5.1", - "eventemitter3": "^5.0.1", - "feed": "^5.1.0", - "input-otp": "^1.4.1", - "lucide-react": "^0.562.0", - "mediabunny": "^1.29.1", - "motion": "^12.18.1", - "nanoid": "^5.1.5", - "next": "16.1.3", - "next-themes": "^0.4.4", - "opencut-wasm": "^0.2.10", - "pg": "^8.16.2", - "postgres": "^3.4.5", - "radix-ui": "^1.4.3", - "react": "^19.0.0", - "react-day-picker": "^8.10.1", - "react-dom": "^19.0.0", - "react-hook-form": "^7.54.0", - "react-icons": "^5.4.0", - "react-markdown": "^10.1.0", - "react-resizable-panels": "^2.1.7", - "react-window": "^2.2.7", - "rehype-autolink-headings": "^7.1.0", - "rehype-parse": "^9.0.1", - "rehype-sanitize": "^6.0.0", - "rehype-slug": "^6.0.0", - "rehype-stringify": "^10.0.1", - "sonner": "^1.7.1", - "soundtouchjs": "^0.3.0", - "tailwind-merge": "^3.5.0", - "tailwindcss-animate": "^1.0.7", - "unified": "^11.0.5", - "use-deep-compare-effect": "^1.8.1", - "wavesurfer.js": "^7.9.8", - "zod": "4.3.6", - "zustand": "^5.0.2" - }, - "devDependencies": { - "@content-collections/core": "^0.14.1", - "@content-collections/next": "^0.2.11", - "@napi-rs/canvas": "^0.1.92", - "@tailwindcss/postcss": "^4.2.1", - "@tailwindcss/typography": "^0.5.19", - "@types/bun": "latest", - "@types/node": "^24.2.1", - "@types/pg": "^8.15.4", - "@types/react": "^19", - "@types/react-dom": "^19", - "cross-env": "^7.0.3", - "dotenv": "^16.5.0", - "drizzle-kit": "^0.31.4", - "postcss": "^8", - "sharp": "^0.34.5", - "tailwindcss": "^4.2.1", - "typescript": "^5.8.3", - "wrangler": "^4.77.0" - } -} diff --git a/apps/web/postcss.config.mjs b/apps/web/postcss.config.mjs deleted file mode 100644 index 61e36849..00000000 --- a/apps/web/postcss.config.mjs +++ /dev/null @@ -1,7 +0,0 @@ -const config = { - plugins: { - "@tailwindcss/postcss": {}, - }, -}; - -export default config; diff --git a/apps/web/public/_headers b/apps/web/public/_headers deleted file mode 100644 index 0a731a13..00000000 --- a/apps/web/public/_headers +++ /dev/null @@ -1,2 +0,0 @@ -/_next/static/* - Cache-Control: public,max-age=31536000,immutable diff --git a/apps/web/public/browserconfig.xml b/apps/web/public/browserconfig.xml deleted file mode 100644 index 3e94aae9..00000000 --- a/apps/web/public/browserconfig.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - #ffffff - - - \ No newline at end of file diff --git a/apps/web/public/effects/preview.jpg b/apps/web/public/effects/preview.jpg deleted file mode 100644 index 6519189c..00000000 Binary files a/apps/web/public/effects/preview.jpg and /dev/null differ diff --git a/apps/web/public/favicon.ico b/apps/web/public/favicon.ico deleted file mode 100644 index 9b2cba8f..00000000 Binary files a/apps/web/public/favicon.ico and /dev/null differ diff --git a/apps/web/public/flags/ad.svg b/apps/web/public/flags/ad.svg deleted file mode 100644 index dd495953..00000000 --- a/apps/web/public/flags/ad.svg +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ae.svg b/apps/web/public/flags/ae.svg deleted file mode 100644 index 810de70d..00000000 --- a/apps/web/public/flags/ae.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/af.svg b/apps/web/public/flags/af.svg deleted file mode 100644 index 2924328c..00000000 --- a/apps/web/public/flags/af.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ag.svg b/apps/web/public/flags/ag.svg deleted file mode 100644 index 39a4c90b..00000000 --- a/apps/web/public/flags/ag.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ai.svg b/apps/web/public/flags/ai.svg deleted file mode 100644 index 0fb6032f..00000000 --- a/apps/web/public/flags/ai.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/al.svg b/apps/web/public/flags/al.svg deleted file mode 100644 index c1353dd3..00000000 --- a/apps/web/public/flags/al.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/am.svg b/apps/web/public/flags/am.svg deleted file mode 100644 index 0bcc6cae..00000000 --- a/apps/web/public/flags/am.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/ao.svg b/apps/web/public/flags/ao.svg deleted file mode 100644 index d37de17b..00000000 --- a/apps/web/public/flags/ao.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/aq.svg b/apps/web/public/flags/aq.svg deleted file mode 100644 index 78ce8a5f..00000000 --- a/apps/web/public/flags/aq.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/ar.svg b/apps/web/public/flags/ar.svg deleted file mode 100644 index 45ac8867..00000000 --- a/apps/web/public/flags/ar.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/arab.svg b/apps/web/public/flags/arab.svg deleted file mode 100644 index f037ddb9..00000000 --- a/apps/web/public/flags/arab.svg +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/as.svg b/apps/web/public/flags/as.svg deleted file mode 100644 index f23d9d9b..00000000 --- a/apps/web/public/flags/as.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/asean.svg b/apps/web/public/flags/asean.svg deleted file mode 100644 index 63f4dcd6..00000000 --- a/apps/web/public/flags/asean.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/at.svg b/apps/web/public/flags/at.svg deleted file mode 100644 index 76149868..00000000 --- a/apps/web/public/flags/at.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/au.svg b/apps/web/public/flags/au.svg deleted file mode 100644 index fad9844a..00000000 --- a/apps/web/public/flags/au.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/aw.svg b/apps/web/public/flags/aw.svg deleted file mode 100644 index 78a54790..00000000 --- a/apps/web/public/flags/aw.svg +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ax.svg b/apps/web/public/flags/ax.svg deleted file mode 100644 index e53cadd8..00000000 --- a/apps/web/public/flags/ax.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/az.svg b/apps/web/public/flags/az.svg deleted file mode 100644 index 9849619d..00000000 --- a/apps/web/public/flags/az.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/ba.svg b/apps/web/public/flags/ba.svg deleted file mode 100644 index db836308..00000000 --- a/apps/web/public/flags/ba.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/web/public/flags/bb.svg b/apps/web/public/flags/bb.svg deleted file mode 100644 index f6843199..00000000 --- a/apps/web/public/flags/bb.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/bd.svg b/apps/web/public/flags/bd.svg deleted file mode 100644 index 2d3b50ed..00000000 --- a/apps/web/public/flags/bd.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/be.svg b/apps/web/public/flags/be.svg deleted file mode 100644 index b3754f1b..00000000 --- a/apps/web/public/flags/be.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/bf.svg b/apps/web/public/flags/bf.svg deleted file mode 100644 index 8095ee17..00000000 --- a/apps/web/public/flags/bf.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/bg.svg b/apps/web/public/flags/bg.svg deleted file mode 100644 index e6668f5a..00000000 --- a/apps/web/public/flags/bg.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/bh.svg b/apps/web/public/flags/bh.svg deleted file mode 100644 index 0e9b7198..00000000 --- a/apps/web/public/flags/bh.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/bi.svg b/apps/web/public/flags/bi.svg deleted file mode 100644 index 4e832637..00000000 --- a/apps/web/public/flags/bi.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bj.svg b/apps/web/public/flags/bj.svg deleted file mode 100644 index ac0d0741..00000000 --- a/apps/web/public/flags/bj.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bl.svg b/apps/web/public/flags/bl.svg deleted file mode 100644 index ad89c4ca..00000000 --- a/apps/web/public/flags/bl.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/bm.svg b/apps/web/public/flags/bm.svg deleted file mode 100644 index 98578e41..00000000 --- a/apps/web/public/flags/bm.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bn.svg b/apps/web/public/flags/bn.svg deleted file mode 100644 index afb72607..00000000 --- a/apps/web/public/flags/bn.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bo.svg b/apps/web/public/flags/bo.svg deleted file mode 100644 index 2ebe4df3..00000000 --- a/apps/web/public/flags/bo.svg +++ /dev/null @@ -1,673 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bq.svg b/apps/web/public/flags/bq.svg deleted file mode 100644 index 10ba3c76..00000000 --- a/apps/web/public/flags/bq.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/br.svg b/apps/web/public/flags/br.svg deleted file mode 100644 index 56fdbc68..00000000 --- a/apps/web/public/flags/br.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bs.svg b/apps/web/public/flags/bs.svg deleted file mode 100644 index 3198dcb0..00000000 --- a/apps/web/public/flags/bs.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bt.svg b/apps/web/public/flags/bt.svg deleted file mode 100644 index c707bb43..00000000 --- a/apps/web/public/flags/bt.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bv.svg b/apps/web/public/flags/bv.svg deleted file mode 100644 index 1e6aeab0..00000000 --- a/apps/web/public/flags/bv.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bw.svg b/apps/web/public/flags/bw.svg deleted file mode 100644 index 355181cf..00000000 --- a/apps/web/public/flags/bw.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/by.svg b/apps/web/public/flags/by.svg deleted file mode 100644 index 66f2daa9..00000000 --- a/apps/web/public/flags/by.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/bz.svg b/apps/web/public/flags/bz.svg deleted file mode 100644 index 8609d443..00000000 --- a/apps/web/public/flags/bz.svg +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ca.svg b/apps/web/public/flags/ca.svg deleted file mode 100644 index 8e6f250e..00000000 --- a/apps/web/public/flags/ca.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/cc.svg b/apps/web/public/flags/cc.svg deleted file mode 100644 index 647426e1..00000000 --- a/apps/web/public/flags/cc.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cd.svg b/apps/web/public/flags/cd.svg deleted file mode 100644 index a5645550..00000000 --- a/apps/web/public/flags/cd.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/cefta.svg b/apps/web/public/flags/cefta.svg deleted file mode 100644 index 3cf5884b..00000000 --- a/apps/web/public/flags/cefta.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cf.svg b/apps/web/public/flags/cf.svg deleted file mode 100644 index 34af5dae..00000000 --- a/apps/web/public/flags/cf.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cg.svg b/apps/web/public/flags/cg.svg deleted file mode 100644 index cec3b071..00000000 --- a/apps/web/public/flags/cg.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/web/public/flags/ch.svg b/apps/web/public/flags/ch.svg deleted file mode 100644 index 8980960b..00000000 --- a/apps/web/public/flags/ch.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/ci.svg b/apps/web/public/flags/ci.svg deleted file mode 100644 index 6e71beef..00000000 --- a/apps/web/public/flags/ci.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/ck.svg b/apps/web/public/flags/ck.svg deleted file mode 100644 index 9217b6be..00000000 --- a/apps/web/public/flags/ck.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/cl.svg b/apps/web/public/flags/cl.svg deleted file mode 100644 index 477fb220..00000000 --- a/apps/web/public/flags/cl.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cm.svg b/apps/web/public/flags/cm.svg deleted file mode 100644 index fbfd5236..00000000 --- a/apps/web/public/flags/cm.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cn.svg b/apps/web/public/flags/cn.svg deleted file mode 100644 index 86a6776b..00000000 --- a/apps/web/public/flags/cn.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/web/public/flags/co.svg b/apps/web/public/flags/co.svg deleted file mode 100644 index 2fa50c0b..00000000 --- a/apps/web/public/flags/co.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/cp.svg b/apps/web/public/flags/cp.svg deleted file mode 100644 index dd2edf4d..00000000 --- a/apps/web/public/flags/cp.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/cr.svg b/apps/web/public/flags/cr.svg deleted file mode 100644 index ff3bc1d9..00000000 --- a/apps/web/public/flags/cr.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/cu.svg b/apps/web/public/flags/cu.svg deleted file mode 100644 index ab740b00..00000000 --- a/apps/web/public/flags/cu.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cv.svg b/apps/web/public/flags/cv.svg deleted file mode 100644 index a1dd7f6b..00000000 --- a/apps/web/public/flags/cv.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cw.svg b/apps/web/public/flags/cw.svg deleted file mode 100644 index c8bd3bfa..00000000 --- a/apps/web/public/flags/cw.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cx.svg b/apps/web/public/flags/cx.svg deleted file mode 100644 index b1b77010..00000000 --- a/apps/web/public/flags/cx.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/cy.svg b/apps/web/public/flags/cy.svg deleted file mode 100644 index e92a6b2c..00000000 --- a/apps/web/public/flags/cy.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/cz.svg b/apps/web/public/flags/cz.svg deleted file mode 100644 index 846f0b98..00000000 --- a/apps/web/public/flags/cz.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/de.svg b/apps/web/public/flags/de.svg deleted file mode 100644 index 0e357abe..00000000 --- a/apps/web/public/flags/de.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/dg.svg b/apps/web/public/flags/dg.svg deleted file mode 100644 index 0feac1f0..00000000 --- a/apps/web/public/flags/dg.svg +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/dj.svg b/apps/web/public/flags/dj.svg deleted file mode 100644 index 50ed6aa6..00000000 --- a/apps/web/public/flags/dj.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/dk.svg b/apps/web/public/flags/dk.svg deleted file mode 100644 index f9dbb2d3..00000000 --- a/apps/web/public/flags/dk.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/dm.svg b/apps/web/public/flags/dm.svg deleted file mode 100644 index fbe5e29d..00000000 --- a/apps/web/public/flags/dm.svg +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/do.svg b/apps/web/public/flags/do.svg deleted file mode 100644 index fa1154e1..00000000 --- a/apps/web/public/flags/do.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/dz.svg b/apps/web/public/flags/dz.svg deleted file mode 100644 index 107988f1..00000000 --- a/apps/web/public/flags/dz.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/eac.svg b/apps/web/public/flags/eac.svg deleted file mode 100644 index 714f9ad2..00000000 --- a/apps/web/public/flags/eac.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ec.svg b/apps/web/public/flags/ec.svg deleted file mode 100644 index b133e017..00000000 --- a/apps/web/public/flags/ec.svg +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ee.svg b/apps/web/public/flags/ee.svg deleted file mode 100644 index c0ffad85..00000000 --- a/apps/web/public/flags/ee.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/eg.svg b/apps/web/public/flags/eg.svg deleted file mode 100644 index fbce4b7e..00000000 --- a/apps/web/public/flags/eg.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/eh.svg b/apps/web/public/flags/eh.svg deleted file mode 100644 index a47c534c..00000000 --- a/apps/web/public/flags/eh.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/er.svg b/apps/web/public/flags/er.svg deleted file mode 100644 index 273dca76..00000000 --- a/apps/web/public/flags/er.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/es-ct.svg b/apps/web/public/flags/es-ct.svg deleted file mode 100644 index edfabd67..00000000 --- a/apps/web/public/flags/es-ct.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/es-ga.svg b/apps/web/public/flags/es-ga.svg deleted file mode 100644 index 0153e302..00000000 --- a/apps/web/public/flags/es-ga.svg +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/es-pv.svg b/apps/web/public/flags/es-pv.svg deleted file mode 100644 index 52b393de..00000000 --- a/apps/web/public/flags/es-pv.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/es.svg b/apps/web/public/flags/es.svg deleted file mode 100644 index 2e1932fa..00000000 --- a/apps/web/public/flags/es.svg +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/et.svg b/apps/web/public/flags/et.svg deleted file mode 100644 index 22253643..00000000 --- a/apps/web/public/flags/et.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/eu.svg b/apps/web/public/flags/eu.svg deleted file mode 100644 index 6081c890..00000000 --- a/apps/web/public/flags/eu.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/fi.svg b/apps/web/public/flags/fi.svg deleted file mode 100644 index 380352b5..00000000 --- a/apps/web/public/flags/fi.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/fj.svg b/apps/web/public/flags/fj.svg deleted file mode 100644 index e0e562d2..00000000 --- a/apps/web/public/flags/fj.svg +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/fk.svg b/apps/web/public/flags/fk.svg deleted file mode 100644 index f81650eb..00000000 --- a/apps/web/public/flags/fk.svg +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/fm.svg b/apps/web/public/flags/fm.svg deleted file mode 100644 index 74ac77a8..00000000 --- a/apps/web/public/flags/fm.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/web/public/flags/fo.svg b/apps/web/public/flags/fo.svg deleted file mode 100644 index 8e52069e..00000000 --- a/apps/web/public/flags/fo.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/web/public/flags/fr.svg b/apps/web/public/flags/fr.svg deleted file mode 100644 index 49d4bb30..00000000 --- a/apps/web/public/flags/fr.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/ga.svg b/apps/web/public/flags/ga.svg deleted file mode 100644 index 7cc67746..00000000 --- a/apps/web/public/flags/ga.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/gb-eng.svg b/apps/web/public/flags/gb-eng.svg deleted file mode 100644 index 0f4c5d5d..00000000 --- a/apps/web/public/flags/gb-eng.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/gb-nir.svg b/apps/web/public/flags/gb-nir.svg deleted file mode 100644 index 685ed17a..00000000 --- a/apps/web/public/flags/gb-nir.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gb-sct.svg b/apps/web/public/flags/gb-sct.svg deleted file mode 100644 index 7ec53f4f..00000000 --- a/apps/web/public/flags/gb-sct.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/gb-wls.svg b/apps/web/public/flags/gb-wls.svg deleted file mode 100644 index 2f352500..00000000 --- a/apps/web/public/flags/gb-wls.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/gb.svg b/apps/web/public/flags/gb.svg deleted file mode 100644 index 7e7594d2..00000000 --- a/apps/web/public/flags/gb.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/gd.svg b/apps/web/public/flags/gd.svg deleted file mode 100644 index 81941264..00000000 --- a/apps/web/public/flags/gd.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ge.svg b/apps/web/public/flags/ge.svg deleted file mode 100644 index d0800a98..00000000 --- a/apps/web/public/flags/ge.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/gf.svg b/apps/web/public/flags/gf.svg deleted file mode 100644 index 0283fdec..00000000 --- a/apps/web/public/flags/gf.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/gg.svg b/apps/web/public/flags/gg.svg deleted file mode 100644 index 1b80efe4..00000000 --- a/apps/web/public/flags/gg.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/gh.svg b/apps/web/public/flags/gh.svg deleted file mode 100644 index 1a9047d7..00000000 --- a/apps/web/public/flags/gh.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/gi.svg b/apps/web/public/flags/gi.svg deleted file mode 100644 index 3b74d19a..00000000 --- a/apps/web/public/flags/gi.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gl.svg b/apps/web/public/flags/gl.svg deleted file mode 100644 index 938d20fa..00000000 --- a/apps/web/public/flags/gl.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/gm.svg b/apps/web/public/flags/gm.svg deleted file mode 100644 index 4b9515fd..00000000 --- a/apps/web/public/flags/gm.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gn.svg b/apps/web/public/flags/gn.svg deleted file mode 100644 index 00eca826..00000000 --- a/apps/web/public/flags/gn.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/gp.svg b/apps/web/public/flags/gp.svg deleted file mode 100644 index 06b67891..00000000 --- a/apps/web/public/flags/gp.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/gq.svg b/apps/web/public/flags/gq.svg deleted file mode 100644 index f12157bf..00000000 --- a/apps/web/public/flags/gq.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gr.svg b/apps/web/public/flags/gr.svg deleted file mode 100644 index 2bfaa7e0..00000000 --- a/apps/web/public/flags/gr.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gs.svg b/apps/web/public/flags/gs.svg deleted file mode 100644 index 0d6ff142..00000000 --- a/apps/web/public/flags/gs.svg +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gt.svg b/apps/web/public/flags/gt.svg deleted file mode 100644 index a90ed5bf..00000000 --- a/apps/web/public/flags/gt.svg +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gu.svg b/apps/web/public/flags/gu.svg deleted file mode 100644 index a1b53b87..00000000 --- a/apps/web/public/flags/gu.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gw.svg b/apps/web/public/flags/gw.svg deleted file mode 100644 index 8a846ad0..00000000 --- a/apps/web/public/flags/gw.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/gy.svg b/apps/web/public/flags/gy.svg deleted file mode 100644 index 93d8b27a..00000000 --- a/apps/web/public/flags/gy.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/hk.svg b/apps/web/public/flags/hk.svg deleted file mode 100644 index ffa87a23..00000000 --- a/apps/web/public/flags/hk.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/hm.svg b/apps/web/public/flags/hm.svg deleted file mode 100644 index 6402ed8d..00000000 --- a/apps/web/public/flags/hm.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/hn.svg b/apps/web/public/flags/hn.svg deleted file mode 100644 index dbda0dd3..00000000 --- a/apps/web/public/flags/hn.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/hr.svg b/apps/web/public/flags/hr.svg deleted file mode 100644 index ac129f1f..00000000 --- a/apps/web/public/flags/hr.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ht.svg b/apps/web/public/flags/ht.svg deleted file mode 100644 index 3f246da8..00000000 --- a/apps/web/public/flags/ht.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/hu.svg b/apps/web/public/flags/hu.svg deleted file mode 100644 index 32ea446b..00000000 --- a/apps/web/public/flags/hu.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/ic.svg b/apps/web/public/flags/ic.svg deleted file mode 100644 index d45040c2..00000000 --- a/apps/web/public/flags/ic.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/id.svg b/apps/web/public/flags/id.svg deleted file mode 100644 index ce55a92f..00000000 --- a/apps/web/public/flags/id.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/ie.svg b/apps/web/public/flags/ie.svg deleted file mode 100644 index 2b16cf12..00000000 --- a/apps/web/public/flags/ie.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/il.svg b/apps/web/public/flags/il.svg deleted file mode 100644 index 359d81cd..00000000 --- a/apps/web/public/flags/il.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/im.svg b/apps/web/public/flags/im.svg deleted file mode 100644 index 23a38f16..00000000 --- a/apps/web/public/flags/im.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/in.svg b/apps/web/public/flags/in.svg deleted file mode 100644 index 5fea2313..00000000 --- a/apps/web/public/flags/in.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/io.svg b/apps/web/public/flags/io.svg deleted file mode 100644 index db811a4d..00000000 --- a/apps/web/public/flags/io.svg +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/iq.svg b/apps/web/public/flags/iq.svg deleted file mode 100644 index 6b1346e8..00000000 --- a/apps/web/public/flags/iq.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/apps/web/public/flags/ir.svg b/apps/web/public/flags/ir.svg deleted file mode 100644 index 04ef60b1..00000000 --- a/apps/web/public/flags/ir.svg +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/is.svg b/apps/web/public/flags/is.svg deleted file mode 100644 index fe08a02f..00000000 --- a/apps/web/public/flags/is.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/web/public/flags/it.svg b/apps/web/public/flags/it.svg deleted file mode 100644 index 88bd45c2..00000000 --- a/apps/web/public/flags/it.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/je.svg b/apps/web/public/flags/je.svg deleted file mode 100644 index 9acb4450..00000000 --- a/apps/web/public/flags/je.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/jm.svg b/apps/web/public/flags/jm.svg deleted file mode 100644 index a114f8ce..00000000 --- a/apps/web/public/flags/jm.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/jo.svg b/apps/web/public/flags/jo.svg deleted file mode 100644 index bd34ede2..00000000 --- a/apps/web/public/flags/jo.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/jp.svg b/apps/web/public/flags/jp.svg deleted file mode 100644 index 2ec85aa1..00000000 --- a/apps/web/public/flags/jp.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/web/public/flags/ke.svg b/apps/web/public/flags/ke.svg deleted file mode 100644 index c8004f29..00000000 --- a/apps/web/public/flags/ke.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/kg.svg b/apps/web/public/flags/kg.svg deleted file mode 100644 index 13ae427b..00000000 --- a/apps/web/public/flags/kg.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/kh.svg b/apps/web/public/flags/kh.svg deleted file mode 100644 index 7f8f9255..00000000 --- a/apps/web/public/flags/kh.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ki.svg b/apps/web/public/flags/ki.svg deleted file mode 100644 index 14466d23..00000000 --- a/apps/web/public/flags/ki.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/km.svg b/apps/web/public/flags/km.svg deleted file mode 100644 index 11429843..00000000 --- a/apps/web/public/flags/km.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/kn.svg b/apps/web/public/flags/kn.svg deleted file mode 100644 index aea5e413..00000000 --- a/apps/web/public/flags/kn.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/kp.svg b/apps/web/public/flags/kp.svg deleted file mode 100644 index 13c2f630..00000000 --- a/apps/web/public/flags/kp.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/kr.svg b/apps/web/public/flags/kr.svg deleted file mode 100644 index 2b215d49..00000000 --- a/apps/web/public/flags/kr.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/kw.svg b/apps/web/public/flags/kw.svg deleted file mode 100644 index a77b1579..00000000 --- a/apps/web/public/flags/kw.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ky.svg b/apps/web/public/flags/ky.svg deleted file mode 100644 index 7817710f..00000000 --- a/apps/web/public/flags/ky.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/kz.svg b/apps/web/public/flags/kz.svg deleted file mode 100644 index 536fb9ff..00000000 --- a/apps/web/public/flags/kz.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/la.svg b/apps/web/public/flags/la.svg deleted file mode 100644 index 788f096f..00000000 --- a/apps/web/public/flags/la.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/web/public/flags/lb.svg b/apps/web/public/flags/lb.svg deleted file mode 100644 index 95359250..00000000 --- a/apps/web/public/flags/lb.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/lc.svg b/apps/web/public/flags/lc.svg deleted file mode 100644 index b4de5425..00000000 --- a/apps/web/public/flags/lc.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/li.svg b/apps/web/public/flags/li.svg deleted file mode 100644 index 50afac07..00000000 --- a/apps/web/public/flags/li.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/lk.svg b/apps/web/public/flags/lk.svg deleted file mode 100644 index 3f9b597d..00000000 --- a/apps/web/public/flags/lk.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/lr.svg b/apps/web/public/flags/lr.svg deleted file mode 100644 index a2f6a661..00000000 --- a/apps/web/public/flags/lr.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ls.svg b/apps/web/public/flags/ls.svg deleted file mode 100644 index d90a8c49..00000000 --- a/apps/web/public/flags/ls.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/lt.svg b/apps/web/public/flags/lt.svg deleted file mode 100644 index e42ba503..00000000 --- a/apps/web/public/flags/lt.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/lu.svg b/apps/web/public/flags/lu.svg deleted file mode 100644 index 62cbef97..00000000 --- a/apps/web/public/flags/lu.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/lv.svg b/apps/web/public/flags/lv.svg deleted file mode 100644 index fdcc9cac..00000000 --- a/apps/web/public/flags/lv.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/ly.svg b/apps/web/public/flags/ly.svg deleted file mode 100644 index e90bb0c0..00000000 --- a/apps/web/public/flags/ly.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ma.svg b/apps/web/public/flags/ma.svg deleted file mode 100644 index d390ee6c..00000000 --- a/apps/web/public/flags/ma.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/mc.svg b/apps/web/public/flags/mc.svg deleted file mode 100644 index 2cfc89a1..00000000 --- a/apps/web/public/flags/mc.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/md.svg b/apps/web/public/flags/md.svg deleted file mode 100644 index 12356e93..00000000 --- a/apps/web/public/flags/md.svg +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/me.svg b/apps/web/public/flags/me.svg deleted file mode 100644 index 3a8853ed..00000000 --- a/apps/web/public/flags/me.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/mf.svg b/apps/web/public/flags/mf.svg deleted file mode 100644 index a06c440f..00000000 --- a/apps/web/public/flags/mf.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/mg.svg b/apps/web/public/flags/mg.svg deleted file mode 100644 index a22961c4..00000000 --- a/apps/web/public/flags/mg.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/mh.svg b/apps/web/public/flags/mh.svg deleted file mode 100644 index a451e491..00000000 --- a/apps/web/public/flags/mh.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/mk.svg b/apps/web/public/flags/mk.svg deleted file mode 100644 index 9e102bd0..00000000 --- a/apps/web/public/flags/mk.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/ml.svg b/apps/web/public/flags/ml.svg deleted file mode 100644 index 91cf9fa4..00000000 --- a/apps/web/public/flags/ml.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/mm.svg b/apps/web/public/flags/mm.svg deleted file mode 100644 index 6c307abf..00000000 --- a/apps/web/public/flags/mm.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/web/public/flags/mn.svg b/apps/web/public/flags/mn.svg deleted file mode 100644 index 3425a98f..00000000 --- a/apps/web/public/flags/mn.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/mo.svg b/apps/web/public/flags/mo.svg deleted file mode 100644 index 5e39a7f3..00000000 --- a/apps/web/public/flags/mo.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/mp.svg b/apps/web/public/flags/mp.svg deleted file mode 100644 index c3063628..00000000 --- a/apps/web/public/flags/mp.svg +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/mq.svg b/apps/web/public/flags/mq.svg deleted file mode 100644 index 43ce9df6..00000000 --- a/apps/web/public/flags/mq.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/mr.svg b/apps/web/public/flags/mr.svg deleted file mode 100644 index 0c55e5d2..00000000 --- a/apps/web/public/flags/mr.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/ms.svg b/apps/web/public/flags/ms.svg deleted file mode 100644 index 1ea744ea..00000000 --- a/apps/web/public/flags/ms.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/mt.svg b/apps/web/public/flags/mt.svg deleted file mode 100644 index 145e0d04..00000000 --- a/apps/web/public/flags/mt.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/mu.svg b/apps/web/public/flags/mu.svg deleted file mode 100644 index 359f3555..00000000 --- a/apps/web/public/flags/mu.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/mv.svg b/apps/web/public/flags/mv.svg deleted file mode 100644 index 46e636ee..00000000 --- a/apps/web/public/flags/mv.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/mw.svg b/apps/web/public/flags/mw.svg deleted file mode 100644 index fa3d3caa..00000000 --- a/apps/web/public/flags/mw.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/apps/web/public/flags/mx.svg b/apps/web/public/flags/mx.svg deleted file mode 100644 index 3af0a023..00000000 --- a/apps/web/public/flags/mx.svg +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/my.svg b/apps/web/public/flags/my.svg deleted file mode 100644 index df2ec3bc..00000000 --- a/apps/web/public/flags/my.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/mz.svg b/apps/web/public/flags/mz.svg deleted file mode 100644 index 768e348f..00000000 --- a/apps/web/public/flags/mz.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/na.svg b/apps/web/public/flags/na.svg deleted file mode 100644 index 01580344..00000000 --- a/apps/web/public/flags/na.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/nc.svg b/apps/web/public/flags/nc.svg deleted file mode 100644 index 44d41716..00000000 --- a/apps/web/public/flags/nc.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ne.svg b/apps/web/public/flags/ne.svg deleted file mode 100644 index 456ff2d2..00000000 --- a/apps/web/public/flags/ne.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/nf.svg b/apps/web/public/flags/nf.svg deleted file mode 100644 index 95c4ee1d..00000000 --- a/apps/web/public/flags/nf.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/ng.svg b/apps/web/public/flags/ng.svg deleted file mode 100644 index bf166c42..00000000 --- a/apps/web/public/flags/ng.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/ni.svg b/apps/web/public/flags/ni.svg deleted file mode 100644 index 45416d45..00000000 --- a/apps/web/public/flags/ni.svg +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/nl.svg b/apps/web/public/flags/nl.svg deleted file mode 100644 index 70e0c160..00000000 --- a/apps/web/public/flags/nl.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/no.svg b/apps/web/public/flags/no.svg deleted file mode 100644 index c57515f7..00000000 --- a/apps/web/public/flags/no.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/np.svg b/apps/web/public/flags/np.svg deleted file mode 100644 index c2b1b113..00000000 --- a/apps/web/public/flags/np.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/nr.svg b/apps/web/public/flags/nr.svg deleted file mode 100644 index 9a64f7aa..00000000 --- a/apps/web/public/flags/nr.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/apps/web/public/flags/nu.svg b/apps/web/public/flags/nu.svg deleted file mode 100644 index f59d1d95..00000000 --- a/apps/web/public/flags/nu.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/apps/web/public/flags/nz.svg b/apps/web/public/flags/nz.svg deleted file mode 100644 index 8aa7ab8b..00000000 --- a/apps/web/public/flags/nz.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/om.svg b/apps/web/public/flags/om.svg deleted file mode 100644 index eb87ba1a..00000000 --- a/apps/web/public/flags/om.svg +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/pa.svg b/apps/web/public/flags/pa.svg deleted file mode 100644 index ffbb9256..00000000 --- a/apps/web/public/flags/pa.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/pc.svg b/apps/web/public/flags/pc.svg deleted file mode 100644 index 039e8ccd..00000000 --- a/apps/web/public/flags/pc.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/pe.svg b/apps/web/public/flags/pe.svg deleted file mode 100644 index 0b6dc998..00000000 --- a/apps/web/public/flags/pe.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/pf.svg b/apps/web/public/flags/pf.svg deleted file mode 100644 index 1a86e062..00000000 --- a/apps/web/public/flags/pf.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/pg.svg b/apps/web/public/flags/pg.svg deleted file mode 100644 index 507d32ff..00000000 --- a/apps/web/public/flags/pg.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/ph.svg b/apps/web/public/flags/ph.svg deleted file mode 100644 index 13b8a048..00000000 --- a/apps/web/public/flags/ph.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/pk.svg b/apps/web/public/flags/pk.svg deleted file mode 100644 index 48c4f16c..00000000 --- a/apps/web/public/flags/pk.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/pl.svg b/apps/web/public/flags/pl.svg deleted file mode 100644 index 560fe336..00000000 --- a/apps/web/public/flags/pl.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/pm.svg b/apps/web/public/flags/pm.svg deleted file mode 100644 index d12838d8..00000000 --- a/apps/web/public/flags/pm.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/pn.svg b/apps/web/public/flags/pn.svg deleted file mode 100644 index abd81550..00000000 --- a/apps/web/public/flags/pn.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/pr.svg b/apps/web/public/flags/pr.svg deleted file mode 100644 index 57b554c4..00000000 --- a/apps/web/public/flags/pr.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ps.svg b/apps/web/public/flags/ps.svg deleted file mode 100644 index adc546c4..00000000 --- a/apps/web/public/flags/ps.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/pt.svg b/apps/web/public/flags/pt.svg deleted file mode 100644 index 1df10418..00000000 --- a/apps/web/public/flags/pt.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/pw.svg b/apps/web/public/flags/pw.svg deleted file mode 100644 index ea1fafc5..00000000 --- a/apps/web/public/flags/pw.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/web/public/flags/py.svg b/apps/web/public/flags/py.svg deleted file mode 100644 index 17aef52d..00000000 --- a/apps/web/public/flags/py.svg +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/qa.svg b/apps/web/public/flags/qa.svg deleted file mode 100644 index 3efa0dc4..00000000 --- a/apps/web/public/flags/qa.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/re.svg b/apps/web/public/flags/re.svg deleted file mode 100644 index fd514f22..00000000 --- a/apps/web/public/flags/re.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/ro.svg b/apps/web/public/flags/ro.svg deleted file mode 100644 index a33731a1..00000000 --- a/apps/web/public/flags/ro.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/rs.svg b/apps/web/public/flags/rs.svg deleted file mode 100644 index 8f8b830e..00000000 --- a/apps/web/public/flags/rs.svg +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ru.svg b/apps/web/public/flags/ru.svg deleted file mode 100644 index 46758444..00000000 --- a/apps/web/public/flags/ru.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/rw.svg b/apps/web/public/flags/rw.svg deleted file mode 100644 index b54e64a1..00000000 --- a/apps/web/public/flags/rw.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sa.svg b/apps/web/public/flags/sa.svg deleted file mode 100644 index c84e29c1..00000000 --- a/apps/web/public/flags/sa.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sb.svg b/apps/web/public/flags/sb.svg deleted file mode 100644 index c74e6ad2..00000000 --- a/apps/web/public/flags/sb.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sc.svg b/apps/web/public/flags/sc.svg deleted file mode 100644 index 245e0478..00000000 --- a/apps/web/public/flags/sc.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/sd.svg b/apps/web/public/flags/sd.svg deleted file mode 100644 index 5805b799..00000000 --- a/apps/web/public/flags/sd.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/se.svg b/apps/web/public/flags/se.svg deleted file mode 100644 index d527fec4..00000000 --- a/apps/web/public/flags/se.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/sg.svg b/apps/web/public/flags/sg.svg deleted file mode 100644 index 489a4a04..00000000 --- a/apps/web/public/flags/sg.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sh-ac.svg b/apps/web/public/flags/sh-ac.svg deleted file mode 100644 index 6713c99d..00000000 --- a/apps/web/public/flags/sh-ac.svg +++ /dev/null @@ -1,689 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sh-hl.svg b/apps/web/public/flags/sh-hl.svg deleted file mode 100644 index 289a2da3..00000000 --- a/apps/web/public/flags/sh-hl.svg +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sh-ta.svg b/apps/web/public/flags/sh-ta.svg deleted file mode 100644 index e4f9f0b3..00000000 --- a/apps/web/public/flags/sh-ta.svg +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sh.svg b/apps/web/public/flags/sh.svg deleted file mode 100644 index 9912b237..00000000 --- a/apps/web/public/flags/sh.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/si.svg b/apps/web/public/flags/si.svg deleted file mode 100644 index c9a59f61..00000000 --- a/apps/web/public/flags/si.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sj.svg b/apps/web/public/flags/sj.svg deleted file mode 100644 index 5caa2802..00000000 --- a/apps/web/public/flags/sj.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/sk.svg b/apps/web/public/flags/sk.svg deleted file mode 100644 index 8c0b5e3f..00000000 --- a/apps/web/public/flags/sk.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/sl.svg b/apps/web/public/flags/sl.svg deleted file mode 100644 index 2869a585..00000000 --- a/apps/web/public/flags/sl.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/sm.svg b/apps/web/public/flags/sm.svg deleted file mode 100644 index b055ce72..00000000 --- a/apps/web/public/flags/sm.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sn.svg b/apps/web/public/flags/sn.svg deleted file mode 100644 index f27a8690..00000000 --- a/apps/web/public/flags/sn.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/so.svg b/apps/web/public/flags/so.svg deleted file mode 100644 index 86877ffd..00000000 --- a/apps/web/public/flags/so.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/web/public/flags/sr.svg b/apps/web/public/flags/sr.svg deleted file mode 100644 index c1e71b5d..00000000 --- a/apps/web/public/flags/sr.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/ss.svg b/apps/web/public/flags/ss.svg deleted file mode 100644 index 16dcbb9a..00000000 --- a/apps/web/public/flags/ss.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/st.svg b/apps/web/public/flags/st.svg deleted file mode 100644 index 29a8e375..00000000 --- a/apps/web/public/flags/st.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sv.svg b/apps/web/public/flags/sv.svg deleted file mode 100644 index c4b63fe2..00000000 --- a/apps/web/public/flags/sv.svg +++ /dev/null @@ -1,593 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sx.svg b/apps/web/public/flags/sx.svg deleted file mode 100644 index d37cd8e6..00000000 --- a/apps/web/public/flags/sx.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/sy.svg b/apps/web/public/flags/sy.svg deleted file mode 100644 index 1896a9cd..00000000 --- a/apps/web/public/flags/sy.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/sz.svg b/apps/web/public/flags/sz.svg deleted file mode 100644 index 05c14040..00000000 --- a/apps/web/public/flags/sz.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/tc.svg b/apps/web/public/flags/tc.svg deleted file mode 100644 index cb453fd1..00000000 --- a/apps/web/public/flags/tc.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/td.svg b/apps/web/public/flags/td.svg deleted file mode 100644 index 605217ee..00000000 --- a/apps/web/public/flags/td.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/tf.svg b/apps/web/public/flags/tf.svg deleted file mode 100644 index 735c059c..00000000 --- a/apps/web/public/flags/tf.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/tg.svg b/apps/web/public/flags/tg.svg deleted file mode 100644 index dbc01750..00000000 --- a/apps/web/public/flags/tg.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/th.svg b/apps/web/public/flags/th.svg deleted file mode 100644 index c4404d2d..00000000 --- a/apps/web/public/flags/th.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/tj.svg b/apps/web/public/flags/tj.svg deleted file mode 100644 index d8b6ad90..00000000 --- a/apps/web/public/flags/tj.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/tk.svg b/apps/web/public/flags/tk.svg deleted file mode 100644 index 568d4a8f..00000000 --- a/apps/web/public/flags/tk.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/tl.svg b/apps/web/public/flags/tl.svg deleted file mode 100644 index 2052311a..00000000 --- a/apps/web/public/flags/tl.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/tm.svg b/apps/web/public/flags/tm.svg deleted file mode 100644 index 2b96db0f..00000000 --- a/apps/web/public/flags/tm.svg +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/tn.svg b/apps/web/public/flags/tn.svg deleted file mode 100644 index 31c61a95..00000000 --- a/apps/web/public/flags/tn.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/to.svg b/apps/web/public/flags/to.svg deleted file mode 100644 index ad429dc4..00000000 --- a/apps/web/public/flags/to.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/apps/web/public/flags/tr.svg b/apps/web/public/flags/tr.svg deleted file mode 100644 index 1d9e8526..00000000 --- a/apps/web/public/flags/tr.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/tt.svg b/apps/web/public/flags/tt.svg deleted file mode 100644 index cbb0339f..00000000 --- a/apps/web/public/flags/tt.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/tv.svg b/apps/web/public/flags/tv.svg deleted file mode 100644 index eaa1e527..00000000 --- a/apps/web/public/flags/tv.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/tw.svg b/apps/web/public/flags/tw.svg deleted file mode 100644 index 4cf6bd8a..00000000 --- a/apps/web/public/flags/tw.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/tz.svg b/apps/web/public/flags/tz.svg deleted file mode 100644 index ea2c233c..00000000 --- a/apps/web/public/flags/tz.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/apps/web/public/flags/ua.svg b/apps/web/public/flags/ua.svg deleted file mode 100644 index 4ce79e78..00000000 --- a/apps/web/public/flags/ua.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/flags/ug.svg b/apps/web/public/flags/ug.svg deleted file mode 100644 index 5630cc7c..00000000 --- a/apps/web/public/flags/ug.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/um.svg b/apps/web/public/flags/um.svg deleted file mode 100644 index 01236d11..00000000 --- a/apps/web/public/flags/um.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/un.svg b/apps/web/public/flags/un.svg deleted file mode 100644 index 638cb022..00000000 --- a/apps/web/public/flags/un.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/us.svg b/apps/web/public/flags/us.svg deleted file mode 100644 index 47f54aa5..00000000 --- a/apps/web/public/flags/us.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/web/public/flags/uy.svg b/apps/web/public/flags/uy.svg deleted file mode 100644 index 4f484bcf..00000000 --- a/apps/web/public/flags/uy.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/uz.svg b/apps/web/public/flags/uz.svg deleted file mode 100644 index a8d53bff..00000000 --- a/apps/web/public/flags/uz.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/va.svg b/apps/web/public/flags/va.svg deleted file mode 100644 index 7eaf5d3f..00000000 --- a/apps/web/public/flags/va.svg +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/vc.svg b/apps/web/public/flags/vc.svg deleted file mode 100644 index e6091b9d..00000000 --- a/apps/web/public/flags/vc.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/web/public/flags/ve.svg b/apps/web/public/flags/ve.svg deleted file mode 100644 index 81d317b8..00000000 --- a/apps/web/public/flags/ve.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/vg.svg b/apps/web/public/flags/vg.svg deleted file mode 100644 index 4e89e5cf..00000000 --- a/apps/web/public/flags/vg.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/vi.svg b/apps/web/public/flags/vi.svg deleted file mode 100644 index a8ed7553..00000000 --- a/apps/web/public/flags/vi.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/vn.svg b/apps/web/public/flags/vn.svg deleted file mode 100644 index 0450271b..00000000 --- a/apps/web/public/flags/vn.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/web/public/flags/vu.svg b/apps/web/public/flags/vu.svg deleted file mode 100644 index da7bbc13..00000000 --- a/apps/web/public/flags/vu.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/wf.svg b/apps/web/public/flags/wf.svg deleted file mode 100644 index ca0ade00..00000000 --- a/apps/web/public/flags/wf.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/ws.svg b/apps/web/public/flags/ws.svg deleted file mode 100644 index 8655cdc2..00000000 --- a/apps/web/public/flags/ws.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/xk.svg b/apps/web/public/flags/xk.svg deleted file mode 100644 index d5b5ba7d..00000000 --- a/apps/web/public/flags/xk.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/xx.svg b/apps/web/public/flags/xx.svg deleted file mode 100644 index 0baee780..00000000 --- a/apps/web/public/flags/xx.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/flags/ye.svg b/apps/web/public/flags/ye.svg deleted file mode 100644 index 83886232..00000000 --- a/apps/web/public/flags/ye.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/web/public/flags/yt.svg b/apps/web/public/flags/yt.svg deleted file mode 100644 index 75b580ea..00000000 --- a/apps/web/public/flags/yt.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/web/public/flags/za.svg b/apps/web/public/flags/za.svg deleted file mode 100644 index 6aeb743e..00000000 --- a/apps/web/public/flags/za.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/zm.svg b/apps/web/public/flags/zm.svg deleted file mode 100644 index f7f72c72..00000000 --- a/apps/web/public/flags/zm.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/flags/zw.svg b/apps/web/public/flags/zw.svg deleted file mode 100644 index 0d481a94..00000000 --- a/apps/web/public/flags/zw.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/web/public/fonts/font-atlas.json b/apps/web/public/fonts/font-atlas.json deleted file mode 100644 index a5c2b7f6..00000000 --- a/apps/web/public/fonts/font-atlas.json +++ /dev/null @@ -1,11348 +0,0 @@ -{ - "fonts": { - "42dot Sans": { - "x": 0, - "y": 0, - "w": 131, - "ch": 0, - "s": ["300", "400", "500", "600", "700", "800"] - }, - "ABeeZee": { "x": 145, "y": 0, "w": 106, "ch": 0, "s": ["400", "400i"] }, - "Abel": { "x": 265, "y": 0, "w": 47, "ch": 0, "s": ["400"] }, - "Abhaya Libre": { - "x": 326, - "y": 0, - "w": 139, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Aboreto": { "x": 479, "y": 0, "w": 124, "ch": 0, "s": ["400"] }, - "Abril Fatface": { "x": 617, "y": 0, "w": 152, "ch": 0, "s": ["400"] }, - "Abyssinica SIL": { "x": 783, "y": 0, "w": 165, "ch": 0, "s": ["400"] }, - "Aclonica": { "x": 962, "y": 0, "w": 122, "ch": 0, "s": ["400"] }, - "Acme": { "x": 1098, "y": 0, "w": 63, "ch": 0, "s": ["400"] }, - "Actor": { "x": 0, "y": 40, "w": 64, "ch": 0, "s": ["400"] }, - "Adamina": { "x": 78, "y": 40, "w": 113, "ch": 0, "s": ["400"] }, - "ADLaM Display": { "x": 205, "y": 40, "w": 183, "ch": 0, "s": ["400"] }, - "Advent Pro": { - "x": 402, - "y": 40, - "w": 107, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Afacad": { - "x": 523, - "y": 40, - "w": 77, - "ch": 0, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Afacad Flux": { - "x": 614, - "y": 40, - "w": 118, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Agbalumo": { "x": 746, "y": 40, "w": 119, "ch": 0, "s": ["400"] }, - "Agdasima": { "x": 879, "y": 40, "w": 81, "ch": 0, "s": ["400", "700"] }, - "Agu Display": { "x": 974, "y": 40, "w": 140, "ch": 0, "s": ["400"] }, - "Aguafina Script": { "x": 0, "y": 80, "w": 120, "ch": 0, "s": ["400"] }, - "Akatab": { - "x": 134, - "y": 80, - "w": 81, - "ch": 0, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Akaya Kanadaka": { "x": 229, "y": 80, "w": 176, "ch": 0, "s": ["400"] }, - "Akaya Telivigala": { "x": 419, "y": 80, "w": 165, "ch": 0, "s": ["400"] }, - "Akronim": { "x": 598, "y": 80, "w": 79, "ch": 0, "s": ["400"] }, - "Akshar": { - "x": 691, - "y": 80, - "w": 71, - "ch": 0, - "s": ["300", "400", "500", "600", "700"] - }, - "Aladin": { "x": 776, "y": 80, "w": 61, "ch": 0, "s": ["400"] }, - "Alan Sans": { - "x": 851, - "y": 80, - "w": 116, - "ch": 0, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Alata": { "x": 981, "y": 80, "w": 68, "ch": 0, "s": ["400"] }, - "Alatsi": { "x": 1063, "y": 80, "w": 66, "ch": 0, "s": ["400"] }, - "Albert Sans": { - "x": 0, - "y": 120, - "w": 133, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Aldrich": { "x": 147, "y": 120, "w": 94, "ch": 0, "s": ["400"] }, - "Alef": { "x": 255, "y": 120, "w": 54, "ch": 0, "s": ["400", "700"] }, - "Alegreya": { - "x": 323, - "y": 120, - "w": 92, - "ch": 0, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Alegreya Sans": { - "x": 429, - "y": 120, - "w": 137, - "ch": 0, - "s": [ - "100", - "100i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Alegreya Sans SC": { - "x": 580, - "y": 120, - "w": 179, - "ch": 0, - "s": [ - "100", - "100i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Alegreya SC": { - "x": 773, - "y": 120, - "w": 137, - "ch": 0, - "s": [ - "400", - "400i", - "500", - "500i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Aleo": { - "x": 924, - "y": 120, - "w": 59, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Alex Brush": { "x": 997, "y": 120, "w": 117, "ch": 0, "s": ["400"] }, - "Alexandria": { - "x": 0, - "y": 160, - "w": 136, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Alfa Slab One": { "x": 150, "y": 160, "w": 180, "ch": 0, "s": ["400"] }, - "Alice": { "x": 344, "y": 160, "w": 60, "ch": 0, "s": ["400"] }, - "Alike": { "x": 418, "y": 160, "w": 62, "ch": 0, "s": ["400"] }, - "Alike Angular": { "x": 494, "y": 160, "w": 155, "ch": 0, "s": ["400"] }, - "Alkalami": { "x": 663, "y": 160, "w": 109, "ch": 0, "s": ["400"] }, - "Alkatra": { - "x": 786, - "y": 160, - "w": 84, - "ch": 0, - "s": ["400", "500", "600", "700"] - }, - "Allan": { "x": 884, "y": 160, "w": 48, "ch": 0, "s": ["400", "700"] }, - "Allerta": { "x": 946, "y": 160, "w": 93, "ch": 0, "s": ["400"] }, - "Allerta Stencil": { "x": 0, "y": 200, "w": 182, "ch": 0, "s": ["400"] }, - "Allison": { "x": 196, "y": 200, "w": 56, "ch": 0, "s": ["400"] }, - "Allura": { "x": 266, "y": 200, "w": 69, "ch": 0, "s": ["400"] }, - "Almarai": { - "x": 349, - "y": 200, - "w": 88, - "ch": 0, - "s": ["300", "400", "700", "800"] - }, - "Almendra": { - "x": 451, - "y": 200, - "w": 107, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Almendra Display": { "x": 572, "y": 200, "w": 192, "ch": 0, "s": ["400"] }, - "Almendra SC": { "x": 778, "y": 200, "w": 142, "ch": 0, "s": ["400"] }, - "Alumni Sans": { - "x": 934, - "y": 200, - "w": 96, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Alumni Sans Collegiate One": { - "x": 0, - "y": 240, - "w": 201, - "ch": 0, - "s": ["400", "400i"] - }, - "Alumni Sans Inline One": { - "x": 215, - "y": 240, - "w": 180, - "ch": 0, - "s": ["400", "400i"] - }, - "Alumni Sans Pinstripe": { - "x": 409, - "y": 240, - "w": 159, - "ch": 0, - "s": ["400", "400i"] - }, - "Alumni Sans SC": { - "x": 582, - "y": 240, - "w": 125, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Amarante": { "x": 721, "y": 240, "w": 108, "ch": 0, "s": ["400"] }, - "Amaranth": { - "x": 843, - "y": 240, - "w": 110, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Amarna": { - "x": 967, - "y": 240, - "w": 92, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Amatic SC": { "x": 1073, "y": 240, "w": 77, "ch": 0, "s": ["400", "700"] }, - "Amethysta": { "x": 0, "y": 280, "w": 133, "ch": 0, "s": ["400"] }, - "Amiko": { - "x": 147, - "y": 280, - "w": 84, - "ch": 0, - "s": ["400", "600", "700"] - }, - "Amiri": { - "x": 245, - "y": 280, - "w": 63, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Amiri Quran": { "x": 322, "y": 280, "w": 131, "ch": 0, "s": ["400"] }, - "Amita": { "x": 467, "y": 280, "w": 73, "ch": 0, "s": ["400", "700"] }, - "Anaheim": { - "x": 554, - "y": 280, - "w": 93, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Ancizar Sans": { - "x": 661, - "y": 280, - "w": 126, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Ancizar Serif": { - "x": 801, - "y": 280, - "w": 136, - "ch": 0, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Andada Pro": { - "x": 951, - "y": 280, - "w": 137, - "ch": 0, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Andika": { - "x": 1102, - "y": 280, - "w": 85, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Anek Bangla": { - "x": 0, - "y": 320, - "w": 131, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Devanagari": { - "x": 145, - "y": 320, - "w": 176, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Gujarati": { - "x": 335, - "y": 320, - "w": 143, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Gurmukhi": { - "x": 492, - "y": 320, - "w": 164, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Kannada": { - "x": 670, - "y": 320, - "w": 152, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Latin": { - "x": 836, - "y": 320, - "w": 115, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Malayalam": { - "x": 965, - "y": 320, - "w": 171, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Odia": { - "x": 0, - "y": 360, - "w": 108, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Tamil": { - "x": 122, - "y": 360, - "w": 119, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Anek Telugu": { - "x": 255, - "y": 360, - "w": 131, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Angkor": { "x": 400, "y": 360, "w": 111, "ch": 0, "s": ["400"] }, - "Annapurna SIL": { - "x": 525, - "y": 360, - "w": 151, - "ch": 0, - "s": ["400", "700"] - }, - "Annie Use Your Telescope": { - "x": 690, - "y": 360, - "w": 215, - "ch": 0, - "s": ["400"] - }, - "Anonymous Pro": { - "x": 919, - "y": 360, - "w": 179, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Anta": { "x": 1112, "y": 360, "w": 62, "ch": 0, "s": ["400"] }, - "Antic": { "x": 0, "y": 400, "w": 60, "ch": 0, "s": ["400"] }, - "Antic Didone": { "x": 74, "y": 400, "w": 145, "ch": 0, "s": ["400"] }, - "Antic Slab": { "x": 233, "y": 400, "w": 114, "ch": 0, "s": ["400"] }, - "Anton": { "x": 361, "y": 400, "w": 63, "ch": 0, "s": ["400"] }, - "Anton SC": { "x": 438, "y": 400, "w": 93, "ch": 0, "s": ["400"] }, - "Antonio": { - "x": 545, - "y": 400, - "w": 76, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Anuphan": { - "x": 635, - "y": 400, - "w": 105, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Anybody": { - "x": 754, - "y": 400, - "w": 107, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Aoboshi One": { "x": 875, "y": 400, "w": 158, "ch": 0, "s": ["400"] }, - "AR One Sans": { - "x": 1047, - "y": 400, - "w": 152, - "ch": 0, - "s": ["400", "500", "600", "700"] - }, - "Arapey": { "x": 0, "y": 440, "w": 75, "ch": 0, "s": ["400", "400i"] }, - "Arbutus": { "x": 89, "y": 440, "w": 128, "ch": 0, "s": ["400"] }, - "Arbutus Slab": { "x": 231, "y": 440, "w": 159, "ch": 0, "s": ["400"] }, - "Architects Daughter": { - "x": 404, - "y": 440, - "w": 237, - "ch": 0, - "s": ["400"] - }, - "Archivo": { - "x": 655, - "y": 440, - "w": 90, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Archivo Black": { "x": 759, "y": 440, "w": 190, "ch": 0, "s": ["400"] }, - "Archivo Narrow": { - "x": 963, - "y": 440, - "w": 144, - "ch": 0, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Are You Serious": { "x": 0, "y": 480, "w": 142, "ch": 0, "s": ["400"] }, - "Aref Ruqaa": { - "x": 156, - "y": 480, - "w": 130, - "ch": 0, - "s": ["400", "700"] - }, - "Aref Ruqaa Ink": { - "x": 300, - "y": 480, - "w": 172, - "ch": 0, - "s": ["400", "700"] - }, - "Arima": { - "x": 486, - "y": 480, - "w": 73, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Arima Madurai": { - "x": 573, - "y": 480, - "w": 170, - "ch": 0, - "s": ["100", "200", "300", "400", "500", "700", "800", "900"] - }, - "Arimo": { - "x": 757, - "y": 480, - "w": 71, - "ch": 0, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Arizonia": { "x": 842, "y": 480, "w": 95, "ch": 0, "s": ["400"] }, - "Armata": { "x": 951, "y": 480, "w": 100, "ch": 0, "s": ["400"] }, - "Arsenal": { - "x": 1065, - "y": 480, - "w": 80, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Arsenal SC": { - "x": 0, - "y": 520, - "w": 118, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Artifika": { "x": 132, "y": 520, "w": 105, "ch": 0, "s": ["400"] }, - "Arvo": { - "x": 251, - "y": 520, - "w": 65, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Arya": { "x": 330, "y": 520, "w": 53, "ch": 0, "s": ["400", "700"] }, - "Asap": { - "x": 397, - "y": 520, - "w": 60, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Asap Condensed": { - "x": 471, - "y": 520, - "w": 153, - "ch": 0, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Asar": { "x": 638, "y": 520, "w": 53, "ch": 0, "s": ["400"] }, - "Asimovian": { "x": 705, "y": 520, "w": 117, "ch": 0, "s": ["400"] }, - "Asset": { "x": 836, "y": 520, "w": 154, "ch": 0, "s": ["400"] }, - "Assistant": { - "x": 1004, - "y": 520, - "w": 98, - "ch": 0, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Asta Sans": { - "x": 0, - "y": 560, - "w": 115, - "ch": 0, - "s": ["300", "400", "500", "600", "700", "800"] - }, - "Astloch": { "x": 129, "y": 560, "w": 72, "ch": 0, "s": ["400", "700"] }, - "Asul": { "x": 215, "y": 560, "w": 54, "ch": 0, "s": ["400", "700"] }, - "Athiti": { - "x": 283, - "y": 560, - "w": 62, - "ch": 0, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Atkinson Hyperlegible": { - "x": 359, - "y": 560, - "w": 239, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Atkinson Hyperlegible Mono": { - "x": 612, - "y": 560, - "w": 403, - "ch": 0, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Atkinson Hyperlegible Next": { - "x": 0, - "y": 600, - "w": 296, - "ch": 0, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Atma": { - "x": 310, - "y": 600, - "w": 59, - "ch": 0, - "s": ["300", "400", "500", "600", "700"] - }, - "Atomic Age": { "x": 383, "y": 600, "w": 144, "ch": 0, "s": ["400"] }, - "Aubrey": { "x": 541, "y": 600, "w": 67, "ch": 0, "s": ["400"] }, - "Audiowide": { "x": 622, "y": 600, "w": 145, "ch": 0, "s": ["400"] }, - "Autour One": { "x": 781, "y": 600, "w": 168, "ch": 0, "s": ["400"] }, - "Average": { "x": 963, "y": 600, "w": 88, "ch": 0, "s": ["400"] }, - "Average Sans": { "x": 0, "y": 640, "w": 138, "ch": 0, "s": ["400"] }, - "Averia Gruesa Libre": { - "x": 152, - "y": 640, - "w": 217, - "ch": 0, - "s": ["400"] - }, - "Averia Libre": { - "x": 383, - "y": 640, - "w": 138, - "ch": 0, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "Averia Sans Libre": { - "x": 535, - "y": 640, - "w": 190, - "ch": 0, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "Averia Serif Libre": { - "x": 739, - "y": 640, - "w": 202, - "ch": 0, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "Azeret Mono": { - "x": 955, - "y": 640, - "w": 180, - "ch": 0, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "B612": { - "x": 0, - "y": 680, - "w": 71, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "B612 Mono": { - "x": 85, - "y": 680, - "w": 149, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Babylonica": { "x": 248, "y": 680, "w": 90, "ch": 0, "s": ["400"] }, - "Bacasime Antique": { "x": 352, "y": 680, "w": 182, "ch": 0, "s": ["400"] }, - "Bad Script": { "x": 548, "y": 680, "w": 103, "ch": 0, "s": ["400"] }, - "Badeen Display": { "x": 665, "y": 680, "w": 194, "ch": 0, "s": ["400"] }, - "Bagel Fat One": { "x": 873, "y": 680, "w": 158, "ch": 0, "s": ["400"] }, - "Bahiana": { "x": 1045, "y": 680, "w": 58, "ch": 0, "s": ["400"] }, - "Bahianita": { "x": 1117, "y": 680, "w": 63, "ch": 0, "s": ["400"] }, - "Bai Jamjuree": { - "x": 0, - "y": 720, - "w": 152, - "ch": 0, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Bakbak One": { "x": 166, "y": 720, "w": 141, "ch": 0, "s": ["400"] }, - "Ballet": { "x": 321, "y": 720, "w": 65, "ch": 0, "s": ["400"] }, - "Baloo 2": { - "x": 400, - "y": 720, - "w": 84, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Bhai 2": { - "x": 498, - "y": 720, - "w": 134, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Bhaijaan 2": { - "x": 646, - "y": 720, - "w": 177, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Bhaina 2": { - "x": 837, - "y": 720, - "w": 160, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Chettan 2": { - "x": 1011, - "y": 720, - "w": 172, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Da 2": { - "x": 0, - "y": 760, - "w": 117, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Paaji 2": { - "x": 131, - "y": 760, - "w": 138, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Tamma 2": { - "x": 283, - "y": 760, - "w": 169, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Tammudu 2": { - "x": 466, - "y": 760, - "w": 191, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Baloo Thambi 2": { - "x": 671, - "y": 760, - "w": 165, - "ch": 0, - "s": ["400", "500", "600", "700", "800"] - }, - "Balsamiq Sans": { - "x": 850, - "y": 760, - "w": 168, - "ch": 0, - "s": ["400", "400i", "700", "700i"] - }, - "Balthazar": { "x": 1032, "y": 760, "w": 96, "ch": 0, "s": ["400"] }, - "Bangers": { "x": 0, "y": 0, "w": 81, "ch": 1, "s": ["400"] }, - "Barlow": { - "x": 95, - "y": 0, - "w": 80, - "ch": 1, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Barlow Condensed": { - "x": 189, - "y": 0, - "w": 158, - "ch": 1, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Barlow Semi Condensed": { - "x": 361, - "y": 0, - "w": 231, - "ch": 1, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Barriecito": { "x": 606, "y": 0, "w": 106, "ch": 1, "s": ["400"] }, - "Barrio": { "x": 726, "y": 0, "w": 80, "ch": 1, "s": ["400"] }, - "Basic": { "x": 820, "y": 0, "w": 61, "ch": 1, "s": ["400"] }, - "Baskervville": { - "x": 895, - "y": 0, - "w": 136, - "ch": 1, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Baskervville SC": { - "x": 0, - "y": 40, - "w": 187, - "ch": 1, - "s": ["400", "500", "600", "700"] - }, - "Battambang": { - "x": 201, - "y": 40, - "w": 147, - "ch": 1, - "s": ["100", "300", "400", "700", "900"] - }, - "Baumans": { "x": 362, "y": 40, "w": 101, "ch": 1, "s": ["400"] }, - "Bayon": { "x": 477, "y": 40, "w": 61, "ch": 1, "s": ["400"] }, - "BBH Bartle": { "x": 552, "y": 40, "w": 298, "ch": 1, "s": ["400"] }, - "BBH Bogle": { "x": 864, "y": 40, "w": 98, "ch": 1, "s": ["400"] }, - "BBH Hegarty": { "x": 976, "y": 40, "w": 182, "ch": 1, "s": ["400"] }, - "BBH Sans Bartle": { "x": 0, "y": 80, "w": 427, "ch": 1, "s": ["400"] }, - "BBH Sans Bogle": { "x": 441, "y": 80, "w": 142, "ch": 1, "s": ["400"] }, - "BBH Sans Hegarty": { "x": 597, "y": 80, "w": 254, "ch": 1, "s": ["400"] }, - "Be Vietnam Pro": { - "x": 865, - "y": 80, - "w": 188, - "ch": 1, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Beau Rivage": { "x": 1067, "y": 80, "w": 108, "ch": 1, "s": ["400"] }, - "Bebas Neue": { "x": 0, "y": 120, "w": 96, "ch": 1, "s": ["400"] }, - "Beiruti": { - "x": 110, - "y": 120, - "w": 66, - "ch": 1, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Belanosima": { - "x": 190, - "y": 120, - "w": 124, - "ch": 1, - "s": ["400", "600", "700"] - }, - "Belgrano": { "x": 328, "y": 120, "w": 115, "ch": 1, "s": ["400"] }, - "Bellefair": { "x": 457, "y": 120, "w": 81, "ch": 1, "s": ["400"] }, - "Belleza": { "x": 552, "y": 120, "w": 79, "ch": 1, "s": ["400"] }, - "Bellota": { - "x": 645, - "y": 120, - "w": 84, - "ch": 1, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "Bellota Text": { - "x": 743, - "y": 120, - "w": 129, - "ch": 1, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "BenchNine": { - "x": 886, - "y": 120, - "w": 82, - "ch": 1, - "s": ["300", "400", "700"] - }, - "Benne": { "x": 982, "y": 120, "w": 66, "ch": 1, "s": ["400"] }, - "Bentham": { "x": 1062, "y": 120, "w": 98, "ch": 1, "s": ["400"] }, - "Berkshire Swash": { "x": 0, "y": 160, "w": 178, "ch": 1, "s": ["400"] }, - "Besley": { - "x": 192, - "y": 160, - "w": 86, - "ch": 1, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Beth Ellen": { "x": 292, "y": 160, "w": 138, "ch": 1, "s": ["400"] }, - "Bevan": { "x": 444, "y": 160, "w": 94, "ch": 1, "s": ["400", "400i"] }, - "BhuTuka Expanded One": { - "x": 552, - "y": 160, - "w": 412, - "ch": 1, - "s": ["400"] - }, - "Big Shoulders": { - "x": 978, - "y": 160, - "w": 117, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Big Shoulders Display": { - "x": 0, - "y": 200, - "w": 158, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Big Shoulders Inline": { - "x": 172, - "y": 200, - "w": 167, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Big Shoulders Inline Display": { - "x": 353, - "y": 200, - "w": 203, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Big Shoulders Inline Text": { - "x": 570, - "y": 200, - "w": 201, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Big Shoulders Stencil": { - "x": 785, - "y": 200, - "w": 177, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Big Shoulders Stencil Display": { - "x": 976, - "y": 200, - "w": 211, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Big Shoulders Stencil Text": { - "x": 0, - "y": 240, - "w": 210, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Big Shoulders Text": { - "x": 224, - "y": 240, - "w": 150, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bigelow Rules": { "x": 388, "y": 240, "w": 86, "ch": 1, "s": ["400"] }, - "Bigshot One": { "x": 488, "y": 240, "w": 138, "ch": 1, "s": ["400"] }, - "Bilbo": { "x": 640, "y": 240, "w": 45, "ch": 1, "s": ["400"] }, - "Bilbo Swash Caps": { "x": 699, "y": 240, "w": 144, "ch": 1, "s": ["400"] }, - "BioRhyme": { - "x": 857, - "y": 240, - "w": 139, - "ch": 1, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "BioRhyme Expanded": { - "x": 0, - "y": 280, - "w": 455, - "ch": 1, - "s": ["200", "300", "400", "700", "800"] - }, - "Birthstone": { "x": 469, "y": 280, "w": 79, "ch": 1, "s": ["400"] }, - "Birthstone Bounce": { - "x": 562, - "y": 280, - "w": 167, - "ch": 1, - "s": ["400", "500"] - }, - "Biryani": { - "x": 743, - "y": 280, - "w": 90, - "ch": 1, - "s": ["200", "300", "400", "600", "700", "800", "900"] - }, - "Bitcount": { - "x": 847, - "y": 280, - "w": 124, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Grid Double": { - "x": 0, - "y": 320, - "w": 296, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Grid Double Ink": { - "x": 310, - "y": 320, - "w": 354, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Grid Single": { - "x": 678, - "y": 320, - "w": 296, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Grid Single Ink": { - "x": 0, - "y": 360, - "w": 354, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Ink": { - "x": 368, - "y": 360, - "w": 181, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Prop Double": { - "x": 563, - "y": 360, - "w": 265, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Prop Double Ink": { - "x": 842, - "y": 360, - "w": 308, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Prop Single": { - "x": 0, - "y": 400, - "w": 244, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Prop Single Ink": { - "x": 258, - "y": 400, - "w": 282, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Single": { - "x": 554, - "y": 400, - "w": 224, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitcount Single Ink": { - "x": 792, - "y": 400, - "w": 282, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bitter": { - "x": 1088, - "y": 400, - "w": 71, - "ch": 1, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "BIZ UDGothic": { - "x": 0, - "y": 440, - "w": 152, - "ch": 1, - "s": ["400", "700"] - }, - "BIZ UDMincho": { - "x": 166, - "y": 440, - "w": 152, - "ch": 1, - "s": ["400", "700"] - }, - "BIZ UDPGothic": { - "x": 332, - "y": 440, - "w": 209, - "ch": 1, - "s": ["400", "700"] - }, - "BIZ UDPMincho": { - "x": 555, - "y": 440, - "w": 208, - "ch": 1, - "s": ["400", "700"] - }, - "Black And White Picture": { - "x": 777, - "y": 440, - "w": 218, - "ch": 1, - "s": ["400"] - }, - "Black Han Sans": { "x": 0, "y": 480, "w": 212, "ch": 1, "s": ["400"] }, - "Black Ops One": { "x": 226, "y": 480, "w": 191, "ch": 1, "s": ["400"] }, - "Blaka": { "x": 431, "y": 480, "w": 57, "ch": 1, "s": ["400"] }, - "Blaka Hollow": { "x": 502, "y": 480, "w": 119, "ch": 1, "s": ["400"] }, - "Blaka Ink": { "x": 635, "y": 480, "w": 87, "ch": 1, "s": ["400"] }, - "Blinker": { - "x": 736, - "y": 480, - "w": 77, - "ch": 1, - "s": ["100", "200", "300", "400", "600", "700", "800", "900"] - }, - "Bodoni Moda": { - "x": 827, - "y": 480, - "w": 155, - "ch": 1, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Bodoni Moda SC": { - "x": 996, - "y": 480, - "w": 200, - "ch": 1, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Bokor": { "x": 0, "y": 520, "w": 58, "ch": 1, "s": ["400"] }, - "Boldonse": { "x": 72, "y": 520, "w": 147, "ch": 1, "s": ["400"] }, - "Bona Nova": { - "x": 233, - "y": 520, - "w": 124, - "ch": 1, - "s": ["400", "400i", "700", "700i"] - }, - "Bona Nova SC": { - "x": 371, - "y": 520, - "w": 170, - "ch": 1, - "s": ["400", "400i", "700", "700i"] - }, - "Bonbon": { "x": 555, "y": 520, "w": 104, "ch": 1, "s": ["400"] }, - "Bonheur Royale": { "x": 673, "y": 520, "w": 124, "ch": 1, "s": ["400"] }, - "Boogaloo": { "x": 811, "y": 520, "w": 81, "ch": 1, "s": ["400"] }, - "Borel": { "x": 906, "y": 520, "w": 69, "ch": 1, "s": ["400"] }, - "Bowlby One": { "x": 989, "y": 520, "w": 174, "ch": 1, "s": ["400"] }, - "Bowlby One SC": { "x": 0, "y": 560, "w": 213, "ch": 1, "s": ["400"] }, - "Braah One": { "x": 227, "y": 560, "w": 124, "ch": 1, "s": ["400"] }, - "Brawler": { "x": 365, "y": 560, "w": 95, "ch": 1, "s": ["400", "700"] }, - "Bree Serif": { "x": 474, "y": 560, "w": 113, "ch": 1, "s": ["400"] }, - "Bricolage Grotesque": { - "x": 601, - "y": 560, - "w": 238, - "ch": 1, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Briem Hand": { - "x": 853, - "y": 560, - "w": 146, - "ch": 1, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Bruno Ace": { "x": 1013, "y": 560, "w": 168, "ch": 1, "s": ["400"] }, - "Bruno Ace SC": { "x": 0, "y": 600, "w": 219, "ch": 1, "s": ["400"] }, - "Brygada 1918": { - "x": 233, - "y": 600, - "w": 157, - "ch": 1, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Bubblegum Sans": { "x": 404, "y": 600, "w": 155, "ch": 1, "s": ["400"] }, - "Bubbler One": { "x": 573, "y": 600, "w": 117, "ch": 1, "s": ["400"] }, - "Buenard": { - "x": 704, - "y": 600, - "w": 93, - "ch": 1, - "s": ["400", "500", "600", "700"] - }, - "Bungee": { "x": 811, "y": 600, "w": 110, "ch": 1, "s": ["400"] }, - "Bungee Hairline": { "x": 935, "y": 600, "w": 249, "ch": 1, "s": ["400"] }, - "Bungee Inline": { "x": 0, "y": 640, "w": 213, "ch": 1, "s": ["400"] }, - "Bungee Outline": { "x": 227, "y": 640, "w": 232, "ch": 1, "s": ["400"] }, - "Bungee Shade": { "x": 473, "y": 640, "w": 229, "ch": 1, "s": ["400"] }, - "Bungee Spice": { "x": 716, "y": 640, "w": 193, "ch": 1, "s": ["400"] }, - "Bungee Tint": { "x": 923, "y": 640, "w": 179, "ch": 1, "s": ["400"] }, - "Butcherman": { "x": 0, "y": 680, "w": 161, "ch": 1, "s": ["400"] }, - "Butterfly Kids": { "x": 175, "y": 680, "w": 116, "ch": 1, "s": ["400"] }, - "Bytesized": { "x": 305, "y": 680, "w": 116, "ch": 1, "s": ["400"] }, - "Cabin": { - "x": 435, - "y": 680, - "w": 67, - "ch": 1, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Cabin Condensed": { - "x": 516, - "y": 680, - "w": 163, - "ch": 1, - "s": ["400", "500", "600", "700"] - }, - "Cabin Sketch": { - "x": 693, - "y": 680, - "w": 141, - "ch": 1, - "s": ["400", "700"] - }, - "Cactus Classical Serif": { - "x": 848, - "y": 680, - "w": 235, - "ch": 1, - "s": ["400"] - }, - "Caesar Dressing": { "x": 0, "y": 720, "w": 164, "ch": 1, "s": ["400"] }, - "Cagliostro": { "x": 178, "y": 720, "w": 115, "ch": 1, "s": ["400"] }, - "Cairo": { - "x": 307, - "y": 720, - "w": 60, - "ch": 1, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Cairo Play": { - "x": 381, - "y": 720, - "w": 108, - "ch": 1, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Cal Sans": { "x": 503, "y": 720, "w": 99, "ch": 1, "s": ["400"] }, - "Caladea": { - "x": 616, - "y": 720, - "w": 84, - "ch": 1, - "s": ["400", "400i", "700", "700i"] - }, - "Calistoga": { "x": 714, "y": 720, "w": 109, "ch": 1, "s": ["400"] }, - "Calligraffitti": { "x": 837, "y": 720, "w": 124, "ch": 1, "s": ["400"] }, - "Cambay": { - "x": 975, - "y": 720, - "w": 92, - "ch": 1, - "s": ["400", "400i", "700", "700i"] - }, - "Cambo": { "x": 1081, "y": 720, "w": 82, "ch": 1, "s": ["400"] }, - "Candal": { "x": 0, "y": 760, "w": 102, "ch": 1, "s": ["400"] }, - "Cantarell": { - "x": 116, - "y": 760, - "w": 109, - "ch": 1, - "s": ["400", "400i", "700", "700i"] - }, - "Cantata One": { "x": 239, "y": 760, "w": 163, "ch": 1, "s": ["400"] }, - "Cantora One": { "x": 416, "y": 760, "w": 134, "ch": 1, "s": ["400"] }, - "Caprasimo": { "x": 564, "y": 760, "w": 139, "ch": 1, "s": ["400"] }, - "Capriola": { "x": 717, "y": 760, "w": 110, "ch": 1, "s": ["400"] }, - "Caramel": { "x": 841, "y": 760, "w": 66, "ch": 1, "s": ["400"] }, - "Carattere": { "x": 921, "y": 760, "w": 79, "ch": 1, "s": ["400"] }, - "Cardo": { - "x": 1014, - "y": 760, - "w": 72, - "ch": 1, - "s": ["400", "400i", "700", "700i"] - }, - "Carlito": { - "x": 1100, - "y": 760, - "w": 73, - "ch": 1, - "s": ["400", "400i", "700", "700i"] - }, - "Carme": { "x": 0, "y": 0, "w": 79, "ch": 2, "s": ["400"] }, - "Carrois Gothic": { "x": 93, "y": 0, "w": 155, "ch": 2, "s": ["400"] }, - "Carrois Gothic SC": { "x": 262, "y": 0, "w": 211, "ch": 2, "s": ["400"] }, - "Carter One": { "x": 487, "y": 0, "w": 136, "ch": 2, "s": ["400"] }, - "Cascadia Code": { - "x": 637, - "y": 0, - "w": 191, - "ch": 2, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Cascadia Mono": { - "x": 842, - "y": 0, - "w": 191, - "ch": 2, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Castoro": { "x": 1047, "y": 0, "w": 93, "ch": 2, "s": ["400", "400i"] }, - "Castoro Titling": { "x": 0, "y": 40, "w": 236, "ch": 2, "s": ["400"] }, - "Catamaran": { - "x": 250, - "y": 40, - "w": 116, - "ch": 2, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Caudex": { - "x": 380, - "y": 40, - "w": 92, - "ch": 2, - "s": ["400", "400i", "700", "700i"] - }, - "Cause": { - "x": 486, - "y": 40, - "w": 72, - "ch": 2, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Caveat": { - "x": 572, - "y": 40, - "w": 63, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Caveat Brush": { "x": 649, "y": 40, "w": 120, "ch": 2, "s": ["400"] }, - "Cedarville Cursive": { - "x": 783, - "y": 40, - "w": 203, - "ch": 2, - "s": ["400"] - }, - "Ceviche One": { "x": 1000, "y": 40, "w": 111, "ch": 2, "s": ["400"] }, - "Chakra Petch": { - "x": 0, - "y": 80, - "w": 154, - "ch": 2, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Changa": { - "x": 168, - "y": 80, - "w": 86, - "ch": 2, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Changa One": { - "x": 268, - "y": 80, - "w": 136, - "ch": 2, - "s": ["400", "400i"] - }, - "Chango": { "x": 418, "y": 80, "w": 128, "ch": 2, "s": ["400"] }, - "Charis SIL": { - "x": 560, - "y": 80, - "w": 116, - "ch": 2, - "s": ["400", "400i", "700", "700i"] - }, - "Charm": { "x": 690, "y": 80, "w": 69, "ch": 2, "s": ["400", "700"] }, - "Charmonman": { "x": 773, "y": 80, "w": 136, "ch": 2, "s": ["400", "700"] }, - "Chathura": { - "x": 923, - "y": 80, - "w": 55, - "ch": 2, - "s": ["100", "300", "400", "700", "800"] - }, - "Chau Philomene One": { - "x": 992, - "y": 80, - "w": 200, - "ch": 2, - "s": ["400", "400i"] - }, - "Chela One": { "x": 0, "y": 120, "w": 97, "ch": 2, "s": ["400"] }, - "Chelsea Market": { "x": 111, "y": 120, "w": 200, "ch": 2, "s": ["400"] }, - "Cherish": { "x": 325, "y": 120, "w": 60, "ch": 2, "s": ["400"] }, - "Cherry Bomb One": { "x": 399, "y": 120, "w": 200, "ch": 2, "s": ["400"] }, - "Cherry Cream Soda": { - "x": 613, - "y": 120, - "w": 274, - "ch": 2, - "s": ["400"] - }, - "Cherry Swash": { - "x": 901, - "y": 120, - "w": 159, - "ch": 2, - "s": ["400", "700"] - }, - "Chewy": { "x": 1074, "y": 120, "w": 73, "ch": 2, "s": ["400"] }, - "Chicle": { "x": 0, "y": 160, "w": 56, "ch": 2, "s": ["400"] }, - "Chilanka": { "x": 70, "y": 160, "w": 99, "ch": 2, "s": ["400"] }, - "Chiron GoRound TC": { - "x": 183, - "y": 160, - "w": 225, - "ch": 2, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Chiron Hei HK": { - "x": 422, - "y": 160, - "w": 163, - "ch": 2, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Chivo": { - "x": 599, - "y": 160, - "w": 72, - "ch": 2, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Chivo Mono": { - "x": 685, - "y": 160, - "w": 152, - "ch": 2, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Chocolate Classical Sans": { - "x": 851, - "y": 160, - "w": 283, - "ch": 2, - "s": ["400"] - }, - "Chokokutai": { "x": 0, "y": 200, "w": 148, "ch": 2, "s": ["400"] }, - "Chonburi": { "x": 162, "y": 200, "w": 138, "ch": 2, "s": ["400"] }, - "Cinzel": { - "x": 314, - "y": 200, - "w": 94, - "ch": 2, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Cinzel Decorative": { - "x": 422, - "y": 200, - "w": 262, - "ch": 2, - "s": ["400", "700", "900"] - }, - "Clicker Script": { "x": 698, "y": 200, "w": 117, "ch": 2, "s": ["400"] }, - "Climate Crisis": { "x": 829, "y": 200, "w": 247, "ch": 2, "s": ["400"] }, - "Coda": { "x": 1090, "y": 200, "w": 65, "ch": 2, "s": ["400", "800"] }, - "Codystar": { "x": 0, "y": 240, "w": 137, "ch": 2, "s": ["300", "400"] }, - "Coiny": { "x": 151, "y": 240, "w": 79, "ch": 2, "s": ["400"] }, - "Combo": { "x": 244, "y": 240, "w": 69, "ch": 2, "s": ["400"] }, - "Comfortaa": { - "x": 327, - "y": 240, - "w": 143, - "ch": 2, - "s": ["300", "400", "500", "600", "700"] - }, - "Comforter": { "x": 484, "y": 240, "w": 99, "ch": 2, "s": ["400"] }, - "Comforter Brush": { "x": 597, "y": 240, "w": 147, "ch": 2, "s": ["400"] }, - "Comic Neue": { - "x": 758, - "y": 240, - "w": 133, - "ch": 2, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "Comic Relief": { - "x": 905, - "y": 240, - "w": 147, - "ch": 2, - "s": ["400", "700"] - }, - "Coming Soon": { "x": 0, "y": 280, "w": 152, "ch": 2, "s": ["400"] }, - "Comme": { - "x": 166, - "y": 280, - "w": 96, - "ch": 2, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Commissioner": { - "x": 276, - "y": 280, - "w": 166, - "ch": 2, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Concert One": { "x": 456, "y": 280, "w": 136, "ch": 2, "s": ["400"] }, - "Condiment": { "x": 606, "y": 280, "w": 96, "ch": 2, "s": ["400"] }, - "Contrail One": { "x": 716, "y": 280, "w": 128, "ch": 2, "s": ["400"] }, - "Convergence": { "x": 858, "y": 280, "w": 155, "ch": 2, "s": ["400"] }, - "Cookie": { "x": 1027, "y": 280, "w": 55, "ch": 2, "s": ["400"] }, - "Copse": { "x": 1096, "y": 280, "w": 73, "ch": 2, "s": ["400"] }, - "Coral Pixels": { "x": 0, "y": 320, "w": 140, "ch": 2, "s": ["400"] }, - "Corben": { "x": 154, "y": 320, "w": 91, "ch": 2, "s": ["400", "700"] }, - "Corinthia": { "x": 259, "y": 320, "w": 69, "ch": 2, "s": ["400", "700"] }, - "Cormorant": { - "x": 342, - "y": 320, - "w": 113, - "ch": 2, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Cormorant Garamond": { - "x": 469, - "y": 320, - "w": 220, - "ch": 2, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Cormorant Infant": { - "x": 703, - "y": 320, - "w": 181, - "ch": 2, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Cormorant SC": { - "x": 898, - "y": 320, - "w": 167, - "ch": 2, - "s": ["300", "400", "500", "600", "700"] - }, - "Cormorant Unicase": { - "x": 0, - "y": 360, - "w": 222, - "ch": 2, - "s": ["300", "400", "500", "600", "700"] - }, - "Cormorant Upright": { - "x": 236, - "y": 360, - "w": 188, - "ch": 2, - "s": ["300", "400", "500", "600", "700"] - }, - "Cossette Texte": { - "x": 438, - "y": 360, - "w": 164, - "ch": 2, - "s": ["400", "700"] - }, - "Cossette Titre": { - "x": 616, - "y": 360, - "w": 116, - "ch": 2, - "s": ["400", "700"] - }, - "Courgette": { "x": 746, "y": 360, "w": 109, "ch": 2, "s": ["400"] }, - "Courier Prime": { - "x": 869, - "y": 360, - "w": 196, - "ch": 2, - "s": ["400", "400i", "700", "700i"] - }, - "Cousine": { - "x": 1079, - "y": 360, - "w": 109, - "ch": 2, - "s": ["400", "400i", "700", "700i"] - }, - "Coustard": { "x": 0, "y": 400, "w": 115, "ch": 2, "s": ["400", "900"] }, - "Covered By Your Grace": { - "x": 129, - "y": 400, - "w": 206, - "ch": 2, - "s": ["400"] - }, - "Crafty Girls": { "x": 349, "y": 400, "w": 153, "ch": 2, "s": ["400"] }, - "Creepster": { "x": 516, "y": 400, "w": 101, "ch": 2, "s": ["400"] }, - "Crete Round": { - "x": 631, - "y": 400, - "w": 142, - "ch": 2, - "s": ["400", "400i"] - }, - "Crimson Pro": { - "x": 787, - "y": 400, - "w": 127, - "ch": 2, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Crimson Text": { - "x": 928, - "y": 400, - "w": 139, - "ch": 2, - "s": ["400", "400i", "600", "600i", "700", "700i"] - }, - "Croissant One": { "x": 0, "y": 440, "w": 186, "ch": 2, "s": ["400"] }, - "Crushed": { "x": 200, "y": 440, "w": 79, "ch": 2, "s": ["400"] }, - "Cuprum": { - "x": 293, - "y": 440, - "w": 77, - "ch": 2, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Cute Font": { "x": 384, "y": 440, "w": 78, "ch": 2, "s": ["400"] }, - "Cutive": { "x": 476, "y": 440, "w": 98, "ch": 2, "s": ["400"] }, - "Cutive Mono": { "x": 588, "y": 440, "w": 168, "ch": 2, "s": ["400"] }, - "Dai Banna SIL": { - "x": 770, - "y": 440, - "w": 137, - "ch": 2, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Damion": { "x": 921, "y": 440, "w": 78, "ch": 2, "s": ["400"] }, - "Dancing Script": { - "x": 1013, - "y": 440, - "w": 137, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Danfo": { "x": 0, "y": 480, "w": 86, "ch": 2, "s": ["400"] }, - "Dangrek": { "x": 100, "y": 480, "w": 91, "ch": 2, "s": ["400"] }, - "Darker Grotesque": { - "x": 205, - "y": 480, - "w": 163, - "ch": 2, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Darumadrop One": { "x": 382, "y": 480, "w": 184, "ch": 2, "s": ["400"] }, - "David Libre": { - "x": 580, - "y": 480, - "w": 120, - "ch": 2, - "s": ["400", "500", "700"] - }, - "Dawning of a New Day": { - "x": 714, - "y": 480, - "w": 208, - "ch": 2, - "s": ["400"] - }, - "Days One": { "x": 936, "y": 480, "w": 133, "ch": 2, "s": ["400"] }, - "Dekko": { "x": 1083, "y": 480, "w": 62, "ch": 2, "s": ["400"] }, - "Dela Gothic One": { "x": 0, "y": 520, "w": 234, "ch": 2, "s": ["400"] }, - "Delicious Handrawn": { - "x": 248, - "y": 520, - "w": 161, - "ch": 2, - "s": ["400"] - }, - "Delius": { "x": 423, "y": 520, "w": 74, "ch": 2, "s": ["400"] }, - "Delius Swash Caps": { - "x": 511, - "y": 520, - "w": 214, - "ch": 2, - "s": ["400"] - }, - "Delius Unicase": { - "x": 739, - "y": 520, - "w": 229, - "ch": 2, - "s": ["400", "700"] - }, - "Della Respira": { "x": 982, "y": 520, "w": 149, "ch": 2, "s": ["400"] }, - "Denk One": { "x": 0, "y": 560, "w": 105, "ch": 2, "s": ["400"] }, - "Devonshire": { "x": 119, "y": 560, "w": 87, "ch": 2, "s": ["400"] }, - "Dhurjati": { "x": 220, "y": 560, "w": 75, "ch": 2, "s": ["400"] }, - "Didact Gothic": { "x": 309, "y": 560, "w": 145, "ch": 2, "s": ["400"] }, - "Diphylleia": { "x": 468, "y": 560, "w": 112, "ch": 2, "s": ["400"] }, - "Diplomata": { "x": 594, "y": 560, "w": 252, "ch": 2, "s": ["400"] }, - "Diplomata SC": { "x": 860, "y": 560, "w": 334, "ch": 2, "s": ["400"] }, - "DM Mono": { - "x": 0, - "y": 600, - "w": 109, - "ch": 2, - "s": ["300", "300i", "400", "400i", "500", "500i"] - }, - "DM Sans": { - "x": 123, - "y": 600, - "w": 104, - "ch": 2, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "DM Serif Display": { - "x": 241, - "y": 600, - "w": 181, - "ch": 2, - "s": ["400", "400i"] - }, - "DM Serif Text": { - "x": 436, - "y": 600, - "w": 150, - "ch": 2, - "s": ["400", "400i"] - }, - "Do Hyeon": { "x": 600, "y": 600, "w": 101, "ch": 2, "s": ["400"] }, - "Dokdo": { "x": 715, "y": 600, "w": 68, "ch": 2, "s": ["400"] }, - "Domine": { - "x": 797, - "y": 600, - "w": 101, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Donegal One": { "x": 912, "y": 600, "w": 161, "ch": 2, "s": ["400"] }, - "Dongle": { - "x": 1087, - "y": 600, - "w": 56, - "ch": 2, - "s": ["300", "400", "700"] - }, - "Doppio One": { "x": 0, "y": 640, "w": 138, "ch": 2, "s": ["400"] }, - "Dorsa": { "x": 152, "y": 640, "w": 32, "ch": 2, "s": ["400"] }, - "Dosis": { - "x": 198, - "y": 640, - "w": 56, - "ch": 2, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "DotGothic16": { "x": 268, "y": 640, "w": 140, "ch": 2, "s": ["400"] }, - "Doto": { - "x": 422, - "y": 640, - "w": 66, - "ch": 2, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Dr Sugiyama": { "x": 502, "y": 640, "w": 116, "ch": 2, "s": ["400"] }, - "Duru Sans": { "x": 632, "y": 640, "w": 133, "ch": 2, "s": ["400"] }, - "Dynalight": { "x": 779, "y": 640, "w": 84, "ch": 2, "s": ["400"] }, - "DynaPuff": { - "x": 877, - "y": 640, - "w": 121, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Eagle Lake": { "x": 1012, "y": 640, "w": 153, "ch": 2, "s": ["400"] }, - "East Sea Dokdo": { "x": 0, "y": 680, "w": 118, "ch": 2, "s": ["400"] }, - "Eater": { "x": 132, "y": 680, "w": 90, "ch": 2, "s": ["400"] }, - "EB Garamond": { - "x": 236, - "y": 680, - "w": 141, - "ch": 2, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Economica": { - "x": 391, - "y": 680, - "w": 88, - "ch": 2, - "s": ["400", "400i", "700", "700i"] - }, - "Eczar": { - "x": 493, - "y": 680, - "w": 65, - "ch": 2, - "s": ["400", "500", "600", "700", "800"] - }, - "Edu AU VIC WA NT Arrows": { - "x": 572, - "y": 680, - "w": 302, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu AU VIC WA NT Dots": { - "x": 888, - "y": 680, - "w": 261, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu AU VIC WA NT Guides": { - "x": 0, - "y": 720, - "w": 285, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu AU VIC WA NT Hand": { - "x": 299, - "y": 720, - "w": 274, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu AU VIC WA NT Pre": { - "x": 587, - "y": 720, - "w": 257, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu NSW ACT Cursive": { - "x": 858, - "y": 720, - "w": 276, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu NSW ACT Foundation": { - "x": 0, - "y": 760, - "w": 239, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu NSW ACT Hand Pre": { - "x": 253, - "y": 760, - "w": 294, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu QLD Beginner": { - "x": 561, - "y": 760, - "w": 177, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu QLD Hand": { - "x": 752, - "y": 760, - "w": 175, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu SA Beginner": { - "x": 941, - "y": 760, - "w": 155, - "ch": 2, - "s": ["400", "500", "600", "700"] - }, - "Edu SA Hand": { - "x": 0, - "y": 0, - "w": 159, - "ch": 3, - "s": ["400", "500", "600", "700"] - }, - "Edu TAS Beginner": { - "x": 173, - "y": 0, - "w": 175, - "ch": 3, - "s": ["400", "500", "600", "700"] - }, - "Edu VIC WA NT Beginner": { - "x": 362, - "y": 0, - "w": 243, - "ch": 3, - "s": ["400", "500", "600", "700"] - }, - "Edu VIC WA NT Hand": { - "x": 619, - "y": 0, - "w": 230, - "ch": 3, - "s": ["400", "500", "600", "700"] - }, - "Edu VIC WA NT Hand Pre": { - "x": 863, - "y": 0, - "w": 282, - "ch": 3, - "s": ["400", "500", "600", "700"] - }, - "El Messiri": { - "x": 0, - "y": 40, - "w": 109, - "ch": 3, - "s": ["400", "500", "600", "700"] - }, - "Electrolize": { "x": 123, "y": 40, "w": 123, "ch": 3, "s": ["400"] }, - "Elms Sans": { - "x": 260, - "y": 40, - "w": 123, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Elsie": { "x": 397, "y": 40, "w": 61, "ch": 3, "s": ["400", "900"] }, - "Elsie Swash Caps": { - "x": 472, - "y": 40, - "w": 190, - "ch": 3, - "s": ["400", "900"] - }, - "Emblema One": { "x": 676, "y": 40, "w": 198, "ch": 3, "s": ["400"] }, - "Emilys Candy": { "x": 888, "y": 40, "w": 148, "ch": 3, "s": ["400"] }, - "Encode Sans": { - "x": 1050, - "y": 40, - "w": 141, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Encode Sans Condensed": { - "x": 0, - "y": 80, - "w": 227, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Encode Sans Expanded": { - "x": 241, - "y": 80, - "w": 287, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Encode Sans SC": { - "x": 542, - "y": 80, - "w": 186, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Encode Sans Semi Condensed": { - "x": 742, - "y": 80, - "w": 299, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Encode Sans Semi Expanded": { - "x": 0, - "y": 120, - "w": 330, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Engagement": { "x": 344, "y": 120, "w": 80, "ch": 3, "s": ["400"] }, - "Englebert": { "x": 438, "y": 120, "w": 97, "ch": 3, "s": ["400"] }, - "Enriqueta": { - "x": 549, - "y": 120, - "w": 115, - "ch": 3, - "s": ["400", "500", "600", "700"] - }, - "Ephesis": { "x": 678, "y": 120, "w": 72, "ch": 3, "s": ["400"] }, - "Epilogue": { - "x": 764, - "y": 120, - "w": 109, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Epunda Sans": { - "x": 887, - "y": 120, - "w": 133, - "ch": 3, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Epunda Slab": { - "x": 1034, - "y": 120, - "w": 132, - "ch": 3, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Erica One": { "x": 0, "y": 160, "w": 131, "ch": 3, "s": ["400"] }, - "Esteban": { "x": 145, "y": 160, "w": 93, "ch": 3, "s": ["400"] }, - "Estonia": { "x": 252, "y": 160, "w": 47, "ch": 3, "s": ["400"] }, - "Euphoria Script": { "x": 313, "y": 160, "w": 127, "ch": 3, "s": ["400"] }, - "Ewert": { "x": 454, "y": 160, "w": 97, "ch": 3, "s": ["400"] }, - "Exile": { "x": 565, "y": 160, "w": 81, "ch": 3, "s": ["400"] }, - "Exo": { - "x": 660, - "y": 160, - "w": 48, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Exo 2": { - "x": 722, - "y": 160, - "w": 67, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Expletus Sans": { - "x": 803, - "y": 160, - "w": 159, - "ch": 3, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Explora": { "x": 976, "y": 160, "w": 87, "ch": 3, "s": ["400"] }, - "Faculty Glyphic": { "x": 0, "y": 200, "w": 182, "ch": 3, "s": ["400"] }, - "Fahkwang": { - "x": 196, - "y": 200, - "w": 133, - "ch": 3, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Familjen Grotesk": { - "x": 343, - "y": 200, - "w": 178, - "ch": 3, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Fanwood Text": { - "x": 535, - "y": 200, - "w": 140, - "ch": 3, - "s": ["400", "400i"] - }, - "Farro": { - "x": 689, - "y": 200, - "w": 72, - "ch": 3, - "s": ["300", "400", "500", "700"] - }, - "Farsan": { "x": 775, "y": 200, "w": 61, "ch": 3, "s": ["400"] }, - "Fascinate": { "x": 850, "y": 200, "w": 135, "ch": 3, "s": ["400"] }, - "Fascinate Inline": { "x": 0, "y": 240, "w": 220, "ch": 3, "s": ["400"] }, - "Faster One": { "x": 234, "y": 240, "w": 165, "ch": 3, "s": ["400"] }, - "Fasthand": { "x": 413, "y": 240, "w": 84, "ch": 3, "s": ["400"] }, - "Fauna One": { "x": 511, "y": 240, "w": 141, "ch": 3, "s": ["400"] }, - "Faustina": { - "x": 666, - "y": 240, - "w": 97, - "ch": 3, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Federant": { "x": 777, "y": 240, "w": 105, "ch": 3, "s": ["400"] }, - "Federo": { "x": 896, "y": 240, "w": 78, "ch": 3, "s": ["400"] }, - "Felipa": { "x": 988, "y": 240, "w": 60, "ch": 3, "s": ["400"] }, - "Fenix": { "x": 1062, "y": 240, "w": 63, "ch": 3, "s": ["400"] }, - "Festive": { "x": 0, "y": 280, "w": 67, "ch": 3, "s": ["400"] }, - "Figtree": { - "x": 81, - "y": 280, - "w": 85, - "ch": 3, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Finger Paint": { "x": 180, "y": 280, "w": 158, "ch": 3, "s": ["400"] }, - "Finlandica": { - "x": 352, - "y": 280, - "w": 114, - "ch": 3, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Fira Code": { - "x": 480, - "y": 280, - "w": 138, - "ch": 3, - "s": ["300", "400", "500", "600", "700"] - }, - "Fira Mono": { - "x": 632, - "y": 280, - "w": 138, - "ch": 3, - "s": ["400", "500", "700"] - }, - "Fira Sans": { - "x": 784, - "y": 280, - "w": 105, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Fira Sans Condensed": { - "x": 903, - "y": 280, - "w": 211, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Fira Sans Extra Condensed": { - "x": 0, - "y": 320, - "w": 244, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Fjalla One": { "x": 258, "y": 320, "w": 98, "ch": 3, "s": ["400"] }, - "Fjord One": { "x": 370, "y": 320, "w": 115, "ch": 3, "s": ["400"] }, - "Flamenco": { "x": 499, "y": 320, "w": 99, "ch": 3, "s": ["300", "400"] }, - "Flavors": { "x": 612, "y": 320, "w": 82, "ch": 3, "s": ["400"] }, - "Fleur De Leah": { "x": 708, "y": 320, "w": 133, "ch": 3, "s": ["400"] }, - "Flow Block": { "x": 855, "y": 320, "w": 126, "ch": 3, "s": ["400"] }, - "Flow Circular": { "x": 995, "y": 320, "w": 145, "ch": 3, "s": ["400"] }, - "Flow Rounded": { "x": 0, "y": 360, "w": 160, "ch": 3, "s": ["400"] }, - "Foldit": { - "x": 174, - "y": 360, - "w": 54, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Fondamento": { - "x": 242, - "y": 360, - "w": 133, - "ch": 3, - "s": ["400", "400i"] - }, - "Fontdiner Swanky": { "x": 389, "y": 360, "w": 239, "ch": 3, "s": ["400"] }, - "Forum": { "x": 642, "y": 360, "w": 70, "ch": 3, "s": ["400"] }, - "Fragment Mono": { - "x": 726, - "y": 360, - "w": 201, - "ch": 3, - "s": ["400", "400i"] - }, - "Francois One": { "x": 941, "y": 360, "w": 136, "ch": 3, "s": ["400"] }, - "Frank Ruhl Libre": { - "x": 0, - "y": 400, - "w": 184, - "ch": 3, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Fraunces": { - "x": 198, - "y": 400, - "w": 112, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Freckle Face": { "x": 324, "y": 400, "w": 141, "ch": 3, "s": ["400"] }, - "Fredericka the Great": { - "x": 479, - "y": 400, - "w": 243, - "ch": 3, - "s": ["400"] - }, - "Fredoka": { - "x": 736, - "y": 400, - "w": 96, - "ch": 3, - "s": ["300", "400", "500", "600", "700"] - }, - "Fredoka One": { "x": 846, "y": 400, "w": 155, "ch": 3, "s": ["400"] }, - "Freehand": { "x": 1015, "y": 400, "w": 85, "ch": 3, "s": ["400"] }, - "Freeman": { "x": 0, "y": 440, "w": 91, "ch": 3, "s": ["400"] }, - "Fresca": { "x": 105, "y": 440, "w": 67, "ch": 3, "s": ["400"] }, - "Frijole": { "x": 186, "y": 440, "w": 132, "ch": 3, "s": ["400"] }, - "Fruktur": { "x": 332, "y": 440, "w": 94, "ch": 3, "s": ["400", "400i"] }, - "Fugaz One": { "x": 440, "y": 440, "w": 127, "ch": 3, "s": ["400"] }, - "Fuggles": { "x": 581, "y": 440, "w": 58, "ch": 3, "s": ["400"] }, - "Funnel Display": { - "x": 653, - "y": 440, - "w": 174, - "ch": 3, - "s": ["300", "400", "500", "600", "700", "800"] - }, - "Funnel Sans": { - "x": 841, - "y": 440, - "w": 140, - "ch": 3, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Fustat": { - "x": 995, - "y": 440, - "w": 75, - "ch": 3, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Fuzzy Bubbles": { - "x": 0, - "y": 480, - "w": 179, - "ch": 3, - "s": ["400", "700"] - }, - "Ga Maamli": { "x": 193, "y": 480, "w": 111, "ch": 3, "s": ["400"] }, - "Gabarito": { - "x": 318, - "y": 480, - "w": 99, - "ch": 3, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Gabriela": { "x": 431, "y": 480, "w": 106, "ch": 3, "s": ["400"] }, - "Gaegu": { - "x": 551, - "y": 480, - "w": 70, - "ch": 3, - "s": ["300", "400", "700"] - }, - "Gafata": { "x": 635, "y": 480, "w": 72, "ch": 3, "s": ["400"] }, - "Gajraj One": { "x": 721, "y": 480, "w": 148, "ch": 3, "s": ["400"] }, - "Galada": { "x": 883, "y": 480, "w": 78, "ch": 3, "s": ["400"] }, - "Galdeano": { "x": 975, "y": 480, "w": 98, "ch": 3, "s": ["400"] }, - "Galindo": { "x": 1087, "y": 480, "w": 101, "ch": 3, "s": ["400"] }, - "Gamja Flower": { "x": 0, "y": 520, "w": 130, "ch": 3, "s": ["400"] }, - "Gantari": { - "x": 144, - "y": 520, - "w": 89, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Gasoek One": { "x": 247, "y": 520, "w": 163, "ch": 3, "s": ["400"] }, - "Gayathri": { - "x": 424, - "y": 520, - "w": 99, - "ch": 3, - "s": ["100", "400", "700"] - }, - "Geist": { - "x": 537, - "y": 520, - "w": 66, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Geist Mono": { - "x": 617, - "y": 520, - "w": 152, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Gelasio": { - "x": 783, - "y": 520, - "w": 87, - "ch": 3, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Gemunu Libre": { - "x": 884, - "y": 520, - "w": 126, - "ch": 3, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Genos": { - "x": 1024, - "y": 520, - "w": 67, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Gentium Book Basic": { - "x": 0, - "y": 560, - "w": 209, - "ch": 3, - "s": ["400", "400i", "700", "700i"] - }, - "Gentium Book Plus": { - "x": 223, - "y": 560, - "w": 198, - "ch": 3, - "s": ["400", "400i", "700", "700i"] - }, - "Gentium Plus": { - "x": 435, - "y": 560, - "w": 140, - "ch": 3, - "s": ["400", "400i", "700", "700i"] - }, - "Geo": { "x": 589, "y": 560, "w": 42, "ch": 3, "s": ["400", "400i"] }, - "Geologica": { - "x": 645, - "y": 560, - "w": 122, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Geom": { - "x": 781, - "y": 560, - "w": 76, - "ch": 3, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Georama": { - "x": 871, - "y": 560, - "w": 102, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Geostar": { "x": 987, "y": 560, "w": 133, "ch": 3, "s": ["400"] }, - "Geostar Fill": { "x": 0, "y": 600, "w": 192, "ch": 3, "s": ["400"] }, - "Germania One": { "x": 206, "y": 600, "w": 137, "ch": 3, "s": ["400"] }, - "GFS Didot": { "x": 357, "y": 600, "w": 121, "ch": 3, "s": ["400"] }, - "GFS Neohellenic": { - "x": 492, - "y": 600, - "w": 155, - "ch": 3, - "s": ["400", "400i", "700", "700i"] - }, - "Gideon Roman": { "x": 661, "y": 600, "w": 172, "ch": 3, "s": ["400"] }, - "Gidole": { "x": 847, "y": 600, "w": 73, "ch": 3, "s": ["400"] }, - "Gidugu": { "x": 934, "y": 600, "w": 58, "ch": 3, "s": ["400"] }, - "Gilda Display": { "x": 1006, "y": 600, "w": 156, "ch": 3, "s": ["400"] }, - "Girassol": { "x": 0, "y": 640, "w": 91, "ch": 3, "s": ["400"] }, - "Give You Glory": { "x": 105, "y": 640, "w": 170, "ch": 3, "s": ["400"] }, - "Glass Antiqua": { "x": 289, "y": 640, "w": 130, "ch": 3, "s": ["400"] }, - "Glegoo": { "x": 433, "y": 640, "w": 90, "ch": 3, "s": ["400", "700"] }, - "Gloock": { "x": 537, "y": 640, "w": 89, "ch": 3, "s": ["400"] }, - "Gloria Hallelujah": { - "x": 640, - "y": 640, - "w": 190, - "ch": 3, - "s": ["400"] - }, - "Glory": { - "x": 844, - "y": 640, - "w": 56, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Gluten": { - "x": 914, - "y": 640, - "w": 90, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Goblin One": { "x": 0, "y": 680, "w": 202, "ch": 3, "s": ["400"] }, - "Gochi Hand": { "x": 216, "y": 680, "w": 121, "ch": 3, "s": ["400"] }, - "Goldman": { "x": 351, "y": 680, "w": 118, "ch": 3, "s": ["400", "700"] }, - "Golos Text": { - "x": 483, - "y": 680, - "w": 130, - "ch": 3, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Google Sans": { - "x": 627, - "y": 680, - "w": 146, - "ch": 3, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Google Sans Code": { - "x": 787, - "y": 680, - "w": 239, - "ch": 3, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Google Sans Flex": { - "x": 0, - "y": 720, - "w": 193, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Gorditas": { "x": 207, "y": 720, "w": 111, "ch": 3, "s": ["400", "700"] }, - "Gothic A1": { - "x": 332, - "y": 720, - "w": 114, - "ch": 3, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Gotu": { "x": 460, "y": 720, "w": 67, "ch": 3, "s": ["400"] }, - "Goudy Bookletter 1911": { - "x": 541, - "y": 720, - "w": 218, - "ch": 3, - "s": ["400"] - }, - "Gowun Batang": { - "x": 773, - "y": 720, - "w": 162, - "ch": 3, - "s": ["400", "700"] - }, - "Gowun Dodum": { "x": 949, "y": 720, "w": 161, "ch": 3, "s": ["400"] }, - "Graduate": { "x": 0, "y": 760, "w": 134, "ch": 3, "s": ["400"] }, - "Grand Hotel": { "x": 148, "y": 760, "w": 101, "ch": 3, "s": ["400"] }, - "Grandiflora One": { "x": 263, "y": 760, "w": 174, "ch": 3, "s": ["400"] }, - "Grandstander": { - "x": 451, - "y": 760, - "w": 173, - "ch": 3, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Grape Nuts": { "x": 638, "y": 760, "w": 111, "ch": 3, "s": ["400"] }, - "Gravitas One": { "x": 763, "y": 760, "w": 230, "ch": 3, "s": ["400"] }, - "Great Vibes": { "x": 1007, "y": 760, "w": 104, "ch": 3, "s": ["400"] }, - "Grechen Fuemen": { "x": 0, "y": 0, "w": 179, "ch": 4, "s": ["400"] }, - "Grenze": { - "x": 193, - "y": 0, - "w": 69, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Grenze Gotisch": { - "x": 276, - "y": 0, - "w": 135, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Grey Qo": { "x": 425, "y": 0, "w": 64, "ch": 4, "s": ["400"] }, - "Griffy": { "x": 503, "y": 0, "w": 71, "ch": 4, "s": ["400"] }, - "Gruppo": { "x": 588, "y": 0, "w": 95, "ch": 4, "s": ["400"] }, - "Gudea": { - "x": 697, - "y": 0, - "w": 74, - "ch": 4, - "s": ["400", "400i", "700", "700i"] - }, - "Gugi": { "x": 785, "y": 0, "w": 60, "ch": 4, "s": ["400"] }, - "Gulzar": { "x": 859, "y": 0, "w": 77, "ch": 4, "s": ["400"] }, - "Gupter": { - "x": 950, - "y": 0, - "w": 72, - "ch": 4, - "s": ["400", "500", "700"] - }, - "Gurajada": { "x": 1036, "y": 0, "w": 71, "ch": 4, "s": ["400"] }, - "Gwendolyn": { "x": 0, "y": 40, "w": 89, "ch": 4, "s": ["400", "700"] }, - "Habibi": { "x": 103, "y": 40, "w": 81, "ch": 4, "s": ["400"] }, - "Hachi Maru Pop": { "x": 198, "y": 40, "w": 246, "ch": 4, "s": ["400"] }, - "Hahmlet": { - "x": 458, - "y": 40, - "w": 112, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Halant": { - "x": 584, - "y": 40, - "w": 75, - "ch": 4, - "s": ["300", "400", "500", "600", "700"] - }, - "Hammersmith One": { "x": 673, "y": 40, "w": 217, "ch": 4, "s": ["400"] }, - "Hanalei": { "x": 904, "y": 40, "w": 91, "ch": 4, "s": ["400"] }, - "Hanalei Fill": { "x": 1009, "y": 40, "w": 136, "ch": 4, "s": ["400"] }, - "Handjet": { - "x": 0, - "y": 80, - "w": 68, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Handlee": { "x": 82, "y": 80, "w": 88, "ch": 4, "s": ["400"] }, - "Hanken Grotesk": { - "x": 184, - "y": 80, - "w": 181, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Hanuman": { - "x": 379, - "y": 80, - "w": 123, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Happy Monkey": { "x": 516, "y": 80, "w": 189, "ch": 4, "s": ["400"] }, - "Harmattan": { - "x": 719, - "y": 80, - "w": 99, - "ch": 4, - "s": ["400", "500", "600", "700"] - }, - "Headland One": { "x": 832, "y": 80, "w": 185, "ch": 4, "s": ["400"] }, - "Hedvig Letters Sans": { - "x": 0, - "y": 120, - "w": 224, - "ch": 4, - "s": ["400"] - }, - "Hedvig Letters Serif": { - "x": 238, - "y": 120, - "w": 226, - "ch": 4, - "s": ["400"] - }, - "Heebo": { - "x": 478, - "y": 120, - "w": 78, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Henny Penny": { "x": 570, "y": 120, "w": 148, "ch": 4, "s": ["400"] }, - "Hepta Slab": { - "x": 732, - "y": 120, - "w": 150, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Herr Von Muellerhoff": { - "x": 896, - "y": 120, - "w": 145, - "ch": 4, - "s": ["400"] - }, - "Hi Melody": { "x": 1055, "y": 120, "w": 84, "ch": 4, "s": ["400"] }, - "Hina Mincho": { "x": 0, "y": 160, "w": 128, "ch": 4, "s": ["400"] }, - "Hind": { - "x": 142, - "y": 160, - "w": 56, - "ch": 4, - "s": ["300", "400", "500", "600", "700"] - }, - "Hind Guntur": { - "x": 212, - "y": 160, - "w": 134, - "ch": 4, - "s": ["300", "400", "500", "600", "700"] - }, - "Hind Madurai": { - "x": 360, - "y": 160, - "w": 146, - "ch": 4, - "s": ["300", "400", "500", "600", "700"] - }, - "Hind Mysuru": { - "x": 520, - "y": 160, - "w": 138, - "ch": 4, - "s": ["300", "400", "500", "600", "700"] - }, - "Hind Siliguri": { - "x": 672, - "y": 160, - "w": 130, - "ch": 4, - "s": ["300", "400", "500", "600", "700"] - }, - "Hind Vadodara": { - "x": 816, - "y": 160, - "w": 161, - "ch": 4, - "s": ["300", "400", "500", "600", "700"] - }, - "Holtwood One SC": { "x": 0, "y": 200, "w": 292, "ch": 4, "s": ["400"] }, - "Homemade Apple": { "x": 306, "y": 200, "w": 239, "ch": 4, "s": ["400"] }, - "Homenaje": { "x": 559, "y": 200, "w": 85, "ch": 4, "s": ["400"] }, - "Honk": { "x": 658, "y": 200, "w": 59, "ch": 4, "s": ["400"] }, - "Host Grotesk": { - "x": 731, - "y": 200, - "w": 150, - "ch": 4, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Hubballi": { "x": 895, "y": 200, "w": 87, "ch": 4, "s": ["400"] }, - "Hubot Sans": { - "x": 996, - "y": 200, - "w": 137, - "ch": 4, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Huninn": { "x": 0, "y": 240, "w": 89, "ch": 4, "s": ["400"] }, - "Hurricane": { "x": 103, "y": 240, "w": 76, "ch": 4, "s": ["400"] }, - "Iansui": { "x": 193, "y": 240, "w": 78, "ch": 4, "s": ["400"] }, - "Ibarra Real Nova": { - "x": 285, - "y": 240, - "w": 182, - "ch": 4, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "IBM Plex Mono": { - "x": 481, - "y": 240, - "w": 196, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "IBM Plex Sans": { - "x": 691, - "y": 240, - "w": 163, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "IBM Plex Sans Arabic": { - "x": 868, - "y": 240, - "w": 237, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "IBM Plex Sans Condensed": { - "x": 0, - "y": 280, - "w": 263, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "IBM Plex Sans Devanagari": { - "x": 277, - "y": 280, - "w": 289, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "IBM Plex Sans Hebrew": { - "x": 580, - "y": 280, - "w": 253, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "IBM Plex Sans JP": { - "x": 847, - "y": 280, - "w": 204, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "IBM Plex Sans KR": { - "x": 0, - "y": 320, - "w": 199, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "IBM Plex Sans Thai": { - "x": 213, - "y": 320, - "w": 215, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "IBM Plex Sans Thai Looped": { - "x": 442, - "y": 320, - "w": 300, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "IBM Plex Serif": { - "x": 756, - "y": 320, - "w": 167, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Iceberg": { "x": 937, "y": 320, "w": 84, "ch": 4, "s": ["400"] }, - "Iceland": { "x": 1035, "y": 320, "w": 75, "ch": 4, "s": ["400"] }, - "IM Fell Double Pica": { - "x": 0, - "y": 360, - "w": 204, - "ch": 4, - "s": ["400", "400i"] - }, - "IM Fell Double Pica SC": { - "x": 218, - "y": 360, - "w": 261, - "ch": 4, - "s": ["400"] - }, - "IM Fell DW Pica": { - "x": 493, - "y": 360, - "w": 175, - "ch": 4, - "s": ["400", "400i"] - }, - "IM Fell DW Pica SC": { - "x": 682, - "y": 360, - "w": 220, - "ch": 4, - "s": ["400"] - }, - "IM Fell English": { - "x": 916, - "y": 360, - "w": 168, - "ch": 4, - "s": ["400", "400i"] - }, - "IM Fell English SC": { "x": 0, "y": 400, "w": 215, "ch": 4, "s": ["400"] }, - "IM Fell French Canon": { - "x": 229, - "y": 400, - "w": 233, - "ch": 4, - "s": ["400", "400i"] - }, - "IM Fell French Canon SC": { - "x": 476, - "y": 400, - "w": 279, - "ch": 4, - "s": ["400"] - }, - "IM Fell Great Primer": { - "x": 769, - "y": 400, - "w": 220, - "ch": 4, - "s": ["400", "400i"] - }, - "IM Fell Great Primer SC": { - "x": 0, - "y": 440, - "w": 289, - "ch": 4, - "s": ["400"] - }, - "Imbue": { - "x": 303, - "y": 440, - "w": 52, - "ch": 4, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Imperial Script": { "x": 369, "y": 440, "w": 119, "ch": 4, "s": ["400"] }, - "Imprima": { "x": 502, "y": 440, "w": 98, "ch": 4, "s": ["400"] }, - "Inclusive Sans": { - "x": 614, - "y": 440, - "w": 172, - "ch": 4, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Inconsolata": { - "x": 800, - "y": 440, - "w": 140, - "ch": 4, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Inder": { "x": 954, "y": 440, "w": 64, "ch": 4, "s": ["400"] }, - "Indie Flower": { "x": 1032, "y": 440, "w": 125, "ch": 4, "s": ["400"] }, - "Ingrid Darling": { "x": 0, "y": 480, "w": 114, "ch": 4, "s": ["400"] }, - "Inika": { "x": 128, "y": 480, "w": 67, "ch": 4, "s": ["400", "700"] }, - "Inknut Antiqua": { - "x": 209, - "y": 480, - "w": 211, - "ch": 4, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Inria Sans": { - "x": 434, - "y": 480, - "w": 110, - "ch": 4, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "Inria Serif": { - "x": 558, - "y": 480, - "w": 120, - "ch": 4, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "Inspiration": { "x": 692, "y": 480, "w": 78, "ch": 4, "s": ["400"] }, - "Instrument Sans": { - "x": 784, - "y": 480, - "w": 189, - "ch": 4, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Instrument Serif": { - "x": 987, - "y": 480, - "w": 143, - "ch": 4, - "s": ["400", "400i"] - }, - "Intel One Mono": { - "x": 0, - "y": 520, - "w": 215, - "ch": 4, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Inter": { - "x": 229, - "y": 520, - "w": 60, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Inter Tight": { - "x": 303, - "y": 520, - "w": 113, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Irish Grover": { "x": 430, "y": 520, "w": 139, "ch": 4, "s": ["400"] }, - "Island Moments": { "x": 583, "y": 520, "w": 125, "ch": 4, "s": ["400"] }, - "Istok Web": { - "x": 722, - "y": 520, - "w": 116, - "ch": 4, - "s": ["400", "400i", "700", "700i"] - }, - "Italiana": { "x": 852, "y": 520, "w": 83, "ch": 4, "s": ["400"] }, - "Italianno": { "x": 949, "y": 520, "w": 68, "ch": 4, "s": ["400"] }, - "Itim": { "x": 1031, "y": 520, "w": 52, "ch": 4, "s": ["400"] }, - "Jacquard 12": { "x": 0, "y": 560, "w": 110, "ch": 4, "s": ["400"] }, - "Jacquard 12 Charted": { - "x": 124, - "y": 560, - "w": 184, - "ch": 4, - "s": ["400"] - }, - "Jacquard 24": { "x": 322, "y": 560, "w": 108, "ch": 4, "s": ["400"] }, - "Jacquard 24 Charted": { - "x": 444, - "y": 560, - "w": 179, - "ch": 4, - "s": ["400"] - }, - "Jacquarda Bastarda 9": { - "x": 637, - "y": 560, - "w": 261, - "ch": 4, - "s": ["400"] - }, - "Jacquarda Bastarda 9 Charted": { - "x": 0, - "y": 600, - "w": 357, - "ch": 4, - "s": ["400"] - }, - "Jacques Francois": { "x": 371, "y": 600, "w": 197, "ch": 4, "s": ["400"] }, - "Jacques Francois Shadow": { - "x": 582, - "y": 600, - "w": 315, - "ch": 4, - "s": ["400"] - }, - "Jaini": { "x": 911, "y": 600, "w": 50, "ch": 4, "s": ["400"] }, - "Jaini Purva": { "x": 975, "y": 600, "w": 102, "ch": 4, "s": ["400"] }, - "Jaldi": { "x": 1091, "y": 600, "w": 52, "ch": 4, "s": ["400", "700"] }, - "Jaro": { "x": 0, "y": 640, "w": 50, "ch": 4, "s": ["400"] }, - "Jersey 10": { "x": 64, "y": 640, "w": 84, "ch": 4, "s": ["400"] }, - "Jersey 10 Charted": { - "x": 162, - "y": 640, - "w": 158, - "ch": 4, - "s": ["400"] - }, - "Jersey 15": { "x": 334, "y": 640, "w": 91, "ch": 4, "s": ["400"] }, - "Jersey 15 Charted": { - "x": 439, - "y": 640, - "w": 168, - "ch": 4, - "s": ["400"] - }, - "Jersey 20": { "x": 621, "y": 640, "w": 98, "ch": 4, "s": ["400"] }, - "Jersey 20 Charted": { - "x": 733, - "y": 640, - "w": 176, - "ch": 4, - "s": ["400"] - }, - "Jersey 25": { "x": 923, "y": 640, "w": 102, "ch": 4, "s": ["400"] }, - "Jersey 25 Charted": { "x": 0, "y": 680, "w": 180, "ch": 4, "s": ["400"] }, - "JetBrains Mono": { - "x": 194, - "y": 680, - "w": 210, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Jim Nightshade": { "x": 418, "y": 680, "w": 119, "ch": 4, "s": ["400"] }, - "Joan": { "x": 551, "y": 680, "w": 54, "ch": 4, "s": ["400"] }, - "Jockey One": { "x": 619, "y": 680, "w": 108, "ch": 4, "s": ["400"] }, - "Jolly Lodger": { "x": 741, "y": 680, "w": 90, "ch": 4, "s": ["400"] }, - "Jomhuria": { "x": 845, "y": 680, "w": 64, "ch": 4, "s": ["400"] }, - "Jomolhari": { "x": 923, "y": 680, "w": 116, "ch": 4, "s": ["400"] }, - "Josefin Sans": { - "x": 1053, - "y": 680, - "w": 138, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Josefin Slab": { - "x": 0, - "y": 720, - "w": 123, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Jost": { - "x": 137, - "y": 720, - "w": 43, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Joti One": { "x": 194, "y": 720, "w": 100, "ch": 4, "s": ["400"] }, - "Jua": { "x": 308, "y": 720, "w": 48, "ch": 4, "s": ["400"] }, - "Judson": { - "x": 370, - "y": 720, - "w": 80, - "ch": 4, - "s": ["400", "400i", "700", "700i"] - }, - "Julee": { "x": 464, "y": 720, "w": 57, "ch": 4, "s": ["400"] }, - "Julius Sans One": { "x": 535, "y": 720, "w": 210, "ch": 4, "s": ["400"] }, - "Junge": { "x": 759, "y": 720, "w": 73, "ch": 4, "s": ["400"] }, - "Jura": { - "x": 846, - "y": 720, - "w": 59, - "ch": 4, - "s": ["300", "400", "500", "600", "700"] - }, - "Just Another Hand": { - "x": 919, - "y": 720, - "w": 112, - "ch": 4, - "s": ["400"] - }, - "Just Me Again Down Here": { - "x": 0, - "y": 760, - "w": 200, - "ch": 4, - "s": ["400"] - }, - "K2D": { - "x": 214, - "y": 760, - "w": 56, - "ch": 4, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Kablammo": { "x": 284, "y": 760, "w": 128, "ch": 4, "s": ["400"] }, - "Kadwa": { "x": 426, "y": 760, "w": 87, "ch": 4, "s": ["400", "700"] }, - "Kaisei Decol": { - "x": 527, - "y": 760, - "w": 154, - "ch": 4, - "s": ["400", "500", "700"] - }, - "Kaisei HarunoUmi": { - "x": 695, - "y": 760, - "w": 223, - "ch": 4, - "s": ["400", "500", "700"] - }, - "Kaisei Opti": { - "x": 932, - "y": 760, - "w": 137, - "ch": 4, - "s": ["400", "500", "700"] - }, - "Kaisei Tokumin": { - "x": 0, - "y": 0, - "w": 191, - "ch": 5, - "s": ["400", "500", "700", "800"] - }, - "Kalam": { "x": 205, "y": 0, "w": 70, "ch": 5, "s": ["300", "400", "700"] }, - "Kalnia": { - "x": 289, - "y": 0, - "w": 87, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Kalnia Glaze": { - "x": 390, - "y": 0, - "w": 162, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Kameron": { - "x": 566, - "y": 0, - "w": 107, - "ch": 5, - "s": ["400", "500", "600", "700"] - }, - "Kanchenjunga": { - "x": 687, - "y": 0, - "w": 165, - "ch": 5, - "s": ["400", "500", "600", "700"] - }, - "Kanit": { - "x": 866, - "y": 0, - "w": 65, - "ch": 5, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Kantumruy Pro": { - "x": 945, - "y": 0, - "w": 175, - "ch": 5, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Kapakana": { "x": 0, "y": 40, "w": 83, "ch": 5, "s": ["300", "400"] }, - "Karantina": { - "x": 97, - "y": 40, - "w": 66, - "ch": 5, - "s": ["300", "400", "700"] - }, - "Karla": { - "x": 177, - "y": 40, - "w": 65, - "ch": 5, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Karma": { - "x": 256, - "y": 40, - "w": 79, - "ch": 5, - "s": ["300", "400", "500", "600", "700"] - }, - "Katibeh": { "x": 349, "y": 40, "w": 67, "ch": 5, "s": ["400"] }, - "Kaushan Script": { "x": 430, "y": 40, "w": 159, "ch": 5, "s": ["400"] }, - "Kavivanar": { "x": 603, "y": 40, "w": 107, "ch": 5, "s": ["400"] }, - "Kavoon": { "x": 724, "y": 40, "w": 95, "ch": 5, "s": ["400"] }, - "Kay Pho Du": { - "x": 833, - "y": 40, - "w": 132, - "ch": 5, - "s": ["400", "500", "600", "700"] - }, - "Kdam Thmor Pro": { "x": 979, "y": 40, "w": 189, "ch": 5, "s": ["400"] }, - "Keania One": { "x": 0, "y": 80, "w": 126, "ch": 5, "s": ["400"] }, - "Kedebideri": { - "x": 140, - "y": 80, - "w": 120, - "ch": 5, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Kelly Slab": { "x": 274, "y": 80, "w": 115, "ch": 5, "s": ["400"] }, - "Kenia": { "x": 403, "y": 80, "w": 57, "ch": 5, "s": ["400"] }, - "Khand": { - "x": 474, - "y": 80, - "w": 61, - "ch": 5, - "s": ["300", "400", "500", "600", "700"] - }, - "Khula": { - "x": 549, - "y": 80, - "w": 68, - "ch": 5, - "s": ["300", "400", "600", "700", "800"] - }, - "Kings": { "x": 631, "y": 80, "w": 63, "ch": 5, "s": ["400"] }, - "Kirang Haerang": { "x": 708, "y": 80, "w": 145, "ch": 5, "s": ["400"] }, - "Kite One": { "x": 867, "y": 80, "w": 97, "ch": 5, "s": ["400"] }, - "Kiwi Maru": { - "x": 978, - "y": 80, - "w": 135, - "ch": 5, - "s": ["300", "400", "500"] - }, - "Klee One": { "x": 0, "y": 120, "w": 109, "ch": 5, "s": ["400", "600"] }, - "Knewave": { "x": 123, "y": 120, "w": 103, "ch": 5, "s": ["400"] }, - "Kodchasan": { - "x": 240, - "y": 120, - "w": 139, - "ch": 5, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Kode Mono": { - "x": 393, - "y": 120, - "w": 138, - "ch": 5, - "s": ["400", "500", "600", "700"] - }, - "Koh Santepheap": { - "x": 545, - "y": 120, - "w": 195, - "ch": 5, - "s": ["100", "300", "400", "700", "900"] - }, - "KoHo": { - "x": 754, - "y": 120, - "w": 66, - "ch": 5, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Kolker Brush": { "x": 834, "y": 120, "w": 84, "ch": 5, "s": ["400"] }, - "Konkhmer Sleokchher": { - "x": 0, - "y": 160, - "w": 269, - "ch": 5, - "s": ["400"] - }, - "Kosugi": { "x": 283, "y": 160, "w": 80, "ch": 5, "s": ["400"] }, - "Kosugi Maru": { "x": 377, "y": 160, "w": 140, "ch": 5, "s": ["400"] }, - "Kotta One": { "x": 531, "y": 160, "w": 110, "ch": 5, "s": ["400"] }, - "Koulen": { "x": 655, "y": 160, "w": 72, "ch": 5, "s": ["400"] }, - "Kranky": { "x": 741, "y": 160, "w": 87, "ch": 5, "s": ["400"] }, - "Kreon": { - "x": 842, - "y": 160, - "w": 68, - "ch": 5, - "s": ["300", "400", "500", "600", "700"] - }, - "Kristi": { "x": 924, "y": 160, "w": 46, "ch": 5, "s": ["400"] }, - "Krona One": { "x": 984, "y": 160, "w": 173, "ch": 5, "s": ["400"] }, - "Krub": { - "x": 0, - "y": 200, - "w": 62, - "ch": 5, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Kufam": { - "x": 76, - "y": 200, - "w": 84, - "ch": 5, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Kulim Park": { - "x": 174, - "y": 200, - "w": 116, - "ch": 5, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "600", - "600i", - "700", - "700i" - ] - }, - "Kumar One": { "x": 304, "y": 200, "w": 167, "ch": 5, "s": ["400"] }, - "Kumar One Outline": { - "x": 485, - "y": 200, - "w": 277, - "ch": 5, - "s": ["400"] - }, - "Kumbh Sans": { - "x": 776, - "y": 200, - "w": 147, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Kurale": { "x": 937, "y": 200, "w": 77, "ch": 5, "s": ["400"] }, - "La Belle Aurore": { "x": 1028, "y": 200, "w": 170, "ch": 5, "s": ["400"] }, - "Labrada": { - "x": 0, - "y": 240, - "w": 91, - "ch": 5, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Lacquer": { "x": 105, "y": 240, "w": 102, "ch": 5, "s": ["400"] }, - "Laila": { - "x": 221, - "y": 240, - "w": 60, - "ch": 5, - "s": ["300", "400", "500", "600", "700"] - }, - "Lakki Reddy": { "x": 295, "y": 240, "w": 138, "ch": 5, "s": ["400"] }, - "Lalezar": { "x": 447, "y": 240, "w": 82, "ch": 5, "s": ["400"] }, - "Lancelot": { "x": 543, "y": 240, "w": 80, "ch": 5, "s": ["400"] }, - "Langar": { "x": 637, "y": 240, "w": 83, "ch": 5, "s": ["400"] }, - "Lateef": { - "x": 734, - "y": 240, - "w": 57, - "ch": 5, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Lato": { - "x": 805, - "y": 240, - "w": 55, - "ch": 5, - "s": [ - "100", - "100i", - "300", - "300i", - "400", - "400i", - "700", - "700i", - "900", - "900i" - ] - }, - "Lavishly Yours": { "x": 874, "y": 240, "w": 135, "ch": 5, "s": ["400"] }, - "League Gothic": { "x": 1023, "y": 240, "w": 97, "ch": 5, "s": ["400"] }, - "League Script": { "x": 0, "y": 280, "w": 156, "ch": 5, "s": ["400"] }, - "League Spartan": { - "x": 170, - "y": 280, - "w": 166, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Leckerli One": { "x": 350, "y": 280, "w": 144, "ch": 5, "s": ["400"] }, - "Ledger": { "x": 508, "y": 280, "w": 91, "ch": 5, "s": ["400"] }, - "Lekton": { - "x": 613, - "y": 280, - "w": 80, - "ch": 5, - "s": ["400", "400i", "700", "700i"] - }, - "Lemon": { "x": 707, "y": 280, "w": 100, "ch": 5, "s": ["400"] }, - "Lemonada": { - "x": 821, - "y": 280, - "w": 153, - "ch": 5, - "s": ["300", "400", "500", "600", "700"] - }, - "Lexend": { - "x": 988, - "y": 280, - "w": 93, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Lexend Deca": { - "x": 0, - "y": 320, - "w": 159, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Lexend Exa": { - "x": 173, - "y": 320, - "w": 176, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Lexend Giga": { - "x": 363, - "y": 320, - "w": 205, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Lexend Mega": { - "x": 582, - "y": 320, - "w": 223, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Lexend Peta": { - "x": 819, - "y": 320, - "w": 218, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Lexend Tera": { - "x": 0, - "y": 360, - "w": 221, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Lexend Zetta": { - "x": 235, - "y": 360, - "w": 260, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Libertinus Keyboard": { - "x": 509, - "y": 360, - "w": 490, - "ch": 5, - "s": ["400"] - }, - "Libertinus Math": { "x": 1013, "y": 360, "w": 166, "ch": 5, "s": ["400"] }, - "Libertinus Mono": { "x": 0, "y": 400, "w": 239, "ch": 5, "s": ["400"] }, - "Libertinus Sans": { - "x": 253, - "y": 400, - "w": 161, - "ch": 5, - "s": ["400", "400i", "700", "700i"] - }, - "Libertinus Serif": { - "x": 428, - "y": 400, - "w": 160, - "ch": 5, - "s": ["400", "400i", "600", "600i", "700", "700i"] - }, - "Libertinus Serif Display": { - "x": 602, - "y": 400, - "w": 234, - "ch": 5, - "s": ["400"] - }, - "Libre Barcode 128": { - "x": 850, - "y": 400, - "w": 143, - "ch": 5, - "s": ["400"] - }, - "Libre Barcode 128 Text": { - "x": 1007, - "y": 400, - "w": 183, - "ch": 5, - "s": ["400"] - }, - "Libre Barcode 39": { "x": 0, "y": 440, "w": 193, "ch": 5, "s": ["400"] }, - "Libre Barcode 39 Extended": { - "x": 207, - "y": 440, - "w": 492, - "ch": 5, - "s": ["400"] - }, - "Libre Barcode 39 Extended Text": { - "x": 0, - "y": 480, - "w": 584, - "ch": 5, - "s": ["400"] - }, - "Libre Barcode 39 Text": { - "x": 598, - "y": 480, - "w": 250, - "ch": 5, - "s": ["400"] - }, - "Libre Barcode EAN13 Text": { - "x": 862, - "y": 480, - "w": 87, - "ch": 5, - "s": ["400"] - }, - "Libre Baskerville": { - "x": 963, - "y": 480, - "w": 216, - "ch": 5, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Libre Bodoni": { - "x": 0, - "y": 520, - "w": 153, - "ch": 5, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Libre Caslon Display": { - "x": 167, - "y": 520, - "w": 197, - "ch": 5, - "s": ["400"] - }, - "Libre Caslon Text": { - "x": 378, - "y": 520, - "w": 210, - "ch": 5, - "s": ["400", "400i", "700", "700i"] - }, - "Libre Franklin": { - "x": 602, - "y": 520, - "w": 159, - "ch": 5, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Licorice": { "x": 775, "y": 520, "w": 60, "ch": 5, "s": ["400"] }, - "Life Savers": { - "x": 849, - "y": 520, - "w": 119, - "ch": 5, - "s": ["400", "700", "800"] - }, - "Lilex": { - "x": 982, - "y": 520, - "w": 80, - "ch": 5, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Lilita One": { "x": 1076, "y": 520, "w": 106, "ch": 5, "s": ["400"] }, - "Lily Script One": { "x": 0, "y": 560, "w": 156, "ch": 5, "s": ["400"] }, - "Limelight": { "x": 170, "y": 560, "w": 132, "ch": 5, "s": ["400"] }, - "Linden Hill": { - "x": 316, - "y": 560, - "w": 113, - "ch": 5, - "s": ["400", "400i"] - }, - "LINE Seed JP": { - "x": 443, - "y": 560, - "w": 169, - "ch": 5, - "s": ["100", "400", "700", "800"] - }, - "Linefont": { - "x": 626, - "y": 560, - "w": 28, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Lisu Bosa": { - "x": 668, - "y": 560, - "w": 106, - "ch": 5, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Liter": { "x": 788, "y": 560, "w": 56, "ch": 5, "s": ["400"] }, - "Literata": { - "x": 858, - "y": 560, - "w": 99, - "ch": 5, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Liu Jian Mao Cao": { "x": 971, "y": 560, "w": 164, "ch": 5, "s": ["400"] }, - "Livvic": { - "x": 0, - "y": 600, - "w": 66, - "ch": 5, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "900", - "900i" - ] - }, - "Lobster": { "x": 80, "y": 600, "w": 72, "ch": 5, "s": ["400"] }, - "Lobster Two": { - "x": 166, - "y": 600, - "w": 114, - "ch": 5, - "s": ["400", "400i", "700", "700i"] - }, - "Londrina Outline": { "x": 294, "y": 600, "w": 156, "ch": 5, "s": ["400"] }, - "Londrina Shadow": { "x": 464, "y": 600, "w": 165, "ch": 5, "s": ["400"] }, - "Londrina Sketch": { "x": 643, "y": 600, "w": 156, "ch": 5, "s": ["400"] }, - "Londrina Solid": { - "x": 813, - "y": 600, - "w": 136, - "ch": 5, - "s": ["100", "300", "400", "900"] - }, - "Long Cang": { "x": 963, "y": 600, "w": 98, "ch": 5, "s": ["400"] }, - "Lora": { - "x": 1075, - "y": 600, - "w": 59, - "ch": 5, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Love Light": { "x": 0, "y": 640, "w": 88, "ch": 5, "s": ["400"] }, - "Love Ya Like A Sister": { - "x": 102, - "y": 640, - "w": 235, - "ch": 5, - "s": ["400"] - }, - "Loved by the King": { - "x": 351, - "y": 640, - "w": 145, - "ch": 5, - "s": ["400"] - }, - "Lovers Quarrel": { "x": 510, "y": 640, "w": 92, "ch": 5, "s": ["400"] }, - "Luckiest Guy": { "x": 616, "y": 640, "w": 156, "ch": 5, "s": ["400"] }, - "Lugrasimo": { "x": 786, "y": 640, "w": 144, "ch": 5, "s": ["400"] }, - "Lumanosimo": { "x": 944, "y": 640, "w": 185, "ch": 5, "s": ["400"] }, - "Lunasima": { "x": 0, "y": 680, "w": 119, "ch": 5, "s": ["400", "700"] }, - "Lusitana": { "x": 133, "y": 680, "w": 96, "ch": 5, "s": ["400", "700"] }, - "Lustria": { "x": 243, "y": 680, "w": 86, "ch": 5, "s": ["400"] }, - "Luxurious Roman": { "x": 343, "y": 680, "w": 201, "ch": 5, "s": ["400"] }, - "Luxurious Script": { "x": 558, "y": 680, "w": 128, "ch": 5, "s": ["400"] }, - "LXGW Marker Gothic": { - "x": 700, - "y": 680, - "w": 233, - "ch": 5, - "s": ["400"] - }, - "LXGW WenKai Mono TC": { - "x": 947, - "y": 680, - "w": 236, - "ch": 5, - "s": ["300", "400", "700"] - }, - "LXGW WenKai TC": { - "x": 0, - "y": 720, - "w": 206, - "ch": 5, - "s": ["300", "400", "700"] - }, - "M PLUS 1": { - "x": 220, - "y": 720, - "w": 120, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "M PLUS 1 Code": { - "x": 354, - "y": 720, - "w": 164, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "M PLUS 1p": { - "x": 532, - "y": 720, - "w": 129, - "ch": 5, - "s": ["100", "300", "400", "500", "700", "800", "900"] - }, - "M PLUS 2": { - "x": 675, - "y": 720, - "w": 120, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "M PLUS Code Latin": { - "x": 809, - "y": 720, - "w": 212, - "ch": 5, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "M PLUS Rounded 1c": { - "x": 0, - "y": 760, - "w": 225, - "ch": 5, - "s": ["100", "300", "400", "500", "700", "800", "900"] - }, - "Ma Shan Zheng": { "x": 239, "y": 760, "w": 126, "ch": 5, "s": ["400"] }, - "Macondo": { "x": 379, "y": 760, "w": 100, "ch": 5, "s": ["400"] }, - "Macondo Swash Caps": { - "x": 493, - "y": 760, - "w": 228, - "ch": 5, - "s": ["400"] - }, - "Mada": { - "x": 735, - "y": 760, - "w": 63, - "ch": 5, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Madimi One": { "x": 812, "y": 760, "w": 133, "ch": 5, "s": ["400"] }, - "Magra": { "x": 959, "y": 760, "w": 70, "ch": 5, "s": ["400", "700"] }, - "Maiden Orange": { "x": 1043, "y": 760, "w": 127, "ch": 5, "s": ["400"] }, - "Maitree": { - "x": 0, - "y": 0, - "w": 96, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Major Mono Display": { "x": 110, "y": 0, "w": 328, "ch": 6, "s": ["400"] }, - "Mako": { "x": 452, "y": 0, "w": 67, "ch": 6, "s": ["400"] }, - "Mali": { - "x": 533, - "y": 0, - "w": 56, - "ch": 6, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Mallanna": { "x": 603, "y": 0, "w": 96, "ch": 6, "s": ["400"] }, - "Maname": { "x": 713, "y": 0, "w": 100, "ch": 6, "s": ["400"] }, - "Mandali": { "x": 827, "y": 0, "w": 94, "ch": 6, "s": ["400"] }, - "Manjari": { - "x": 935, - "y": 0, - "w": 87, - "ch": 6, - "s": ["100", "400", "700"] - }, - "Manrope": { - "x": 1036, - "y": 0, - "w": 107, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Mansalva": { "x": 0, "y": 40, "w": 111, "ch": 6, "s": ["400"] }, - "Manuale": { - "x": 125, - "y": 40, - "w": 101, - "ch": 6, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Manufacturing Consent": { - "x": 240, - "y": 40, - "w": 214, - "ch": 6, - "s": ["400"] - }, - "Marcellus": { "x": 468, "y": 40, "w": 114, "ch": 6, "s": ["400"] }, - "Marcellus SC": { "x": 596, "y": 40, "w": 157, "ch": 6, "s": ["400"] }, - "Marck Script": { "x": 767, "y": 40, "w": 137, "ch": 6, "s": ["400"] }, - "Margarine": { "x": 918, "y": 40, "w": 119, "ch": 6, "s": ["400"] }, - "Marhey": { - "x": 1051, - "y": 40, - "w": 107, - "ch": 6, - "s": ["300", "400", "500", "600", "700"] - }, - "Markazi Text": { - "x": 0, - "y": 80, - "w": 113, - "ch": 6, - "s": ["400", "500", "600", "700"] - }, - "Marko One": { "x": 127, "y": 80, "w": 152, "ch": 6, "s": ["400"] }, - "Marmelad": { "x": 293, "y": 80, "w": 118, "ch": 6, "s": ["400"] }, - "Martel": { - "x": 425, - "y": 80, - "w": 88, - "ch": 6, - "s": ["200", "300", "400", "600", "700", "800", "900"] - }, - "Martel Sans": { - "x": 527, - "y": 80, - "w": 143, - "ch": 6, - "s": ["200", "300", "400", "600", "700", "800", "900"] - }, - "Martian Mono": { - "x": 684, - "y": 80, - "w": 210, - "ch": 6, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Marvel": { - "x": 908, - "y": 80, - "w": 64, - "ch": 6, - "s": ["400", "400i", "700", "700i"] - }, - "Matangi": { - "x": 986, - "y": 80, - "w": 99, - "ch": 6, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Mate": { "x": 1099, "y": 80, "w": 61, "ch": 6, "s": ["400", "400i"] }, - "Mate SC": { "x": 0, "y": 120, "w": 99, "ch": 6, "s": ["400"] }, - "Matemasie": { "x": 113, "y": 120, "w": 145, "ch": 6, "s": ["400"] }, - "Material Icons": { "x": 272, "y": 120, "w": 344, "ch": 6, "s": ["400"] }, - "Material Icons Outlined": { - "x": 630, - "y": 120, - "w": 560, - "ch": 6, - "s": ["400"] - }, - "Material Icons Round": { - "x": 0, - "y": 160, - "w": 488, - "ch": 6, - "s": ["400"] - }, - "Material Icons Sharp": { - "x": 502, - "y": 160, - "w": 488, - "ch": 6, - "s": ["400"] - }, - "Material Icons Two Tone": { - "x": 0, - "y": 200, - "w": 560, - "ch": 6, - "s": ["400"] - }, - "Material Symbols": { - "x": 574, - "y": 200, - "w": 392, - "ch": 6, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Material Symbols Outlined": { - "x": 0, - "y": 240, - "w": 608, - "ch": 6, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Material Symbols Rounded": { - "x": 0, - "y": 280, - "w": 584, - "ch": 6, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Material Symbols Sharp": { - "x": 598, - "y": 280, - "w": 536, - "ch": 6, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Maven Pro": { - "x": 0, - "y": 320, - "w": 123, - "ch": 6, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "McLaren": { "x": 137, "y": 320, "w": 118, "ch": 6, "s": ["400"] }, - "Mea Culpa": { "x": 269, "y": 320, "w": 102, "ch": 6, "s": ["400"] }, - "Meddon": { "x": 385, "y": 320, "w": 129, "ch": 6, "s": ["400"] }, - "MedievalSharp": { "x": 528, "y": 320, "w": 170, "ch": 6, "s": ["400"] }, - "Medula One": { "x": 712, "y": 320, "w": 78, "ch": 6, "s": ["400"] }, - "Meera Inimai": { "x": 804, "y": 320, "w": 138, "ch": 6, "s": ["400"] }, - "Megrim": { "x": 956, "y": 320, "w": 87, "ch": 6, "s": ["400"] }, - "Meie Script": { "x": 1057, "y": 320, "w": 133, "ch": 6, "s": ["400"] }, - "Menbere": { - "x": 0, - "y": 360, - "w": 112, - "ch": 6, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Meow Script": { "x": 126, "y": 360, "w": 119, "ch": 6, "s": ["400"] }, - "Merienda": { - "x": 259, - "y": 360, - "w": 121, - "ch": 6, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Merienda One": { "x": 394, "y": 360, "w": 177, "ch": 6, "s": ["400"] }, - "Merriweather": { - "x": 585, - "y": 360, - "w": 168, - "ch": 6, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Merriweather Sans": { - "x": 767, - "y": 360, - "w": 223, - "ch": 6, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Metal": { "x": 1004, "y": 360, "w": 58, "ch": 6, "s": ["400"] }, - "Metal Mania": { "x": 1076, "y": 360, "w": 121, "ch": 6, "s": ["400"] }, - "Metamorphous": { "x": 0, "y": 400, "w": 210, "ch": 6, "s": ["400"] }, - "Metrophobic": { "x": 224, "y": 400, "w": 149, "ch": 6, "s": ["400"] }, - "Michroma": { "x": 387, "y": 400, "w": 161, "ch": 6, "s": ["400"] }, - "Micro 5": { "x": 562, "y": 400, "w": 65, "ch": 6, "s": ["400"] }, - "Micro 5 Charted": { "x": 641, "y": 400, "w": 126, "ch": 6, "s": ["400"] }, - "Milonga": { "x": 781, "y": 400, "w": 99, "ch": 6, "s": ["400"] }, - "Miltonian": { "x": 894, "y": 400, "w": 130, "ch": 6, "s": ["400"] }, - "Miltonian Tattoo": { "x": 0, "y": 440, "w": 214, "ch": 6, "s": ["400"] }, - "Mina": { "x": 228, "y": 440, "w": 58, "ch": 6, "s": ["400", "700"] }, - "Mingzat": { "x": 300, "y": 440, "w": 99, "ch": 6, "s": ["400"] }, - "Miniver": { "x": 413, "y": 440, "w": 89, "ch": 6, "s": ["400"] }, - "Miriam Libre": { - "x": 516, - "y": 440, - "w": 161, - "ch": 6, - "s": ["400", "500", "600", "700"] - }, - "Mirza": { - "x": 691, - "y": 440, - "w": 60, - "ch": 6, - "s": ["400", "500", "600", "700"] - }, - "Miss Fajardose": { "x": 765, "y": 440, "w": 108, "ch": 6, "s": ["400"] }, - "Mitr": { - "x": 887, - "y": 440, - "w": 55, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Mochiy Pop One": { "x": 956, "y": 440, "w": 223, "ch": 6, "s": ["400"] }, - "Mochiy Pop P One": { "x": 0, "y": 480, "w": 248, "ch": 6, "s": ["400"] }, - "Modak": { "x": 262, "y": 480, "w": 79, "ch": 6, "s": ["400"] }, - "Modern Antiqua": { "x": 355, "y": 480, "w": 196, "ch": 6, "s": ["400"] }, - "Moderustic": { - "x": 565, - "y": 480, - "w": 135, - "ch": 6, - "s": ["300", "400", "500", "600", "700", "800"] - }, - "Mogra": { "x": 714, "y": 480, "w": 80, "ch": 6, "s": ["400"] }, - "Mohave": { - "x": 808, - "y": 480, - "w": 77, - "ch": 6, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Moirai One": { "x": 899, "y": 480, "w": 146, "ch": 6, "s": ["400"] }, - "Molengo": { "x": 1059, "y": 480, "w": 96, "ch": 6, "s": ["400"] }, - "Momo Signature": { "x": 0, "y": 520, "w": 227, "ch": 6, "s": ["400"] }, - "Momo Trust Display": { - "x": 241, - "y": 520, - "w": 249, - "ch": 6, - "s": ["400"] - }, - "Momo Trust Sans": { - "x": 504, - "y": 520, - "w": 207, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Mona Sans": { - "x": 725, - "y": 520, - "w": 136, - "ch": 6, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Monda": { - "x": 875, - "y": 520, - "w": 85, - "ch": 6, - "s": ["400", "500", "600", "700"] - }, - "Monofett": { "x": 974, "y": 520, "w": 119, "ch": 6, "s": ["400"] }, - "Monomakh": { "x": 0, "y": 560, "w": 138, "ch": 6, "s": ["400"] }, - "Monomaniac One": { "x": 152, "y": 560, "w": 156, "ch": 6, "s": ["400"] }, - "Monoton": { "x": 322, "y": 560, "w": 143, "ch": 6, "s": ["400"] }, - "Monsieur La Doulaise": { - "x": 479, - "y": 560, - "w": 215, - "ch": 6, - "s": ["400"] - }, - "Montaga": { "x": 708, "y": 560, "w": 102, "ch": 6, "s": ["400"] }, - "Montagu Slab": { - "x": 824, - "y": 560, - "w": 173, - "ch": 6, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "MonteCarlo": { "x": 1011, "y": 560, "w": 107, "ch": 6, "s": ["400"] }, - "Montez": { "x": 1132, "y": 560, "w": 66, "ch": 6, "s": ["400"] }, - "Montserrat": { - "x": 0, - "y": 600, - "w": 141, - "ch": 6, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Montserrat Alternates": { - "x": 155, - "y": 600, - "w": 282, - "ch": 6, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Montserrat Subrayada": { - "x": 451, - "y": 600, - "w": 347, - "ch": 6, - "s": ["400", "700"] - }, - "Montserrat Underline": { - "x": 812, - "y": 600, - "w": 266, - "ch": 6, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Moo Lah Lah": { "x": 0, "y": 640, "w": 137, "ch": 6, "s": ["400"] }, - "Mooli": { "x": 151, "y": 640, "w": 77, "ch": 6, "s": ["400"] }, - "Moon Dance": { "x": 242, "y": 640, "w": 106, "ch": 6, "s": ["400"] }, - "Moul": { "x": 362, "y": 640, "w": 82, "ch": 6, "s": ["400"] }, - "Moulpali": { "x": 458, "y": 640, "w": 90, "ch": 6, "s": ["400"] }, - "Mountains of Christmas": { - "x": 562, - "y": 640, - "w": 219, - "ch": 6, - "s": ["400", "700"] - }, - "Mouse Memoirs": { "x": 795, "y": 640, "w": 116, "ch": 6, "s": ["400"] }, - "Mozilla Headline": { - "x": 925, - "y": 640, - "w": 192, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Mozilla Text": { - "x": 0, - "y": 680, - "w": 148, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Mr Bedfort": { "x": 162, "y": 680, "w": 124, "ch": 6, "s": ["400"] }, - "Mr Dafoe": { "x": 300, "y": 680, "w": 92, "ch": 6, "s": ["400"] }, - "Mr De Haviland": { "x": 406, "y": 680, "w": 115, "ch": 6, "s": ["400"] }, - "Mrs Saint Delafield": { - "x": 535, - "y": 680, - "w": 159, - "ch": 6, - "s": ["400"] - }, - "Mrs Sheppards": { "x": 708, "y": 680, "w": 139, "ch": 6, "s": ["400"] }, - "Ms Madi": { "x": 861, "y": 680, "w": 89, "ch": 6, "s": ["400"] }, - "Mukta": { - "x": 964, - "y": 680, - "w": 73, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Mukta Mahee": { - "x": 1051, - "y": 680, - "w": 146, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Mukta Malar": { - "x": 0, - "y": 720, - "w": 137, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Mukta Vaani": { - "x": 151, - "y": 720, - "w": 133, - "ch": 6, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Mulish": { - "x": 298, - "y": 720, - "w": 80, - "ch": 6, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Murecho": { - "x": 392, - "y": 720, - "w": 102, - "ch": 6, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "MuseoModerno": { - "x": 508, - "y": 720, - "w": 199, - "ch": 6, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "My Soul": { "x": 721, "y": 720, "w": 107, "ch": 6, "s": ["400"] }, - "Mynerve": { "x": 842, "y": 720, "w": 104, "ch": 6, "s": ["400"] }, - "Mystery Quest": { "x": 960, "y": 720, "w": 152, "ch": 6, "s": ["400"] }, - "Nabla": { "x": 1126, "y": 720, "w": 72, "ch": 6, "s": ["400"] }, - "Namdhinggo": { - "x": 0, - "y": 760, - "w": 130, - "ch": 6, - "s": ["400", "500", "600", "700", "800"] - }, - "Nanum Brush Script": { - "x": 144, - "y": 760, - "w": 168, - "ch": 6, - "s": ["400"] - }, - "Nanum Gothic": { - "x": 326, - "y": 760, - "w": 171, - "ch": 6, - "s": ["400", "700", "800"] - }, - "Nanum Gothic Coding": { - "x": 511, - "y": 760, - "w": 236, - "ch": 6, - "s": ["400", "700"] - }, - "Nanum Myeongjo": { - "x": 761, - "y": 760, - "w": 201, - "ch": 6, - "s": ["400", "700", "800"] - }, - "Nanum Pen Script": { "x": 976, "y": 760, "w": 157, "ch": 6, "s": ["400"] }, - "Narnoor": { - "x": 0, - "y": 0, - "w": 90, - "ch": 7, - "s": ["400", "500", "600", "700", "800"] - }, - "Nata Sans": { - "x": 104, - "y": 0, - "w": 123, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "National Park": { - "x": 241, - "y": 0, - "w": 149, - "ch": 7, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Neonderthaw": { "x": 404, "y": 0, "w": 139, "ch": 7, "s": ["400"] }, - "Nerko One": { "x": 557, "y": 0, "w": 107, "ch": 7, "s": ["400"] }, - "Neucha": { "x": 678, "y": 0, "w": 72, "ch": 7, "s": ["400"] }, - "Neuton": { - "x": 764, - "y": 0, - "w": 76, - "ch": 7, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "700", - "700i", - "800", - "800i" - ] - }, - "New Amsterdam": { "x": 854, "y": 0, "w": 139, "ch": 7, "s": ["400"] }, - "New Rocker": { "x": 1007, "y": 0, "w": 133, "ch": 7, "s": ["400"] }, - "New Tegomin": { "x": 0, "y": 40, "w": 159, "ch": 7, "s": ["400"] }, - "News Cycle": { "x": 173, "y": 40, "w": 116, "ch": 7, "s": ["400", "700"] }, - "Newsreader": { - "x": 303, - "y": 40, - "w": 129, - "ch": 7, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Niconne": { "x": 446, "y": 40, "w": 79, "ch": 7, "s": ["400"] }, - "Niramit": { - "x": 539, - "y": 40, - "w": 84, - "ch": 7, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Nixie One": { "x": 637, "y": 40, "w": 123, "ch": 7, "s": ["400"] }, - "Nobile": { - "x": 774, - "y": 40, - "w": 82, - "ch": 7, - "s": ["400", "400i", "500", "500i", "700", "700i"] - }, - "Nokora": { - "x": 870, - "y": 40, - "w": 91, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Norican": { "x": 975, "y": 40, "w": 78, "ch": 7, "s": ["400"] }, - "Nosifer": { "x": 0, "y": 80, "w": 154, "ch": 7, "s": ["400"] }, - "Notable": { "x": 168, "y": 80, "w": 144, "ch": 7, "s": ["400"] }, - "Nothing You Could Do": { - "x": 326, - "y": 80, - "w": 248, - "ch": 7, - "s": ["400"] - }, - "Noticia Text": { - "x": 588, - "y": 80, - "w": 142, - "ch": 7, - "s": ["400", "400i", "700", "700i"] - }, - "Noto Kufi Arabic": { - "x": 744, - "y": 80, - "w": 196, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Music": { "x": 954, "y": 80, "w": 136, "ch": 7, "s": ["400"] }, - "Noto Naskh Arabic": { - "x": 0, - "y": 120, - "w": 221, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Nastaliq Urdu": { - "x": 235, - "y": 120, - "w": 222, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Rashi Hebrew": { - "x": 471, - "y": 120, - "w": 230, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans": { - "x": 715, - "y": 120, - "w": 124, - "ch": 7, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Noto Sans Adlam": { - "x": 853, - "y": 120, - "w": 202, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Adlam Unjoined": { - "x": 0, - "y": 160, - "w": 310, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Anatolian Hieroglyphs": { - "x": 324, - "y": 160, - "w": 380, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Arabic": { - "x": 718, - "y": 160, - "w": 201, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Armenian": { - "x": 933, - "y": 160, - "w": 240, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Avestan": { "x": 0, "y": 200, "w": 219, "ch": 7, "s": ["400"] }, - "Noto Sans Balinese": { - "x": 233, - "y": 200, - "w": 225, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Bamum": { - "x": 472, - "y": 200, - "w": 219, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Bassa Vah": { - "x": 705, - "y": 200, - "w": 250, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Batak": { "x": 969, "y": 200, "w": 194, "ch": 7, "s": ["400"] }, - "Noto Sans Bengali": { - "x": 0, - "y": 240, - "w": 214, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Bhaiksuki": { - "x": 228, - "y": 240, - "w": 236, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Brahmi": { "x": 478, "y": 240, "w": 212, "ch": 7, "s": ["400"] }, - "Noto Sans Buginese": { - "x": 704, - "y": 240, - "w": 235, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Buhid": { "x": 953, "y": 240, "w": 196, "ch": 7, "s": ["400"] }, - "Noto Sans Canadian Aboriginal": { - "x": 0, - "y": 280, - "w": 361, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Carian": { "x": 375, "y": 280, "w": 203, "ch": 7, "s": ["400"] }, - "Noto Sans Caucasian Albanian": { - "x": 592, - "y": 280, - "w": 353, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Chakma": { "x": 959, "y": 280, "w": 222, "ch": 7, "s": ["400"] }, - "Noto Sans Cham": { - "x": 0, - "y": 320, - "w": 196, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Cherokee": { - "x": 210, - "y": 320, - "w": 238, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Chorasmian": { - "x": 462, - "y": 320, - "w": 268, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Coptic": { "x": 744, "y": 320, "w": 201, "ch": 7, "s": ["400"] }, - "Noto Sans Cuneiform": { - "x": 0, - "y": 360, - "w": 250, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Cypriot": { - "x": 264, - "y": 360, - "w": 211, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Cypro Minoan": { - "x": 489, - "y": 360, - "w": 288, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Deseret": { - "x": 791, - "y": 360, - "w": 218, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Devanagari": { - "x": 0, - "y": 400, - "w": 259, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Display": { - "x": 273, - "y": 400, - "w": 200, - "ch": 7, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Noto Sans Duployan": { - "x": 487, - "y": 400, - "w": 238, - "ch": 7, - "s": ["400", "700"] - }, - "Noto Sans Egyptian Hieroglyphs": { - "x": 739, - "y": 400, - "w": 369, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Elbasan": { "x": 0, "y": 440, "w": 217, "ch": 7, "s": ["400"] }, - "Noto Sans Elymaic": { - "x": 231, - "y": 440, - "w": 222, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Ethiopic": { - "x": 467, - "y": 440, - "w": 220, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Georgian": { - "x": 701, - "y": 440, - "w": 234, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Glagolitic": { - "x": 949, - "y": 440, - "w": 235, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Gothic": { "x": 0, "y": 480, "w": 203, "ch": 7, "s": ["400"] }, - "Noto Sans Grantha": { - "x": 217, - "y": 480, - "w": 222, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Gujarati": { - "x": 453, - "y": 480, - "w": 220, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Gunjala Gondi": { - "x": 687, - "y": 480, - "w": 291, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Gurmukhi": { - "x": 0, - "y": 520, - "w": 243, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Hanifi Rohingya": { - "x": 257, - "y": 520, - "w": 309, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Hanunoo": { - "x": 580, - "y": 520, - "w": 235, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Hatran": { "x": 829, "y": 520, "w": 208, "ch": 7, "s": ["400"] }, - "Noto Sans Hebrew": { - "x": 0, - "y": 560, - "w": 217, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans HK": { - "x": 231, - "y": 560, - "w": 160, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Imperial Aramaic": { - "x": 405, - "y": 560, - "w": 323, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Indic Siyaq Numbers": { - "x": 742, - "y": 560, - "w": 351, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Inscriptional Pahlavi": { - "x": 0, - "y": 600, - "w": 358, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Inscriptional Parthian": { - "x": 372, - "y": 600, - "w": 373, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Javanese": { - "x": 759, - "y": 600, - "w": 229, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans JP": { - "x": 1002, - "y": 600, - "w": 155, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Kaithi": { "x": 0, "y": 640, "w": 195, "ch": 7, "s": ["400"] }, - "Noto Sans Kannada": { - "x": 209, - "y": 640, - "w": 231, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Kawi": { - "x": 454, - "y": 640, - "w": 180, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Kayah Li": { - "x": 648, - "y": 640, - "w": 224, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Kharoshthi": { - "x": 886, - "y": 640, - "w": 253, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Khmer": { - "x": 0, - "y": 680, - "w": 205, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Khojki": { "x": 219, "y": 680, "w": 199, "ch": 7, "s": ["400"] }, - "Noto Sans Khudawadi": { - "x": 432, - "y": 680, - "w": 256, - "ch": 7, - "s": ["400"] - }, - "Noto Sans KR": { - "x": 702, - "y": 680, - "w": 158, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Lao": { - "x": 874, - "y": 680, - "w": 170, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Lao Looped": { - "x": 0, - "y": 720, - "w": 261, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Lepcha": { "x": 275, "y": 720, "w": 211, "ch": 7, "s": ["400"] }, - "Noto Sans Limbu": { "x": 500, "y": 720, "w": 201, "ch": 7, "s": ["400"] }, - "Noto Sans Linear A": { - "x": 715, - "y": 720, - "w": 222, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Linear B": { - "x": 951, - "y": 720, - "w": 222, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Lisu": { - "x": 0, - "y": 760, - "w": 175, - "ch": 7, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Lydian": { "x": 189, "y": 760, "w": 204, "ch": 7, "s": ["400"] }, - "Noto Sans Mahajani": { - "x": 407, - "y": 760, - "w": 234, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Malayalam": { - "x": 655, - "y": 760, - "w": 255, - "ch": 7, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Mandaic": { - "x": 924, - "y": 760, - "w": 226, - "ch": 7, - "s": ["400"] - }, - "Noto Sans Manichaean": { "x": 0, "y": 0, "w": 268, "ch": 8, "s": ["400"] }, - "Noto Sans Marchen": { "x": 282, "y": 0, "w": 227, "ch": 8, "s": ["400"] }, - "Noto Sans Masaram Gondi": { - "x": 523, - "y": 0, - "w": 318, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Math": { "x": 855, "y": 0, "w": 189, "ch": 8, "s": ["400"] }, - "Noto Sans Mayan Numerals": { - "x": 0, - "y": 40, - "w": 322, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Medefaidrin": { - "x": 336, - "y": 40, - "w": 267, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Meetei Mayek": { - "x": 617, - "y": 40, - "w": 289, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Mende Kikakui": { - "x": 0, - "y": 80, - "w": 296, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Meroitic": { - "x": 310, - "y": 80, - "w": 222, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Miao": { "x": 546, "y": 80, "w": 186, "ch": 8, "s": ["400"] }, - "Noto Sans Modi": { "x": 746, "y": 80, "w": 187, "ch": 8, "s": ["400"] }, - "Noto Sans Mongolian": { - "x": 947, - "y": 80, - "w": 251, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Mono": { - "x": 0, - "y": 120, - "w": 210, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Mro": { "x": 224, "y": 120, "w": 176, "ch": 8, "s": ["400"] }, - "Noto Sans Multani": { - "x": 414, - "y": 120, - "w": 216, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Myanmar": { - "x": 644, - "y": 120, - "w": 238, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Nabataean": { - "x": 896, - "y": 120, - "w": 254, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Nag Mundari": { - "x": 0, - "y": 160, - "w": 274, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Nandinagari": { - "x": 288, - "y": 160, - "w": 272, - "ch": 8, - "s": ["400"] - }, - "Noto Sans New Tai Lue": { - "x": 574, - "y": 160, - "w": 265, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Newa": { "x": 853, "y": 160, "w": 194, "ch": 8, "s": ["400"] }, - "Noto Sans NKo": { "x": 0, "y": 200, "w": 178, "ch": 8, "s": ["400"] }, - "Noto Sans NKo Unjoined": { - "x": 192, - "y": 200, - "w": 286, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Nushu": { "x": 492, "y": 200, "w": 204, "ch": 8, "s": ["400"] }, - "Noto Sans Ogham": { "x": 710, "y": 200, "w": 214, "ch": 8, "s": ["400"] }, - "Noto Sans Ol Chiki": { - "x": 938, - "y": 200, - "w": 216, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Old Hungarian": { - "x": 0, - "y": 240, - "w": 296, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Old Italic": { - "x": 310, - "y": 240, - "w": 230, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Old North Arabian": { - "x": 554, - "y": 240, - "w": 336, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Old Permic": { - "x": 904, - "y": 240, - "w": 253, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Old Persian": { - "x": 0, - "y": 280, - "w": 260, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Old Sogdian": { - "x": 274, - "y": 280, - "w": 260, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Old South Arabian": { - "x": 548, - "y": 280, - "w": 336, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Old Turkic": { - "x": 898, - "y": 280, - "w": 243, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Oriya": { - "x": 0, - "y": 320, - "w": 190, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Osage": { "x": 204, "y": 320, "w": 202, "ch": 8, "s": ["400"] }, - "Noto Sans Osmanya": { - "x": 420, - "y": 320, - "w": 238, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Pahawh Hmong": { - "x": 672, - "y": 320, - "w": 310, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Palmyrene": { - "x": 0, - "y": 360, - "w": 251, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Pau Cin Hau": { - "x": 265, - "y": 360, - "w": 269, - "ch": 8, - "s": ["400"] - }, - "Noto Sans PhagsPa": { - "x": 548, - "y": 360, - "w": 227, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Phoenician": { - "x": 789, - "y": 360, - "w": 254, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Psalter Pahlavi": { - "x": 0, - "y": 400, - "w": 295, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Rejang": { "x": 309, "y": 400, "w": 208, "ch": 8, "s": ["400"] }, - "Noto Sans Runic": { "x": 531, "y": 400, "w": 192, "ch": 8, "s": ["400"] }, - "Noto Sans Samaritan": { - "x": 737, - "y": 400, - "w": 245, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Saurashtra": { - "x": 0, - "y": 440, - "w": 254, - "ch": 8, - "s": ["400"] - }, - "Noto Sans SC": { - "x": 268, - "y": 440, - "w": 157, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Sharada": { - "x": 439, - "y": 440, - "w": 222, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Shavian": { - "x": 675, - "y": 440, - "w": 218, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Siddham": { - "x": 907, - "y": 440, - "w": 227, - "ch": 8, - "s": ["400"] - }, - "Noto Sans SignWriting": { - "x": 0, - "y": 480, - "w": 297, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Sinhala": { - "x": 311, - "y": 480, - "w": 224, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Sogdian": { - "x": 549, - "y": 480, - "w": 216, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Sora Sompeng": { - "x": 779, - "y": 480, - "w": 295, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Soyombo": { "x": 0, "y": 520, "w": 236, "ch": 8, "s": ["400"] }, - "Noto Sans Sundanese": { - "x": 250, - "y": 520, - "w": 254, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Sunuwar": { - "x": 518, - "y": 520, - "w": 237, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Syloti Nagri": { - "x": 769, - "y": 520, - "w": 260, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Symbols": { - "x": 0, - "y": 560, - "w": 225, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Symbols 2": { - "x": 239, - "y": 560, - "w": 257, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Syriac": { - "x": 510, - "y": 560, - "w": 196, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Syriac Eastern": { - "x": 720, - "y": 560, - "w": 288, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Syriac Western": { - "x": 0, - "y": 600, - "w": 296, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Tagalog": { - "x": 310, - "y": 600, - "w": 218, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Tagbanwa": { - "x": 542, - "y": 600, - "w": 247, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Tai Le": { "x": 803, "y": 600, "w": 193, "ch": 8, "s": ["400"] }, - "Noto Sans Tai Tham": { - "x": 0, - "y": 640, - "w": 243, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Tai Viet": { - "x": 257, - "y": 640, - "w": 210, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Takri": { "x": 481, "y": 640, "w": 184, "ch": 8, "s": ["400"] }, - "Noto Sans Tamil": { - "x": 679, - "y": 640, - "w": 190, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Tamil Supplement": { - "x": 0, - "y": 680, - "w": 334, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Tangsa": { - "x": 348, - "y": 680, - "w": 209, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans TC": { - "x": 571, - "y": 680, - "w": 156, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Telugu": { - "x": 741, - "y": 680, - "w": 207, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Thaana": { - "x": 962, - "y": 680, - "w": 213, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Thai": { - "x": 0, - "y": 720, - "w": 178, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Thai Looped": { - "x": 192, - "y": 720, - "w": 269, - "ch": 8, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Sans Tifinagh": { - "x": 475, - "y": 720, - "w": 222, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Tirhuta": { - "x": 711, - "y": 720, - "w": 211, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Ugaritic": { - "x": 936, - "y": 720, - "w": 218, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Vai": { "x": 0, "y": 760, "w": 164, "ch": 8, "s": ["400"] }, - "Noto Sans Vithkuqi": { - "x": 178, - "y": 760, - "w": 223, - "ch": 8, - "s": ["400", "500", "600", "700"] - }, - "Noto Sans Wancho": { "x": 415, "y": 760, "w": 228, "ch": 8, "s": ["400"] }, - "Noto Sans Warang Citi": { - "x": 657, - "y": 760, - "w": 264, - "ch": 8, - "s": ["400"] - }, - "Noto Sans Yi": { "x": 935, "y": 760, "w": 149, "ch": 8, "s": ["400"] }, - "Noto Sans Zanabazar Square": { - "x": 0, - "y": 0, - "w": 334, - "ch": 9, - "s": ["400"] - }, - "Noto Serif": { - "x": 348, - "y": 0, - "w": 123, - "ch": 9, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Noto Serif Ahom": { "x": 485, "y": 0, "w": 196, "ch": 9, "s": ["400"] }, - "Noto Serif Armenian": { - "x": 695, - "y": 0, - "w": 245, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Balinese": { - "x": 954, - "y": 0, - "w": 225, - "ch": 9, - "s": ["400"] - }, - "Noto Serif Bengali": { - "x": 0, - "y": 40, - "w": 215, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Devanagari": { - "x": 229, - "y": 40, - "w": 261, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Display": { - "x": 504, - "y": 40, - "w": 212, - "ch": 9, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Noto Serif Dives Akuru": { - "x": 730, - "y": 40, - "w": 274, - "ch": 9, - "s": ["400"] - }, - "Noto Serif Dogra": { "x": 0, "y": 80, "w": 197, "ch": 9, "s": ["400"] }, - "Noto Serif Ethiopic": { - "x": 211, - "y": 80, - "w": 224, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Georgian": { - "x": 449, - "y": 80, - "w": 234, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Grantha": { - "x": 697, - "y": 80, - "w": 223, - "ch": 9, - "s": ["400"] - }, - "Noto Serif Gujarati": { - "x": 934, - "y": 80, - "w": 225, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Gurmukhi": { - "x": 0, - "y": 120, - "w": 248, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Hebrew": { - "x": 262, - "y": 120, - "w": 221, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Hentaigana": { - "x": 497, - "y": 120, - "w": 269, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif HK": { - "x": 780, - "y": 120, - "w": 170, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif JP": { - "x": 964, - "y": 120, - "w": 157, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Kannada": { - "x": 0, - "y": 160, - "w": 231, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Khitan Small Script": { - "x": 245, - "y": 160, - "w": 383, - "ch": 9, - "s": ["400"] - }, - "Noto Serif Khmer": { - "x": 642, - "y": 160, - "w": 208, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Khojki": { - "x": 864, - "y": 160, - "w": 204, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Noto Serif KR": { - "x": 0, - "y": 200, - "w": 167, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Lao": { - "x": 181, - "y": 200, - "w": 171, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Makasar": { - "x": 366, - "y": 200, - "w": 226, - "ch": 9, - "s": ["400"] - }, - "Noto Serif Malayalam": { - "x": 606, - "y": 200, - "w": 259, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif NP Hmong": { - "x": 879, - "y": 200, - "w": 252, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Noto Serif Old Uyghur": { - "x": 0, - "y": 240, - "w": 257, - "ch": 9, - "s": ["400"] - }, - "Noto Serif Oriya": { - "x": 271, - "y": 240, - "w": 200, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Noto Serif Ottoman Siyaq": { - "x": 485, - "y": 240, - "w": 298, - "ch": 9, - "s": ["400"] - }, - "Noto Serif SC": { - "x": 797, - "y": 240, - "w": 162, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Sinhala": { - "x": 973, - "y": 240, - "w": 227, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Tamil": { - "x": 0, - "y": 280, - "w": 194, - "ch": 9, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Noto Serif Tangut": { - "x": 208, - "y": 280, - "w": 220, - "ch": 9, - "s": ["400"] - }, - "Noto Serif TC": { - "x": 442, - "y": 280, - "w": 164, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Telugu": { - "x": 620, - "y": 280, - "w": 207, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Thai": { - "x": 841, - "y": 280, - "w": 180, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Tibetan": { - "x": 0, - "y": 320, - "w": 217, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Noto Serif Todhri": { - "x": 231, - "y": 320, - "w": 201, - "ch": 9, - "s": ["400"] - }, - "Noto Serif Toto": { - "x": 446, - "y": 320, - "w": 179, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Noto Serif Vithkuqi": { - "x": 639, - "y": 320, - "w": 228, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Noto Serif Yezidi": { - "x": 881, - "y": 320, - "w": 198, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Noto Traditional Nushu": { - "x": 0, - "y": 360, - "w": 289, - "ch": 9, - "s": ["300", "400", "500", "600", "700"] - }, - "Noto Znamenny Musical Notation": { - "x": 303, - "y": 360, - "w": 388, - "ch": 9, - "s": ["400"] - }, - "Nova Cut": { "x": 705, "y": 360, "w": 108, "ch": 9, "s": ["400"] }, - "Nova Flat": { "x": 827, "y": 360, "w": 112, "ch": 9, "s": ["400"] }, - "Nova Mono": { "x": 953, "y": 360, "w": 130, "ch": 9, "s": ["400"] }, - "Nova Oval": { "x": 0, "y": 400, "w": 123, "ch": 9, "s": ["400"] }, - "Nova Round": { "x": 137, "y": 400, "w": 140, "ch": 9, "s": ["400"] }, - "Nova Script": { "x": 291, "y": 400, "w": 140, "ch": 9, "s": ["400"] }, - "Nova Slim": { "x": 445, "y": 400, "w": 121, "ch": 9, "s": ["400"] }, - "Nova Square": { "x": 580, "y": 400, "w": 148, "ch": 9, "s": ["400"] }, - "NTR": { "x": 742, "y": 400, "w": 49, "ch": 9, "s": ["400"] }, - "Numans": { "x": 805, "y": 400, "w": 113, "ch": 9, "s": ["400"] }, - "Nunito": { - "x": 932, - "y": 400, - "w": 81, - "ch": 9, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Nunito Sans": { - "x": 1027, - "y": 400, - "w": 139, - "ch": 9, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Nuosu SIL": { "x": 0, "y": 440, "w": 117, "ch": 9, "s": ["400"] }, - "Odibee Sans": { "x": 131, "y": 440, "w": 95, "ch": 9, "s": ["400"] }, - "Odor Mean Chey": { "x": 240, "y": 440, "w": 184, "ch": 9, "s": ["400"] }, - "Offside": { "x": 438, "y": 440, "w": 96, "ch": 9, "s": ["400"] }, - "Oi": { "x": 548, "y": 440, "w": 47, "ch": 9, "s": ["400"] }, - "Ojuju": { - "x": 609, - "y": 440, - "w": 62, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Old Standard TT": { - "x": 685, - "y": 440, - "w": 187, - "ch": 9, - "s": ["400", "400i", "700", "700i"] - }, - "Oldenburg": { "x": 886, "y": 440, "w": 136, "ch": 9, "s": ["400"] }, - "Ole": { "x": 1036, "y": 440, "w": 33, "ch": 9, "s": ["400"] }, - "Oleo Script": { - "x": 1083, - "y": 440, - "w": 109, - "ch": 9, - "s": ["400", "700"] - }, - "Oleo Script Swash Caps": { - "x": 0, - "y": 480, - "w": 227, - "ch": 9, - "s": ["400", "700"] - }, - "Onest": { - "x": 241, - "y": 480, - "w": 76, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Oooh Baby": { "x": 331, "y": 480, "w": 109, "ch": 9, "s": ["400"] }, - "Open Sans": { - "x": 454, - "y": 480, - "w": 129, - "ch": 9, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Oranienbaum": { "x": 597, "y": 480, "w": 137, "ch": 9, "s": ["400"] }, - "Orbit": { "x": 748, "y": 480, "w": 80, "ch": 9, "s": ["400"] }, - "Orbitron": { - "x": 842, - "y": 480, - "w": 117, - "ch": 9, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Oregano": { "x": 973, "y": 480, "w": 78, "ch": 9, "s": ["400", "400i"] }, - "Orelega One": { "x": 0, "y": 520, "w": 138, "ch": 9, "s": ["400"] }, - "Orienta": { "x": 152, "y": 520, "w": 94, "ch": 9, "s": ["400"] }, - "Original Surfer": { "x": 260, "y": 520, "w": 175, "ch": 9, "s": ["400"] }, - "Oswald": { - "x": 449, - "y": 520, - "w": 70, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Outfit": { - "x": 533, - "y": 520, - "w": 71, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Over the Rainbow": { "x": 618, "y": 520, "w": 189, "ch": 9, "s": ["400"] }, - "Overlock": { - "x": 821, - "y": 520, - "w": 95, - "ch": 9, - "s": ["400", "400i", "700", "700i", "900", "900i"] - }, - "Overlock SC": { "x": 930, "y": 520, "w": 139, "ch": 9, "s": ["400"] }, - "Overpass": { - "x": 1083, - "y": 520, - "w": 109, - "ch": 9, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Overpass Mono": { - "x": 0, - "y": 560, - "w": 201, - "ch": 9, - "s": ["300", "400", "500", "600", "700"] - }, - "Ovo": { "x": 215, "y": 560, "w": 52, "ch": 9, "s": ["400"] }, - "Oxanium": { - "x": 281, - "y": 560, - "w": 106, - "ch": 9, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Oxygen": { - "x": 401, - "y": 560, - "w": 92, - "ch": 9, - "s": ["300", "400", "700"] - }, - "Oxygen Mono": { "x": 507, "y": 560, "w": 167, "ch": 9, "s": ["400"] }, - "Pacifico": { "x": 688, "y": 560, "w": 87, "ch": 9, "s": ["400"] }, - "Padauk": { "x": 789, "y": 560, "w": 79, "ch": 9, "s": ["400", "700"] }, - "Padyakke Expanded One": { - "x": 0, - "y": 600, - "w": 415, - "ch": 9, - "s": ["400"] - }, - "Palanquin": { - "x": 429, - "y": 600, - "w": 111, - "ch": 9, - "s": ["100", "200", "300", "400", "500", "600", "700"] - }, - "Palanquin Dark": { - "x": 554, - "y": 600, - "w": 172, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Palette Mosaic": { "x": 740, "y": 600, "w": 212, "ch": 9, "s": ["400"] }, - "Pangolin": { "x": 966, "y": 600, "w": 93, "ch": 9, "s": ["400"] }, - "Paprika": { "x": 1073, "y": 600, "w": 105, "ch": 9, "s": ["400"] }, - "Parastoo": { - "x": 0, - "y": 640, - "w": 82, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Parisienne": { "x": 96, "y": 640, "w": 103, "ch": 9, "s": ["400"] }, - "Parkinsans": { - "x": 213, - "y": 640, - "w": 139, - "ch": 9, - "s": ["300", "400", "500", "600", "700", "800"] - }, - "Passero One": { "x": 366, "y": 640, "w": 125, "ch": 9, "s": ["400"] }, - "Passion One": { - "x": 505, - "y": 640, - "w": 114, - "ch": 9, - "s": ["400", "700", "900"] - }, - "Passions Conflict": { - "x": 633, - "y": 640, - "w": 109, - "ch": 9, - "s": ["400"] - }, - "Pathway Extreme": { - "x": 756, - "y": 640, - "w": 214, - "ch": 9, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Pathway Gothic One": { - "x": 984, - "y": 640, - "w": 154, - "ch": 9, - "s": ["400"] - }, - "Patrick Hand": { "x": 0, "y": 680, "w": 118, "ch": 9, "s": ["400"] }, - "Patrick Hand SC": { "x": 132, "y": 680, "w": 154, "ch": 9, "s": ["400"] }, - "Pattaya": { "x": 300, "y": 680, "w": 85, "ch": 9, "s": ["400"] }, - "Patua One": { "x": 399, "y": 680, "w": 117, "ch": 9, "s": ["400"] }, - "Pavanam": { "x": 530, "y": 680, "w": 97, "ch": 9, "s": ["400"] }, - "Paytone One": { "x": 641, "y": 680, "w": 164, "ch": 9, "s": ["400"] }, - "Peddana": { "x": 819, "y": 680, "w": 67, "ch": 9, "s": ["400"] }, - "Peralta": { "x": 900, "y": 680, "w": 108, "ch": 9, "s": ["400"] }, - "Permanent Marker": { "x": 0, "y": 720, "w": 234, "ch": 9, "s": ["400"] }, - "Petemoss": { "x": 248, "y": 720, "w": 60, "ch": 9, "s": ["400"] }, - "Petit Formal Script": { - "x": 322, - "y": 720, - "w": 255, - "ch": 9, - "s": ["400"] - }, - "Petrona": { - "x": 591, - "y": 720, - "w": 89, - "ch": 9, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Philosopher": { - "x": 694, - "y": 720, - "w": 129, - "ch": 9, - "s": ["400", "400i", "700", "700i"] - }, - "Phudu": { - "x": 837, - "y": 720, - "w": 76, - "ch": 9, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Piazzolla": { - "x": 927, - "y": 720, - "w": 107, - "ch": 9, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Piedra": { "x": 1048, "y": 720, "w": 68, "ch": 9, "s": ["400"] }, - "Pinyon Script": { "x": 0, "y": 760, "w": 128, "ch": 9, "s": ["400"] }, - "Pirata One": { "x": 142, "y": 760, "w": 92, "ch": 9, "s": ["400"] }, - "Pixelify Sans": { - "x": 248, - "y": 760, - "w": 153, - "ch": 9, - "s": ["400", "500", "600", "700"] - }, - "Plaster": { "x": 415, "y": 760, "w": 126, "ch": 9, "s": ["400"] }, - "Platypi": { - "x": 555, - "y": 760, - "w": 90, - "ch": 9, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Play": { "x": 659, "y": 760, "w": 52, "ch": 9, "s": ["400", "700"] }, - "Playball": { "x": 725, "y": 760, "w": 83, "ch": 9, "s": ["400"] }, - "Playfair": { - "x": 822, - "y": 760, - "w": 90, - "ch": 9, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Playfair Display": { - "x": 926, - "y": 760, - "w": 176, - "ch": 9, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Playfair Display SC": { - "x": 0, - "y": 0, - "w": 247, - "ch": 10, - "s": ["400", "400i", "700", "700i", "900", "900i"] - }, - "Playpen Sans": { - "x": 261, - "y": 0, - "w": 161, - "ch": 10, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Playpen Sans Arabic": { - "x": 436, - "y": 0, - "w": 247, - "ch": 10, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Playpen Sans Deva": { - "x": 697, - "y": 0, - "w": 227, - "ch": 10, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Playpen Sans Hebrew": { - "x": 938, - "y": 0, - "w": 255, - "ch": 10, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Playpen Sans Thai": { - "x": 0, - "y": 40, - "w": 220, - "ch": 10, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Playwrite AR": { - "x": 234, - "y": 40, - "w": 199, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite AR Guides": { - "x": 447, - "y": 40, - "w": 294, - "ch": 10, - "s": ["400"] - }, - "Playwrite AT": { - "x": 755, - "y": 40, - "w": 180, - "ch": 10, - "s": ["100", "100i", "200", "200i", "300", "300i", "400", "400i"] - }, - "Playwrite AT Guides": { - "x": 0, - "y": 80, - "w": 273, - "ch": 10, - "s": ["400", "400i"] - }, - "Playwrite AU NSW": { - "x": 287, - "y": 80, - "w": 257, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite AU NSW Guides": { - "x": 558, - "y": 80, - "w": 350, - "ch": 10, - "s": ["400"] - }, - "Playwrite AU QLD": { - "x": 922, - "y": 80, - "w": 249, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite AU QLD Guides": { - "x": 0, - "y": 120, - "w": 344, - "ch": 10, - "s": ["400"] - }, - "Playwrite AU SA": { - "x": 358, - "y": 120, - "w": 217, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite AU SA Guides": { - "x": 589, - "y": 120, - "w": 312, - "ch": 10, - "s": ["400"] - }, - "Playwrite AU TAS": { - "x": 915, - "y": 120, - "w": 235, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite AU TAS Guides": { - "x": 0, - "y": 160, - "w": 329, - "ch": 10, - "s": ["400"] - }, - "Playwrite AU VIC": { - "x": 343, - "y": 160, - "w": 234, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite AU VIC Guides": { - "x": 591, - "y": 160, - "w": 327, - "ch": 10, - "s": ["400"] - }, - "Playwrite BE VLG": { - "x": 932, - "y": 160, - "w": 266, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite BE VLG Guides": { - "x": 0, - "y": 200, - "w": 359, - "ch": 10, - "s": ["400"] - }, - "Playwrite BE WAL": { - "x": 373, - "y": 200, - "w": 319, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite BE WAL Guides": { - "x": 706, - "y": 200, - "w": 420, - "ch": 10, - "s": ["400"] - }, - "Playwrite BR": { - "x": 0, - "y": 240, - "w": 201, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite BR Guides": { - "x": 215, - "y": 240, - "w": 298, - "ch": 10, - "s": ["400"] - }, - "Playwrite CA": { - "x": 527, - "y": 240, - "w": 191, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite CA Guides": { - "x": 732, - "y": 240, - "w": 288, - "ch": 10, - "s": ["400"] - }, - "Playwrite CL": { - "x": 0, - "y": 280, - "w": 194, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite CL Guides": { - "x": 208, - "y": 280, - "w": 290, - "ch": 10, - "s": ["400"] - }, - "Playwrite CO": { - "x": 512, - "y": 280, - "w": 189, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite CO Guides": { - "x": 715, - "y": 280, - "w": 287, - "ch": 10, - "s": ["400"] - }, - "Playwrite CU": { - "x": 0, - "y": 320, - "w": 192, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite CU Guides": { - "x": 206, - "y": 320, - "w": 289, - "ch": 10, - "s": ["400"] - }, - "Playwrite CZ": { - "x": 509, - "y": 320, - "w": 192, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite CZ Guides": { - "x": 715, - "y": 320, - "w": 287, - "ch": 10, - "s": ["400"] - }, - "Playwrite DE Grund": { - "x": 0, - "y": 360, - "w": 251, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite DE Grund Guides": { - "x": 265, - "y": 360, - "w": 342, - "ch": 10, - "s": ["400"] - }, - "Playwrite DE LA": { - "x": 621, - "y": 360, - "w": 232, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite DE LA Guides": { - "x": 867, - "y": 360, - "w": 325, - "ch": 10, - "s": ["400"] - }, - "Playwrite DE SAS": { - "x": 0, - "y": 400, - "w": 241, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite DE SAS Guides": { - "x": 255, - "y": 400, - "w": 333, - "ch": 10, - "s": ["400"] - }, - "Playwrite DE VA": { - "x": 602, - "y": 400, - "w": 225, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite DE VA Guides": { - "x": 841, - "y": 400, - "w": 320, - "ch": 10, - "s": ["400"] - }, - "Playwrite DK Loopet": { - "x": 0, - "y": 440, - "w": 254, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite DK Loopet Guides": { - "x": 268, - "y": 440, - "w": 345, - "ch": 10, - "s": ["400"] - }, - "Playwrite DK Uloopet": { - "x": 627, - "y": 440, - "w": 262, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite DK Uloopet Guides": { - "x": 0, - "y": 480, - "w": 353, - "ch": 10, - "s": ["400"] - }, - "Playwrite ES": { - "x": 367, - "y": 480, - "w": 176, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite ES Deco": { - "x": 557, - "y": 480, - "w": 256, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite ES Deco Guides": { - "x": 827, - "y": 480, - "w": 350, - "ch": 10, - "s": ["400"] - }, - "Playwrite ES Guides": { - "x": 0, - "y": 520, - "w": 268, - "ch": 10, - "s": ["400"] - }, - "Playwrite FR Moderne": { - "x": 282, - "y": 520, - "w": 287, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite FR Moderne Guides": { - "x": 583, - "y": 520, - "w": 383, - "ch": 10, - "s": ["400"] - }, - "Playwrite FR Trad": { - "x": 0, - "y": 560, - "w": 281, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite FR Trad Guides": { - "x": 295, - "y": 560, - "w": 384, - "ch": 10, - "s": ["400"] - }, - "Playwrite GB J": { - "x": 693, - "y": 560, - "w": 191, - "ch": 10, - "s": ["100", "100i", "200", "200i", "300", "300i", "400", "400i"] - }, - "Playwrite GB J Guides": { - "x": 898, - "y": 560, - "w": 284, - "ch": 10, - "s": ["400", "400i"] - }, - "Playwrite GB S": { - "x": 0, - "y": 600, - "w": 190, - "ch": 10, - "s": ["100", "100i", "200", "200i", "300", "300i", "400", "400i"] - }, - "Playwrite GB S Guides": { - "x": 204, - "y": 600, - "w": 282, - "ch": 10, - "s": ["400", "400i"] - }, - "Playwrite HR": { - "x": 500, - "y": 600, - "w": 191, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite HR Guides": { - "x": 705, - "y": 600, - "w": 286, - "ch": 10, - "s": ["400"] - }, - "Playwrite HR Lijeva": { - "x": 0, - "y": 640, - "w": 276, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite HR Lijeva Guides": { - "x": 290, - "y": 640, - "w": 370, - "ch": 10, - "s": ["400"] - }, - "Playwrite HU": { - "x": 674, - "y": 640, - "w": 190, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite HU Guides": { - "x": 878, - "y": 640, - "w": 285, - "ch": 10, - "s": ["400"] - }, - "Playwrite ID": { - "x": 0, - "y": 680, - "w": 194, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite ID Guides": { - "x": 208, - "y": 680, - "w": 296, - "ch": 10, - "s": ["400"] - }, - "Playwrite IE": { - "x": 518, - "y": 680, - "w": 175, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite IE Guides": { - "x": 707, - "y": 680, - "w": 271, - "ch": 10, - "s": ["400"] - }, - "Playwrite IN": { - "x": 992, - "y": 680, - "w": 189, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite IN Guides": { - "x": 0, - "y": 720, - "w": 285, - "ch": 10, - "s": ["400"] - }, - "Playwrite IS": { - "x": 299, - "y": 720, - "w": 156, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite IS Guides": { - "x": 469, - "y": 720, - "w": 249, - "ch": 10, - "s": ["400"] - }, - "Playwrite IT Moderna": { - "x": 732, - "y": 720, - "w": 273, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite IT Moderna Guides": { - "x": 0, - "y": 760, - "w": 365, - "ch": 10, - "s": ["400"] - }, - "Playwrite IT Trad": { - "x": 379, - "y": 760, - "w": 243, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite IT Trad Guides": { - "x": 636, - "y": 760, - "w": 336, - "ch": 10, - "s": ["400"] - }, - "Playwrite MX": { - "x": 986, - "y": 760, - "w": 200, - "ch": 10, - "s": ["100", "200", "300", "400"] - }, - "Playwrite MX Guides": { "x": 0, "y": 0, "w": 297, "ch": 11, "s": ["400"] }, - "Playwrite NG Modern": { - "x": 311, - "y": 0, - "w": 279, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite NG Modern Guides": { - "x": 604, - "y": 0, - "w": 373, - "ch": 11, - "s": ["400"] - }, - "Playwrite NL": { - "x": 991, - "y": 0, - "w": 207, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite NL Guides": { - "x": 0, - "y": 40, - "w": 306, - "ch": 11, - "s": ["400"] - }, - "Playwrite NO": { - "x": 320, - "y": 40, - "w": 189, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite NO Guides": { - "x": 523, - "y": 40, - "w": 285, - "ch": 11, - "s": ["400"] - }, - "Playwrite NZ": { - "x": 822, - "y": 40, - "w": 164, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite NZ Basic": { - "x": 0, - "y": 80, - "w": 231, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite NZ Basic Guides": { - "x": 245, - "y": 80, - "w": 319, - "ch": 11, - "s": ["400"] - }, - "Playwrite NZ Guides": { - "x": 578, - "y": 80, - "w": 256, - "ch": 11, - "s": ["400"] - }, - "Playwrite PE": { - "x": 848, - "y": 80, - "w": 185, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite PE Guides": { - "x": 0, - "y": 120, - "w": 282, - "ch": 11, - "s": ["400"] - }, - "Playwrite PL": { - "x": 296, - "y": 120, - "w": 178, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite PL Guides": { - "x": 488, - "y": 120, - "w": 272, - "ch": 11, - "s": ["400"] - }, - "Playwrite PT": { - "x": 774, - "y": 120, - "w": 188, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite PT Guides": { - "x": 0, - "y": 160, - "w": 284, - "ch": 11, - "s": ["400"] - }, - "Playwrite RO": { - "x": 298, - "y": 160, - "w": 197, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite RO Guides": { - "x": 509, - "y": 160, - "w": 286, - "ch": 11, - "s": ["400"] - }, - "Playwrite SK": { - "x": 809, - "y": 160, - "w": 195, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite SK Guides": { - "x": 0, - "y": 200, - "w": 289, - "ch": 11, - "s": ["400"] - }, - "Playwrite TZ": { - "x": 303, - "y": 200, - "w": 182, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite TZ Guides": { - "x": 499, - "y": 200, - "w": 271, - "ch": 11, - "s": ["400"] - }, - "Playwrite US Modern": { - "x": 784, - "y": 200, - "w": 277, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite US Modern Guides": { - "x": 0, - "y": 240, - "w": 369, - "ch": 11, - "s": ["400"] - }, - "Playwrite US Trad": { - "x": 383, - "y": 240, - "w": 258, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite US Trad Guides": { - "x": 655, - "y": 240, - "w": 355, - "ch": 11, - "s": ["400"] - }, - "Playwrite VN": { - "x": 0, - "y": 280, - "w": 212, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite VN Guides": { - "x": 226, - "y": 280, - "w": 311, - "ch": 11, - "s": ["400"] - }, - "Playwrite ZA": { - "x": 551, - "y": 280, - "w": 182, - "ch": 11, - "s": ["100", "200", "300", "400"] - }, - "Playwrite ZA Guides": { - "x": 747, - "y": 280, - "w": 276, - "ch": 11, - "s": ["400"] - }, - "Plus Jakarta Sans": { - "x": 0, - "y": 320, - "w": 199, - "ch": 11, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Pochaevsk": { "x": 213, "y": 320, "w": 111, "ch": 11, "s": ["400"] }, - "Podkova": { - "x": 338, - "y": 320, - "w": 97, - "ch": 11, - "s": ["400", "500", "600", "700", "800"] - }, - "Poetsen One": { "x": 449, "y": 320, "w": 148, "ch": 11, "s": ["400"] }, - "Poiret One": { "x": 611, "y": 320, "w": 114, "ch": 11, "s": ["400"] }, - "Poller One": { "x": 739, "y": 320, "w": 164, "ch": 11, "s": ["400"] }, - "Poltawski Nowy": { - "x": 917, - "y": 320, - "w": 182, - "ch": 11, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Poly": { "x": 1113, "y": 320, "w": 54, "ch": 11, "s": ["400", "400i"] }, - "Pompiere": { "x": 0, "y": 360, "w": 75, "ch": 11, "s": ["400"] }, - "Ponnala": { "x": 89, "y": 360, "w": 70, "ch": 11, "s": ["400"] }, - "Ponomar": { "x": 173, "y": 360, "w": 97, "ch": 11, "s": ["400"] }, - "Pontano Sans": { - "x": 284, - "y": 360, - "w": 149, - "ch": 11, - "s": ["300", "400", "500", "600", "700"] - }, - "Poor Story": { "x": 447, "y": 360, "w": 99, "ch": 11, "s": ["400"] }, - "Poppins": { - "x": 560, - "y": 360, - "w": 104, - "ch": 11, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Port Lligat Sans": { - "x": 678, - "y": 360, - "w": 157, - "ch": 11, - "s": ["400"] - }, - "Port Lligat Slab": { - "x": 849, - "y": 360, - "w": 153, - "ch": 11, - "s": ["400"] - }, - "Potta One": { "x": 1016, "y": 360, "w": 143, "ch": 11, "s": ["400"] }, - "Pragati Narrow": { - "x": 0, - "y": 400, - "w": 129, - "ch": 11, - "s": ["400", "700"] - }, - "Praise": { "x": 143, "y": 400, "w": 59, "ch": 11, "s": ["400"] }, - "Prata": { "x": 216, "y": 400, "w": 71, "ch": 11, "s": ["400"] }, - "Preahvihear": { "x": 301, "y": 400, "w": 161, "ch": 11, "s": ["400"] }, - "Press Start 2P": { "x": 476, "y": 400, "w": 344, "ch": 11, "s": ["400"] }, - "Pridi": { - "x": 834, - "y": 400, - "w": 60, - "ch": 11, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Princess Sofia": { "x": 908, "y": 400, "w": 131, "ch": 11, "s": ["400"] }, - "Prociono": { "x": 1053, "y": 400, "w": 101, "ch": 11, "s": ["400"] }, - "Prompt": { - "x": 0, - "y": 440, - "w": 92, - "ch": 11, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Prosto One": { "x": 106, "y": 440, "w": 159, "ch": 11, "s": ["400"] }, - "Protest Guerrilla": { - "x": 279, - "y": 440, - "w": 177, - "ch": 11, - "s": ["400"] - }, - "Protest Revolution": { - "x": 470, - "y": 440, - "w": 200, - "ch": 11, - "s": ["400"] - }, - "Protest Riot": { "x": 684, "y": 440, "w": 131, "ch": 11, "s": ["400"] }, - "Protest Strike": { "x": 829, "y": 440, "w": 151, "ch": 11, "s": ["400"] }, - "Proza Libre": { - "x": 994, - "y": 440, - "w": 137, - "ch": 11, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "PT Mono": { "x": 0, "y": 480, "w": 109, "ch": 11, "s": ["400"] }, - "PT Sans": { - "x": 123, - "y": 480, - "w": 88, - "ch": 11, - "s": ["400", "400i", "700", "700i"] - }, - "PT Sans Caption": { - "x": 225, - "y": 480, - "w": 197, - "ch": 11, - "s": ["400", "700"] - }, - "PT Sans Narrow": { - "x": 436, - "y": 480, - "w": 138, - "ch": 11, - "s": ["400", "700"] - }, - "PT Serif": { - "x": 588, - "y": 480, - "w": 93, - "ch": 11, - "s": ["400", "400i", "700", "700i"] - }, - "PT Serif Caption": { - "x": 695, - "y": 480, - "w": 205, - "ch": 11, - "s": ["400", "400i"] - }, - "Public Sans": { - "x": 914, - "y": 480, - "w": 139, - "ch": 11, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Puppies Play": { "x": 1067, "y": 480, "w": 85, "ch": 11, "s": ["400"] }, - "Puritan": { - "x": 0, - "y": 520, - "w": 78, - "ch": 11, - "s": ["400", "400i", "700", "700i"] - }, - "Purple Purse": { "x": 92, "y": 520, "w": 150, "ch": 11, "s": ["400"] }, - "Pushster": { "x": 256, "y": 520, "w": 89, "ch": 11, "s": ["400"] }, - "Qahiri": { "x": 359, "y": 520, "w": 51, "ch": 11, "s": ["400"] }, - "Quando": { "x": 424, "y": 520, "w": 107, "ch": 11, "s": ["400"] }, - "Quantico": { - "x": 545, - "y": 520, - "w": 109, - "ch": 11, - "s": ["400", "400i", "700", "700i"] - }, - "Quattrocento": { - "x": 668, - "y": 520, - "w": 153, - "ch": 11, - "s": ["400", "700"] - }, - "Quattrocento Sans": { - "x": 835, - "y": 520, - "w": 201, - "ch": 11, - "s": ["400", "400i", "700", "700i"] - }, - "Questrial": { "x": 1050, "y": 520, "w": 105, "ch": 11, "s": ["400"] }, - "Quicksand": { - "x": 0, - "y": 560, - "w": 125, - "ch": 11, - "s": ["300", "400", "500", "600", "700"] - }, - "Quintessential": { "x": 139, "y": 560, "w": 144, "ch": 11, "s": ["400"] }, - "Qwigley": { "x": 297, "y": 560, "w": 59, "ch": 11, "s": ["400"] }, - "Qwitcher Grypen": { - "x": 370, - "y": 560, - "w": 111, - "ch": 11, - "s": ["400", "700"] - }, - "Racing Sans One": { "x": 495, "y": 560, "w": 190, "ch": 11, "s": ["400"] }, - "Radio Canada": { - "x": 699, - "y": 560, - "w": 161, - "ch": 11, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Radio Canada Big": { - "x": 874, - "y": 560, - "w": 196, - "ch": 11, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Radley": { "x": 1084, "y": 560, "w": 81, "ch": 11, "s": ["400", "400i"] }, - "Rajdhani": { - "x": 0, - "y": 600, - "w": 92, - "ch": 11, - "s": ["300", "400", "500", "600", "700"] - }, - "Rakkas": { "x": 106, "y": 600, "w": 79, "ch": 11, "s": ["400"] }, - "Raleway": { - "x": 199, - "y": 600, - "w": 102, - "ch": 11, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Raleway Dots": { "x": 315, "y": 600, "w": 156, "ch": 11, "s": ["400"] }, - "Ramabhadra": { "x": 485, "y": 600, "w": 154, "ch": 11, "s": ["400"] }, - "Ramaraja": { "x": 653, "y": 600, "w": 96, "ch": 11, "s": ["400"] }, - "Rambla": { - "x": 763, - "y": 600, - "w": 83, - "ch": 11, - "s": ["400", "400i", "700", "700i"] - }, - "Rammetto One": { "x": 860, "y": 600, "w": 234, "ch": 11, "s": ["400"] }, - "Rampart One": { "x": 0, "y": 640, "w": 170, "ch": 11, "s": ["400"] }, - "Ranchers": { "x": 184, "y": 640, "w": 97, "ch": 11, "s": ["400"] }, - "Rancho": { "x": 295, "y": 640, "w": 62, "ch": 11, "s": ["400"] }, - "Ranga": { "x": 371, "y": 640, "w": 52, "ch": 11, "s": ["400", "700"] }, - "Rasa": { - "x": 437, - "y": 640, - "w": 53, - "ch": 11, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Rationale": { "x": 504, "y": 640, "w": 90, "ch": 11, "s": ["400"] }, - "Ravi Prakash": { "x": 608, "y": 640, "w": 132, "ch": 11, "s": ["400"] }, - "Readex Pro": { - "x": 754, - "y": 640, - "w": 140, - "ch": 11, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Recursive": { - "x": 908, - "y": 640, - "w": 123, - "ch": 11, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Red Hat Display": { - "x": 0, - "y": 680, - "w": 175, - "ch": 11, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Red Hat Mono": { - "x": 189, - "y": 680, - "w": 181, - "ch": 11, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Red Hat Text": { - "x": 384, - "y": 680, - "w": 146, - "ch": 11, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Red Rose": { - "x": 544, - "y": 680, - "w": 117, - "ch": 11, - "s": ["300", "400", "500", "600", "700"] - }, - "Redacted": { "x": 675, "y": 680, "w": 80, "ch": 11, "s": ["400"] }, - "Redacted Script": { - "x": 769, - "y": 680, - "w": 201, - "ch": 11, - "s": ["300", "400", "700"] - }, - "Reddit Mono": { - "x": 984, - "y": 680, - "w": 157, - "ch": 11, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Reddit Sans": { - "x": 0, - "y": 720, - "w": 134, - "ch": 11, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Reddit Sans Condensed": { - "x": 148, - "y": 720, - "w": 232, - "ch": 11, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Redressed": { "x": 394, "y": 720, "w": 96, "ch": 11, "s": ["400"] }, - "Reem Kufi": { - "x": 504, - "y": 720, - "w": 118, - "ch": 11, - "s": ["400", "500", "600", "700"] - }, - "Reem Kufi Fun": { - "x": 636, - "y": 720, - "w": 161, - "ch": 11, - "s": ["400", "500", "600", "700"] - }, - "Reem Kufi Ink": { "x": 811, "y": 720, "w": 154, "ch": 11, "s": ["400"] }, - "Reenie Beanie": { "x": 979, "y": 720, "w": 122, "ch": 11, "s": ["400"] }, - "Reggae One": { "x": 0, "y": 760, "w": 161, "ch": 11, "s": ["400"] }, - "REM": { - "x": 175, - "y": 760, - "w": 63, - "ch": 11, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Rethink Sans": { - "x": 252, - "y": 760, - "w": 150, - "ch": 11, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Revalia": { "x": 416, "y": 760, "w": 121, "ch": 11, "s": ["400"] }, - "Rhodium Libre": { "x": 551, "y": 760, "w": 187, "ch": 11, "s": ["400"] }, - "Ribeye": { "x": 752, "y": 760, "w": 92, "ch": 11, "s": ["400"] }, - "Ribeye Marrow": { "x": 858, "y": 760, "w": 201, "ch": 11, "s": ["400"] }, - "Righteous": { "x": 1073, "y": 760, "w": 121, "ch": 11, "s": ["400"] }, - "Risque": { "x": 0, "y": 0, "w": 77, "ch": 12, "s": ["400"] }, - "Road Rage": { "x": 91, "y": 0, "w": 72, "ch": 12, "s": ["400"] }, - "Roboto": { - "x": 177, - "y": 0, - "w": 85, - "ch": 12, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Roboto Condensed": { - "x": 276, - "y": 0, - "w": 188, - "ch": 12, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Roboto Flex": { "x": 478, "y": 0, "w": 134, "ch": 12, "s": ["400"] }, - "Roboto Mono": { - "x": 626, - "y": 0, - "w": 167, - "ch": 12, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Roboto Serif": { - "x": 807, - "y": 0, - "w": 162, - "ch": 12, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Roboto Slab": { - "x": 983, - "y": 0, - "w": 141, - "ch": 12, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Rochester": { "x": 0, "y": 40, "w": 85, "ch": 12, "s": ["400"] }, - "Rock 3D": { "x": 99, "y": 40, "w": 137, "ch": 12, "s": ["400"] }, - "Rock Salt": { "x": 250, "y": 40, "w": 153, "ch": 12, "s": ["400"] }, - "RocknRoll One": { "x": 417, "y": 40, "w": 190, "ch": 12, "s": ["400"] }, - "Rokkitt": { - "x": 621, - "y": 40, - "w": 79, - "ch": 12, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Romanesco": { "x": 714, "y": 40, "w": 73, "ch": 12, "s": ["400"] }, - "Ropa Sans": { - "x": 801, - "y": 40, - "w": 102, - "ch": 12, - "s": ["400", "400i"] - }, - "Rosario": { - "x": 917, - "y": 40, - "w": 84, - "ch": 12, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Rosarivo": { - "x": 1015, - "y": 40, - "w": 106, - "ch": 12, - "s": ["400", "400i"] - }, - "Rouge Script": { "x": 0, "y": 80, "w": 104, "ch": 12, "s": ["400"] }, - "Rowdies": { - "x": 118, - "y": 80, - "w": 106, - "ch": 12, - "s": ["300", "400", "700"] - }, - "Rozha One": { "x": 238, "y": 80, "w": 126, "ch": 12, "s": ["400"] }, - "Rubik": { - "x": 378, - "y": 80, - "w": 71, - "ch": 12, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Rubik 80s Fade": { "x": 463, "y": 80, "w": 199, "ch": 12, "s": ["400"] }, - "Rubik Beastly": { "x": 676, "y": 80, "w": 183, "ch": 12, "s": ["400"] }, - "Rubik Broken Fax": { "x": 873, "y": 80, "w": 227, "ch": 12, "s": ["400"] }, - "Rubik Bubbles": { "x": 0, "y": 120, "w": 188, "ch": 12, "s": ["400"] }, - "Rubik Burned": { "x": 202, "y": 120, "w": 179, "ch": 12, "s": ["400"] }, - "Rubik Dirt": { "x": 395, "y": 120, "w": 137, "ch": 12, "s": ["400"] }, - "Rubik Distressed": { - "x": 546, - "y": 120, - "w": 225, - "ch": 12, - "s": ["400"] - }, - "Rubik Doodle Shadow": { - "x": 785, - "y": 120, - "w": 277, - "ch": 12, - "s": ["400"] - }, - "Rubik Doodle Triangles": { - "x": 0, - "y": 160, - "w": 296, - "ch": 12, - "s": ["400"] - }, - "Rubik Gemstones": { "x": 310, "y": 160, "w": 229, "ch": 12, "s": ["400"] }, - "Rubik Glitch": { "x": 553, "y": 160, "w": 165, "ch": 12, "s": ["400"] }, - "Rubik Glitch Pop": { - "x": 732, - "y": 160, - "w": 217, - "ch": 12, - "s": ["400"] - }, - "Rubik Iso": { "x": 963, "y": 160, "w": 124, "ch": 12, "s": ["400"] }, - "Rubik Lines": { "x": 0, "y": 200, "w": 155, "ch": 12, "s": ["400"] }, - "Rubik Maps": { "x": 169, "y": 200, "w": 151, "ch": 12, "s": ["400"] }, - "Rubik Marker Hatch": { - "x": 334, - "y": 200, - "w": 257, - "ch": 12, - "s": ["400"] - }, - "Rubik Maze": { "x": 605, "y": 200, "w": 150, "ch": 12, "s": ["400"] }, - "Rubik Microbe": { "x": 769, "y": 200, "w": 188, "ch": 12, "s": ["400"] }, - "Rubik Mono One": { "x": 0, "y": 240, "w": 294, "ch": 12, "s": ["400"] }, - "Rubik Moonrocks": { "x": 308, "y": 240, "w": 225, "ch": 12, "s": ["400"] }, - "Rubik Pixels": { "x": 547, "y": 240, "w": 162, "ch": 12, "s": ["400"] }, - "Rubik Puddles": { "x": 723, "y": 240, "w": 187, "ch": 12, "s": ["400"] }, - "Rubik Scribble": { "x": 924, "y": 240, "w": 192, "ch": 12, "s": ["400"] }, - "Rubik Spray Paint": { "x": 0, "y": 280, "w": 233, "ch": 12, "s": ["400"] }, - "Rubik Storm": { "x": 247, "y": 280, "w": 165, "ch": 12, "s": ["400"] }, - "Rubik Vinyl": { "x": 426, "y": 280, "w": 150, "ch": 12, "s": ["400"] }, - "Rubik Wet Paint": { "x": 590, "y": 280, "w": 207, "ch": 12, "s": ["400"] }, - "Ruda": { - "x": 811, - "y": 280, - "w": 66, - "ch": 12, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Rufina": { "x": 891, "y": 280, "w": 82, "ch": 12, "s": ["400", "700"] }, - "Ruge Boogie": { "x": 987, "y": 280, "w": 99, "ch": 12, "s": ["400"] }, - "Ruluko": { "x": 1100, "y": 280, "w": 78, "ch": 12, "s": ["400"] }, - "Rum Raisin": { "x": 0, "y": 320, "w": 100, "ch": 12, "s": ["400"] }, - "Ruslan Display": { "x": 114, "y": 320, "w": 220, "ch": 12, "s": ["400"] }, - "Russo One": { "x": 348, "y": 320, "w": 138, "ch": 12, "s": ["400"] }, - "Ruthie": { "x": 500, "y": 320, "w": 64, "ch": 12, "s": ["400"] }, - "Ruwudu": { - "x": 578, - "y": 320, - "w": 94, - "ch": 12, - "s": ["400", "500", "600", "700"] - }, - "Rye": { "x": 686, "y": 320, "w": 55, "ch": 12, "s": ["400"] }, - "Sacramento": { "x": 755, "y": 320, "w": 104, "ch": 12, "s": ["400"] }, - "Sahitya": { "x": 873, "y": 320, "w": 81, "ch": 12, "s": ["400", "700"] }, - "Sail": { "x": 968, "y": 320, "w": 50, "ch": 12, "s": ["400"] }, - "Saira": { - "x": 1032, - "y": 320, - "w": 66, - "ch": 12, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Saira Condensed": { - "x": 0, - "y": 360, - "w": 149, - "ch": 12, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Saira Extra Condensed": { - "x": 163, - "y": 360, - "w": 167, - "ch": 12, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Saira Semi Condensed": { - "x": 344, - "y": 360, - "w": 227, - "ch": 12, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Saira Stencil One": { - "x": 585, - "y": 360, - "w": 201, - "ch": 12, - "s": ["400"] - }, - "Salsa": { "x": 800, "y": 360, "w": 66, "ch": 12, "s": ["400"] }, - "Sanchez": { "x": 880, "y": 360, "w": 105, "ch": 12, "s": ["400", "400i"] }, - "Sancreek": { "x": 999, "y": 360, "w": 111, "ch": 12, "s": ["400"] }, - "Sankofa Display": { "x": 0, "y": 400, "w": 163, "ch": 12, "s": ["400"] }, - "Sansation": { - "x": 177, - "y": 400, - "w": 119, - "ch": 12, - "s": ["300", "300i", "400", "400i", "700", "700i"] - }, - "Sansita": { - "x": 310, - "y": 400, - "w": 80, - "ch": 12, - "s": ["400", "400i", "700", "700i", "800", "800i", "900", "900i"] - }, - "Sansita Swashed": { - "x": 404, - "y": 400, - "w": 177, - "ch": 12, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Sarabun": { - "x": 595, - "y": 400, - "w": 94, - "ch": 12, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Sarala": { "x": 703, "y": 400, "w": 74, "ch": 12, "s": ["400", "700"] }, - "Sarina": { "x": 791, "y": 400, "w": 112, "ch": 12, "s": ["400"] }, - "Sarpanch": { - "x": 917, - "y": 400, - "w": 122, - "ch": 12, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Sassy Frass": { "x": 1053, "y": 400, "w": 78, "ch": 12, "s": ["400"] }, - "Satisfy": { "x": 0, "y": 440, "w": 70, "ch": 12, "s": ["400"] }, - "Savate": { - "x": 84, - "y": 440, - "w": 81, - "ch": 12, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Sawarabi Gothic": { "x": 179, "y": 440, "w": 186, "ch": 12, "s": ["400"] }, - "Sawarabi Mincho": { "x": 379, "y": 440, "w": 204, "ch": 12, "s": ["400"] }, - "Scada": { - "x": 597, - "y": 440, - "w": 69, - "ch": 12, - "s": ["400", "400i", "700", "700i"] - }, - "Scheherazade New": { - "x": 680, - "y": 440, - "w": 175, - "ch": 12, - "s": ["400", "500", "600", "700"] - }, - "Schibsted Grotesk": { - "x": 869, - "y": 440, - "w": 212, - "ch": 12, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Schoolbell": { "x": 1095, "y": 440, "w": 102, "ch": 12, "s": ["400"] }, - "Science Gothic": { - "x": 0, - "y": 480, - "w": 212, - "ch": 12, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Scope One": { "x": 226, "y": 480, "w": 120, "ch": 12, "s": ["400"] }, - "Seaweed Script": { "x": 360, "y": 480, "w": 137, "ch": 12, "s": ["400"] }, - "Secular One": { "x": 511, "y": 480, "w": 144, "ch": 12, "s": ["400"] }, - "Sedan": { "x": 669, "y": 480, "w": 72, "ch": 12, "s": ["400", "400i"] }, - "Sedan SC": { "x": 755, "y": 480, "w": 111, "ch": 12, "s": ["400"] }, - "Sedgwick Ave": { "x": 880, "y": 480, "w": 140, "ch": 12, "s": ["400"] }, - "Sedgwick Ave Display": { - "x": 0, - "y": 520, - "w": 224, - "ch": 12, - "s": ["400"] - }, - "Sekuya": { "x": 238, "y": 520, "w": 138, "ch": 12, "s": ["400"] }, - "Sen": { - "x": 390, - "y": 520, - "w": 48, - "ch": 12, - "s": ["400", "500", "600", "700", "800"] - }, - "Send Flowers": { "x": 452, "y": 520, "w": 129, "ch": 12, "s": ["400"] }, - "Sevillana": { "x": 595, "y": 520, "w": 96, "ch": 12, "s": ["400"] }, - "Seymour One": { "x": 705, "y": 520, "w": 241, "ch": 12, "s": ["400"] }, - "Shadows Into Light": { - "x": 960, - "y": 520, - "w": 172, - "ch": 12, - "s": ["400"] - }, - "Shadows Into Light Two": { - "x": 0, - "y": 560, - "w": 234, - "ch": 12, - "s": ["400"] - }, - "Shafarik": { "x": 248, "y": 560, "w": 89, "ch": 12, "s": ["400"] }, - "Shalimar": { "x": 351, "y": 560, "w": 59, "ch": 12, "s": ["400"] }, - "Shantell Sans": { - "x": 424, - "y": 560, - "w": 166, - "ch": 12, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Shanti": { "x": 604, "y": 560, "w": 75, "ch": 12, "s": ["400"] }, - "Share": { - "x": 693, - "y": 560, - "w": 62, - "ch": 12, - "s": ["400", "400i", "700", "700i"] - }, - "Share Tech": { "x": 769, "y": 560, "w": 109, "ch": 12, "s": ["400"] }, - "Share Tech Mono": { "x": 892, "y": 560, "w": 203, "ch": 12, "s": ["400"] }, - "Shippori Antique": { "x": 0, "y": 600, "w": 206, "ch": 12, "s": ["400"] }, - "Shippori Antique B1": { - "x": 220, - "y": 600, - "w": 241, - "ch": 12, - "s": ["400"] - }, - "Shippori Mincho": { - "x": 475, - "y": 600, - "w": 202, - "ch": 12, - "s": ["400", "500", "600", "700", "800"] - }, - "Shippori Mincho B1": { - "x": 691, - "y": 600, - "w": 237, - "ch": 12, - "s": ["400", "500", "600", "700", "800"] - }, - "Shizuru": { "x": 942, "y": 600, "w": 82, "ch": 12, "s": ["400"] }, - "Shojumaru": { "x": 0, "y": 640, "w": 184, "ch": 12, "s": ["400"] }, - "Short Stack": { "x": 198, "y": 640, "w": 168, "ch": 12, "s": ["400"] }, - "Shrikhand": { "x": 380, "y": 640, "w": 147, "ch": 12, "s": ["400"] }, - "Sigmar": { "x": 541, "y": 640, "w": 99, "ch": 12, "s": ["400"] }, - "Sigmar One": { "x": 654, "y": 640, "w": 172, "ch": 12, "s": ["400"] }, - "Signika": { - "x": 840, - "y": 640, - "w": 85, - "ch": 12, - "s": ["300", "400", "500", "600", "700"] - }, - "Signika Negative": { - "x": 939, - "y": 640, - "w": 180, - "ch": 12, - "s": ["300", "400", "500", "600", "700"] - }, - "Silkscreen": { "x": 0, "y": 680, "w": 173, "ch": 12, "s": ["400", "700"] }, - "Simonetta": { - "x": 187, - "y": 680, - "w": 108, - "ch": 12, - "s": ["400", "400i", "900", "900i"] - }, - "Sintony": { "x": 309, "y": 680, "w": 97, "ch": 12, "s": ["400", "700"] }, - "Sirin Stencil": { "x": 420, "y": 680, "w": 122, "ch": 12, "s": ["400"] }, - "Sirivennela": { "x": 556, "y": 680, "w": 98, "ch": 12, "s": ["400"] }, - "Six Caps": { "x": 668, "y": 680, "w": 47, "ch": 12, "s": ["400"] }, - "Sixtyfour": { "x": 729, "y": 680, "w": 224, "ch": 12, "s": ["400"] }, - "Sixtyfour Convergence": { - "x": 0, - "y": 720, - "w": 512, - "ch": 12, - "s": ["400"] - }, - "Skranji": { "x": 526, "y": 720, "w": 78, "ch": 12, "s": ["400", "700"] }, - "Slabo 13px": { "x": 618, "y": 720, "w": 127, "ch": 12, "s": ["400"] }, - "Slabo 27px": { "x": 759, "y": 720, "w": 111, "ch": 12, "s": ["400"] }, - "Slackey": { "x": 884, "y": 720, "w": 124, "ch": 12, "s": ["400"] }, - "Slackside One": { "x": 1022, "y": 720, "w": 137, "ch": 12, "s": ["400"] }, - "Smokum": { "x": 0, "y": 760, "w": 76, "ch": 12, "s": ["400"] }, - "Smooch": { "x": 90, "y": 760, "w": 73, "ch": 12, "s": ["400"] }, - "Smooch Sans": { - "x": 177, - "y": 760, - "w": 110, - "ch": 12, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Smythe": { "x": 301, "y": 760, "w": 64, "ch": 12, "s": ["400"] }, - "SN Pro": { - "x": 379, - "y": 760, - "w": 84, - "ch": 12, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Sniglet": { "x": 477, "y": 760, "w": 82, "ch": 12, "s": ["400", "800"] }, - "Snippet": { "x": 573, "y": 760, "w": 89, "ch": 12, "s": ["400"] }, - "Snowburst One": { "x": 676, "y": 760, "w": 197, "ch": 12, "s": ["400"] }, - "Sofadi One": { "x": 887, "y": 760, "w": 137, "ch": 12, "s": ["400"] }, - "Sofia": { "x": 1038, "y": 760, "w": 61, "ch": 12, "s": ["400"] }, - "Sofia Sans": { - "x": 0, - "y": 0, - "w": 115, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Sofia Sans Condensed": { - "x": 129, - "y": 0, - "w": 184, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Sofia Sans Extra Condensed": { - "x": 327, - "y": 0, - "w": 188, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Sofia Sans Semi Condensed": { - "x": 529, - "y": 0, - "w": 280, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Solitreo": { "x": 823, "y": 0, "w": 83, "ch": 13, "s": ["400"] }, - "Solway": { - "x": 920, - "y": 0, - "w": 90, - "ch": 13, - "s": ["300", "400", "500", "700", "800"] - }, - "Sometype Mono": { - "x": 0, - "y": 40, - "w": 189, - "ch": 13, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Sono": { - "x": 203, - "y": 40, - "w": 68, - "ch": 13, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Sonsie One": { "x": 285, "y": 40, "w": 194, "ch": 13, "s": ["400"] }, - "Sora": { - "x": 493, - "y": 40, - "w": 65, - "ch": 13, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Sorts Mill Goudy": { - "x": 572, - "y": 40, - "w": 187, - "ch": 13, - "s": ["400", "400i"] - }, - "Sour Gummy": { - "x": 773, - "y": 40, - "w": 149, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Source Code Pro": { - "x": 936, - "y": 40, - "w": 224, - "ch": 13, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Source Sans 3": { - "x": 0, - "y": 80, - "w": 147, - "ch": 13, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Source Sans Pro": { - "x": 161, - "y": 80, - "w": 170, - "ch": 13, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "600", - "600i", - "700", - "700i", - "900", - "900i" - ] - }, - "Source Serif 4": { - "x": 345, - "y": 80, - "w": 164, - "ch": 13, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Source Serif Pro": { - "x": 523, - "y": 80, - "w": 180, - "ch": 13, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "600", - "600i", - "700", - "700i", - "900", - "900i" - ] - }, - "Space Grotesk": { - "x": 717, - "y": 80, - "w": 176, - "ch": 13, - "s": ["300", "400", "500", "600", "700"] - }, - "Space Mono": { - "x": 907, - "y": 80, - "w": 155, - "ch": 13, - "s": ["400", "400i", "700", "700i"] - }, - "Special Elite": { "x": 0, "y": 120, "w": 177, "ch": 13, "s": ["400"] }, - "Special Gothic": { - "x": 191, - "y": 120, - "w": 156, - "ch": 13, - "s": ["400", "500", "600", "700"] - }, - "Special Gothic Condensed One": { - "x": 361, - "y": 120, - "w": 247, - "ch": 13, - "s": ["400"] - }, - "Special Gothic Expanded One": { - "x": 622, - "y": 120, - "w": 424, - "ch": 13, - "s": ["400"] - }, - "Spectral": { - "x": 1060, - "y": 120, - "w": 95, - "ch": 13, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Spectral SC": { - "x": 0, - "y": 160, - "w": 159, - "ch": 13, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Spicy Rice": { "x": 173, "y": 160, "w": 111, "ch": 13, "s": ["400"] }, - "Spinnaker": { "x": 298, "y": 160, "w": 128, "ch": 13, "s": ["400"] }, - "Spirax": { "x": 440, "y": 160, "w": 73, "ch": 13, "s": ["400"] }, - "Splash": { "x": 527, "y": 160, "w": 88, "ch": 13, "s": ["400"] }, - "Spline Sans": { - "x": 629, - "y": 160, - "w": 133, - "ch": 13, - "s": ["300", "400", "500", "600", "700"] - }, - "Spline Sans Mono": { - "x": 776, - "y": 160, - "w": 239, - "ch": 13, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Squada One": { "x": 1029, "y": 160, "w": 111, "ch": 13, "s": ["400"] }, - "Square Peg": { "x": 0, "y": 200, "w": 73, "ch": 13, "s": ["400"] }, - "Sree Krushnadevaraya": { - "x": 87, - "y": 200, - "w": 222, - "ch": 13, - "s": ["400"] - }, - "Sriracha": { "x": 323, "y": 200, "w": 99, "ch": 13, "s": ["400"] }, - "Srisakdi": { "x": 436, "y": 200, "w": 90, "ch": 13, "s": ["400", "700"] }, - "Staatliches": { "x": 540, "y": 200, "w": 114, "ch": 13, "s": ["400"] }, - "Stack Sans Headline": { - "x": 668, - "y": 200, - "w": 235, - "ch": 13, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Stack Sans Notch": { - "x": 917, - "y": 200, - "w": 205, - "ch": 13, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Stack Sans Text": { - "x": 0, - "y": 240, - "w": 195, - "ch": 13, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Stalemate": { "x": 209, "y": 240, "w": 62, "ch": 13, "s": ["400"] }, - "Stalinist One": { "x": 285, "y": 240, "w": 280, "ch": 13, "s": ["400"] }, - "Stardos Stencil": { - "x": 579, - "y": 240, - "w": 168, - "ch": 13, - "s": ["400", "700"] - }, - "Stick": { "x": 761, "y": 240, "w": 65, "ch": 13, "s": ["400"] }, - "Stick No Bills": { - "x": 840, - "y": 240, - "w": 123, - "ch": 13, - "s": ["200", "300", "400", "500", "600", "700", "800"] - }, - "Stint Ultra Condensed": { - "x": 977, - "y": 240, - "w": 139, - "ch": 13, - "s": ["400"] - }, - "Stint Ultra Expanded": { - "x": 0, - "y": 280, - "w": 310, - "ch": 13, - "s": ["400"] - }, - "STIX Two Text": { - "x": 324, - "y": 280, - "w": 156, - "ch": 13, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Stoke": { "x": 494, "y": 280, "w": 84, "ch": 13, "s": ["300", "400"] }, - "Story Script": { "x": 592, "y": 280, "w": 113, "ch": 13, "s": ["400"] }, - "Strait": { "x": 719, "y": 280, "w": 62, "ch": 13, "s": ["400"] }, - "Style Script": { "x": 795, "y": 280, "w": 97, "ch": 13, "s": ["400"] }, - "Sue Ellen Francisco": { - "x": 906, - "y": 280, - "w": 137, - "ch": 13, - "s": ["400"] - }, - "Suez One": { "x": 1057, "y": 280, "w": 113, "ch": 13, "s": ["400"] }, - "Sulphur Point": { - "x": 0, - "y": 320, - "w": 144, - "ch": 13, - "s": ["300", "400", "700"] - }, - "Sumana": { "x": 158, "y": 320, "w": 92, "ch": 13, "s": ["400", "700"] }, - "Sunshiney": { "x": 264, "y": 320, "w": 94, "ch": 13, "s": ["400"] }, - "Supermercado One": { - "x": 372, - "y": 320, - "w": 196, - "ch": 13, - "s": ["400"] - }, - "Sura": { "x": 582, "y": 320, "w": 58, "ch": 13, "s": ["400", "700"] }, - "Suranna": { "x": 654, "y": 320, "w": 86, "ch": 13, "s": ["400"] }, - "Suravaram": { "x": 754, "y": 320, "w": 104, "ch": 13, "s": ["400"] }, - "SUSE": { - "x": 872, - "y": 320, - "w": 65, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "SUSE Mono": { - "x": 951, - "y": 320, - "w": 138, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Suwannaphum": { - "x": 0, - "y": 360, - "w": 184, - "ch": 13, - "s": ["100", "300", "400", "700", "900"] - }, - "Swanky and Moo Moo": { - "x": 198, - "y": 360, - "w": 203, - "ch": 13, - "s": ["400"] - }, - "Syncopate": { - "x": 415, - "y": 360, - "w": 195, - "ch": 13, - "s": ["400", "700"] - }, - "Syne": { - "x": 624, - "y": 360, - "w": 60, - "ch": 13, - "s": ["400", "500", "600", "700", "800"] - }, - "Syne Mono": { "x": 698, "y": 360, "w": 127, "ch": 13, "s": ["400"] }, - "Syne Tactile": { "x": 839, "y": 360, "w": 119, "ch": 13, "s": ["400"] }, - "Tac One": { "x": 972, "y": 360, "w": 73, "ch": 13, "s": ["400"] }, - "Tagesschrift": { "x": 0, "y": 400, "w": 142, "ch": 13, "s": ["400"] }, - "Tai Heritage Pro": { - "x": 156, - "y": 400, - "w": 171, - "ch": 13, - "s": ["400", "700"] - }, - "Tajawal": { - "x": 341, - "y": 400, - "w": 82, - "ch": 13, - "s": ["200", "300", "400", "500", "700", "800", "900"] - }, - "Tangerine": { "x": 437, "y": 400, "w": 67, "ch": 13, "s": ["400", "700"] }, - "Tapestry": { "x": 518, "y": 400, "w": 100, "ch": 13, "s": ["400"] }, - "Taprom": { "x": 632, "y": 400, "w": 70, "ch": 13, "s": ["400"] }, - "TASA Explorer": { - "x": 716, - "y": 400, - "w": 161, - "ch": 13, - "s": ["400", "500", "600", "700", "800"] - }, - "TASA Orbiter": { - "x": 891, - "y": 400, - "w": 153, - "ch": 13, - "s": ["400", "500", "600", "700", "800"] - }, - "Tauri": { "x": 1058, "y": 400, "w": 66, "ch": 13, "s": ["400"] }, - "Taviraj": { - "x": 0, - "y": 440, - "w": 84, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Teachers": { - "x": 98, - "y": 440, - "w": 100, - "ch": 13, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Teko": { - "x": 212, - "y": 440, - "w": 42, - "ch": 13, - "s": ["300", "400", "500", "600", "700"] - }, - "Tektur": { - "x": 268, - "y": 440, - "w": 86, - "ch": 13, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Telex": { "x": 368, "y": 440, "w": 64, "ch": 13, "s": ["400"] }, - "Tenali Ramakrishna": { - "x": 446, - "y": 440, - "w": 170, - "ch": 13, - "s": ["400"] - }, - "Tenor Sans": { "x": 630, "y": 440, "w": 134, "ch": 13, "s": ["400"] }, - "Text Me One": { "x": 778, "y": 440, "w": 140, "ch": 13, "s": ["400"] }, - "Texturina": { - "x": 932, - "y": 440, - "w": 113, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Thasadith": { - "x": 1059, - "y": 440, - "w": 101, - "ch": 13, - "s": ["400", "400i", "700", "700i"] - }, - "The Girl Next Door": { - "x": 0, - "y": 480, - "w": 215, - "ch": 13, - "s": ["400"] - }, - "The Nautigal": { - "x": 229, - "y": 480, - "w": 102, - "ch": 13, - "s": ["400", "700"] - }, - "Tienne": { - "x": 345, - "y": 480, - "w": 92, - "ch": 13, - "s": ["400", "700", "900"] - }, - "TikTok Sans": { - "x": 451, - "y": 480, - "w": 141, - "ch": 13, - "s": ["300", "400", "500", "600", "700", "800", "900"] - }, - "Tillana": { - "x": 606, - "y": 480, - "w": 75, - "ch": 13, - "s": ["400", "500", "600", "700", "800"] - }, - "Tilt Neon": { "x": 695, "y": 480, "w": 101, "ch": 13, "s": ["400"] }, - "Tilt Prism": { "x": 810, "y": 480, "w": 121, "ch": 13, "s": ["400"] }, - "Tilt Warp": { "x": 945, "y": 480, "w": 109, "ch": 13, "s": ["400"] }, - "Timmana": { "x": 1068, "y": 480, "w": 90, "ch": 13, "s": ["400"] }, - "Tinos": { - "x": 0, - "y": 520, - "w": 62, - "ch": 13, - "s": ["400", "400i", "700", "700i"] - }, - "Tiny5": { "x": 76, "y": 520, "w": 62, "ch": 13, "s": ["400"] }, - "Tiro Bangla": { - "x": 152, - "y": 520, - "w": 134, - "ch": 13, - "s": ["400", "400i"] - }, - "Tiro Devanagari Hindi": { - "x": 300, - "y": 520, - "w": 251, - "ch": 13, - "s": ["400", "400i"] - }, - "Tiro Devanagari Marathi": { - "x": 565, - "y": 520, - "w": 274, - "ch": 13, - "s": ["400", "400i"] - }, - "Tiro Devanagari Sanskrit": { - "x": 853, - "y": 520, - "w": 276, - "ch": 13, - "s": ["400", "400i"] - }, - "Tiro Gurmukhi": { - "x": 0, - "y": 560, - "w": 173, - "ch": 13, - "s": ["400", "400i"] - }, - "Tiro Kannada": { - "x": 187, - "y": 560, - "w": 156, - "ch": 13, - "s": ["400", "400i"] - }, - "Tiro Tamil": { - "x": 357, - "y": 560, - "w": 122, - "ch": 13, - "s": ["400", "400i"] - }, - "Tiro Telugu": { - "x": 493, - "y": 560, - "w": 134, - "ch": 13, - "s": ["400", "400i"] - }, - "Tirra": { - "x": 641, - "y": 560, - "w": 57, - "ch": 13, - "s": ["400", "500", "600", "700", "800", "900"] - }, - "Titan One": { "x": 712, "y": 560, "w": 131, "ch": 13, "s": ["400"] }, - "Titillium Web": { - "x": 857, - "y": 560, - "w": 140, - "ch": 13, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "600", - "600i", - "700", - "700i", - "900", - "900i" - ] - }, - "Tomorrow": { - "x": 1011, - "y": 560, - "w": 126, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Tourney": { - "x": 0, - "y": 600, - "w": 107, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Trade Winds": { "x": 121, "y": 600, "w": 160, "ch": 13, "s": ["400"] }, - "Train One": { "x": 295, "y": 600, "w": 132, "ch": 13, "s": ["400"] }, - "Triodion": { "x": 441, "y": 600, "w": 94, "ch": 13, "s": ["400"] }, - "Trirong": { - "x": 549, - "y": 600, - "w": 92, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Trispace": { - "x": 655, - "y": 600, - "w": 128, - "ch": 13, - "s": ["100", "200", "300", "400", "500", "600", "700", "800"] - }, - "Trocchi": { "x": 797, "y": 600, "w": 100, "ch": 13, "s": ["400"] }, - "Trochut": { - "x": 911, - "y": 600, - "w": 75, - "ch": 13, - "s": ["400", "400i", "700", "700i"] - }, - "Truculenta": { - "x": 1000, - "y": 600, - "w": 100, - "ch": 13, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Trykker": { "x": 0, "y": 640, "w": 98, "ch": 13, "s": ["400"] }, - "Tsukimi Rounded": { - "x": 112, - "y": 640, - "w": 209, - "ch": 13, - "s": ["300", "400", "500", "600", "700"] - }, - "Tuffy": { - "x": 335, - "y": 640, - "w": 63, - "ch": 13, - "s": ["400", "400i", "700", "700i"] - }, - "Tulpen One": { "x": 412, "y": 640, "w": 59, "ch": 13, "s": ["400"] }, - "Turret Road": { - "x": 485, - "y": 640, - "w": 142, - "ch": 13, - "s": ["200", "300", "400", "500", "700", "800"] - }, - "Twinkle Star": { "x": 641, "y": 640, "w": 137, "ch": 13, "s": ["400"] }, - "Ubuntu": { - "x": 792, - "y": 640, - "w": 90, - "ch": 13, - "s": ["300", "300i", "400", "400i", "500", "500i", "700", "700i"] - }, - "Ubuntu Condensed": { - "x": 896, - "y": 640, - "w": 177, - "ch": 13, - "s": ["400"] - }, - "Ubuntu Mono": { - "x": 0, - "y": 680, - "w": 156, - "ch": 13, - "s": ["400", "400i", "700", "700i"] - }, - "Ubuntu Sans": { - "x": 170, - "y": 680, - "w": 144, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Ubuntu Sans Mono": { - "x": 328, - "y": 680, - "w": 224, - "ch": 13, - "s": ["400", "400i", "500", "500i", "600", "600i", "700", "700i"] - }, - "Uchen": { "x": 566, "y": 680, "w": 75, "ch": 13, "s": ["400"] }, - "Ultra": { "x": 655, "y": 680, "w": 85, "ch": 13, "s": ["400"] }, - "Unbounded": { - "x": 754, - "y": 680, - "w": 174, - "ch": 13, - "s": ["200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Uncial Antiqua": { "x": 942, "y": 680, "w": 211, "ch": 13, "s": ["400"] }, - "Underdog": { "x": 0, "y": 720, "w": 113, "ch": 13, "s": ["400"] }, - "Unica One": { "x": 127, "y": 720, "w": 106, "ch": 13, "s": ["400"] }, - "UnifrakturMaguntia": { - "x": 247, - "y": 720, - "w": 204, - "ch": 13, - "s": ["400"] - }, - "Unkempt": { "x": 465, "y": 720, "w": 99, "ch": 13, "s": ["400", "700"] }, - "Unlock": { "x": 578, "y": 720, "w": 93, "ch": 13, "s": ["400"] }, - "Unna": { - "x": 685, - "y": 720, - "w": 60, - "ch": 13, - "s": ["400", "400i", "700", "700i"] - }, - "UoqMunThenKhung": { "x": 759, "y": 720, "w": 245, "ch": 13, "s": ["400"] }, - "Updock": { "x": 1018, "y": 720, "w": 58, "ch": 13, "s": ["400"] }, - "Urbanist": { - "x": 1090, - "y": 720, - "w": 97, - "ch": 13, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Vampiro One": { "x": 0, "y": 760, "w": 165, "ch": 13, "s": ["400"] }, - "Varela": { "x": 179, "y": 760, "w": 81, "ch": 13, "s": ["400"] }, - "Varela Round": { "x": 274, "y": 760, "w": 161, "ch": 13, "s": ["400"] }, - "Varta": { - "x": 449, - "y": 760, - "w": 61, - "ch": 13, - "s": ["300", "400", "500", "600", "700"] - }, - "Vast Shadow": { "x": 524, "y": 760, "w": 227, "ch": 13, "s": ["400"] }, - "Vazirmatn": { - "x": 765, - "y": 760, - "w": 117, - "ch": 13, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Vend Sans": { - "x": 896, - "y": 760, - "w": 121, - "ch": 13, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Vesper Libre": { - "x": 1031, - "y": 760, - "w": 136, - "ch": 13, - "s": ["400", "500", "700", "900"] - }, - "Viaoda Libre": { "x": 0, "y": 0, "w": 126, "ch": 14, "s": ["400"] }, - "Vibes": { "x": 140, "y": 0, "w": 53, "ch": 14, "s": ["400"] }, - "Vibur": { "x": 207, "y": 0, "w": 61, "ch": 14, "s": ["400"] }, - "Victor Mono": { - "x": 282, - "y": 0, - "w": 167, - "ch": 14, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Vidaloka": { "x": 463, "y": 0, "w": 99, "ch": 14, "s": ["400"] }, - "Viga": { "x": 576, "y": 0, "w": 55, "ch": 14, "s": ["400"] }, - "Vina Sans": { "x": 645, "y": 0, "w": 86, "ch": 14, "s": ["400"] }, - "Voces": { "x": 745, "y": 0, "w": 72, "ch": 14, "s": ["400"] }, - "Volkhov": { - "x": 831, - "y": 0, - "w": 104, - "ch": 14, - "s": ["400", "400i", "700", "700i"] - }, - "Vollkorn": { - "x": 949, - "y": 0, - "w": 99, - "ch": 14, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Vollkorn SC": { - "x": 0, - "y": 40, - "w": 166, - "ch": 14, - "s": ["400", "600", "700", "900"] - }, - "Voltaire": { "x": 180, "y": 40, "w": 73, "ch": 14, "s": ["400"] }, - "VT323": { "x": 267, "y": 40, "w": 56, "ch": 14, "s": ["400"] }, - "Vujahday Script": { "x": 337, "y": 40, "w": 151, "ch": 14, "s": ["400"] }, - "Waiting for the Sunrise": { - "x": 502, - "y": 40, - "w": 230, - "ch": 14, - "s": ["400"] - }, - "Wallpoet": { "x": 746, "y": 40, "w": 127, "ch": 14, "s": ["400"] }, - "Walter Turncoat": { "x": 887, "y": 40, "w": 206, "ch": 14, "s": ["400"] }, - "Warnes": { "x": 0, "y": 80, "w": 120, "ch": 14, "s": ["400"] }, - "Water Brush": { "x": 134, "y": 80, "w": 116, "ch": 14, "s": ["400"] }, - "Waterfall": { "x": 264, "y": 80, "w": 77, "ch": 14, "s": ["400"] }, - "Wavefont": { - "x": 355, - "y": 80, - "w": 28, - "ch": 14, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "WDXL Lubrifont JP N": { - "x": 397, - "y": 80, - "w": 185, - "ch": 14, - "s": ["400"] - }, - "WDXL Lubrifont SC": { - "x": 596, - "y": 80, - "w": 170, - "ch": 14, - "s": ["400"] - }, - "WDXL Lubrifont TC": { - "x": 780, - "y": 80, - "w": 168, - "ch": 14, - "s": ["400"] - }, - "Wellfleet": { "x": 962, "y": 80, "w": 117, "ch": 14, "s": ["400"] }, - "Wendy One": { "x": 0, "y": 120, "w": 142, "ch": 14, "s": ["400"] }, - "Whisper": { "x": 156, "y": 120, "w": 76, "ch": 14, "s": ["400"] }, - "WindSong": { "x": 246, "y": 120, "w": 133, "ch": 14, "s": ["400", "500"] }, - "Winky Rough": { - "x": 393, - "y": 120, - "w": 139, - "ch": 14, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Winky Sans": { - "x": 546, - "y": 120, - "w": 120, - "ch": 14, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Wire One": { "x": 680, "y": 120, "w": 57, "ch": 14, "s": ["400"] }, - "Wittgenstein": { - "x": 751, - "y": 120, - "w": 151, - "ch": 14, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Wix Madefor Display": { - "x": 916, - "y": 120, - "w": 238, - "ch": 14, - "s": ["400", "500", "600", "700", "800"] - }, - "Wix Madefor Text": { - "x": 0, - "y": 160, - "w": 202, - "ch": 14, - "s": [ - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i" - ] - }, - "Work Sans": { - "x": 216, - "y": 160, - "w": 132, - "ch": 14, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Workbench": { "x": 362, "y": 160, "w": 116, "ch": 14, "s": ["400"] }, - "Xanh Mono": { - "x": 492, - "y": 160, - "w": 116, - "ch": 14, - "s": ["400", "400i"] - }, - "Yaldevi": { - "x": 622, - "y": 160, - "w": 83, - "ch": 14, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Yanone Kaffeesatz": { - "x": 719, - "y": 160, - "w": 142, - "ch": 14, - "s": ["200", "300", "400", "500", "600", "700"] - }, - "Yantramanav": { - "x": 875, - "y": 160, - "w": 138, - "ch": 14, - "s": ["100", "300", "400", "500", "700", "900"] - }, - "Yarndings 12": { "x": 0, "y": 200, "w": 226, "ch": 14, "s": ["400"] }, - "Yarndings 12 Charted": { - "x": 240, - "y": 200, - "w": 365, - "ch": 14, - "s": ["400"] - }, - "Yarndings 20": { "x": 619, "y": 200, "w": 219, "ch": 14, "s": ["400"] }, - "Yarndings 20 Charted": { - "x": 0, - "y": 240, - "w": 357, - "ch": 14, - "s": ["400"] - }, - "Yatra One": { "x": 371, "y": 240, "w": 127, "ch": 14, "s": ["400"] }, - "Yellowtail": { "x": 512, "y": 240, "w": 93, "ch": 14, "s": ["400"] }, - "Yeon Sung": { "x": 619, "y": 240, "w": 107, "ch": 14, "s": ["400"] }, - "Yeseva One": { "x": 740, "y": 240, "w": 144, "ch": 14, "s": ["400"] }, - "Yesteryear": { "x": 898, "y": 240, "w": 94, "ch": 14, "s": ["400"] }, - "Yomogi": { "x": 1006, "y": 240, "w": 80, "ch": 14, "s": ["400"] }, - "Young Serif": { "x": 0, "y": 280, "w": 149, "ch": 14, "s": ["400"] }, - "Yrsa": { - "x": 163, - "y": 280, - "w": 49, - "ch": 14, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Ysabeau": { - "x": 226, - "y": 280, - "w": 88, - "ch": 14, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Ysabeau Infant": { - "x": 328, - "y": 280, - "w": 161, - "ch": 14, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Ysabeau Office": { - "x": 503, - "y": 280, - "w": 156, - "ch": 14, - "s": [ - "100", - "100i", - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Ysabeau SC": { - "x": 673, - "y": 280, - "w": 130, - "ch": 14, - "s": ["100", "200", "300", "400", "500", "600", "700", "800", "900"] - }, - "Yuji Boku": { "x": 817, "y": 280, "w": 135, "ch": 14, "s": ["400"] }, - "Yuji Hentaigana Akari": { - "x": 0, - "y": 320, - "w": 335, - "ch": 14, - "s": ["400"] - }, - "Yuji Hentaigana Akebono": { - "x": 349, - "y": 320, - "w": 374, - "ch": 14, - "s": ["400"] - }, - "Yuji Mai": { "x": 737, "y": 320, "w": 117, "ch": 14, "s": ["400"] }, - "Yuji Syuku": { "x": 868, "y": 320, "w": 144, "ch": 14, "s": ["400"] }, - "Yusei Magic": { "x": 1026, "y": 320, "w": 138, "ch": 14, "s": ["400"] }, - "Zain": { - "x": 0, - "y": 360, - "w": 54, - "ch": 14, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Zalando Sans": { - "x": 68, - "y": 360, - "w": 161, - "ch": 14, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Zalando Sans Expanded": { - "x": 243, - "y": 360, - "w": 335, - "ch": 14, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "Zalando Sans SemiExpanded": { - "x": 592, - "y": 360, - "w": 361, - "ch": 14, - "s": [ - "200", - "200i", - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i", - "800", - "800i", - "900", - "900i" - ] - }, - "ZCOOL KuaiLe": { "x": 967, "y": 360, "w": 180, "ch": 14, "s": ["400"] }, - "ZCOOL QingKe HuangYou": { - "x": 0, - "y": 400, - "w": 222, - "ch": 14, - "s": ["400"] - }, - "ZCOOL XiaoWei": { "x": 236, "y": 400, "w": 173, "ch": 14, "s": ["400"] }, - "Zen Antique": { "x": 423, "y": 400, "w": 149, "ch": 14, "s": ["400"] }, - "Zen Antique Soft": { - "x": 586, - "y": 400, - "w": 204, - "ch": 14, - "s": ["400"] - }, - "Zen Dots": { "x": 804, "y": 400, "w": 147, "ch": 14, "s": ["400"] }, - "Zen Kaku Gothic Antique": { - "x": 0, - "y": 440, - "w": 267, - "ch": 14, - "s": ["300", "400", "500", "700", "900"] - }, - "Zen Kaku Gothic New": { - "x": 281, - "y": 440, - "w": 231, - "ch": 14, - "s": ["300", "400", "500", "700", "900"] - }, - "Zen Kurenaido": { "x": 526, "y": 440, "w": 145, "ch": 14, "s": ["400"] }, - "Zen Loop": { "x": 685, "y": 440, "w": 65, "ch": 14, "s": ["400", "400i"] }, - "Zen Maru Gothic": { - "x": 764, - "y": 440, - "w": 181, - "ch": 14, - "s": ["300", "400", "500", "700", "900"] - }, - "Zen Old Mincho": { - "x": 959, - "y": 440, - "w": 173, - "ch": 14, - "s": ["400", "500", "600", "700", "900"] - }, - "Zen Tokyo Zoo": { "x": 0, "y": 480, "w": 154, "ch": 14, "s": ["400"] }, - "Zeyada": { "x": 168, "y": 480, "w": 70, "ch": 14, "s": ["400"] }, - "Zhi Mang Xing": { "x": 252, "y": 480, "w": 121, "ch": 14, "s": ["400"] }, - "Zilla Slab": { - "x": 387, - "y": 480, - "w": 102, - "ch": 14, - "s": [ - "300", - "300i", - "400", - "400i", - "500", - "500i", - "600", - "600i", - "700", - "700i" - ] - }, - "Zilla Slab Highlight": { - "x": 503, - "y": 480, - "w": 207, - "ch": 14, - "s": ["400", "700"] - } - } -} diff --git a/apps/web/public/fonts/font-chunk-0.avif b/apps/web/public/fonts/font-chunk-0.avif deleted file mode 100644 index 719b4235..00000000 Binary files a/apps/web/public/fonts/font-chunk-0.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-1.avif b/apps/web/public/fonts/font-chunk-1.avif deleted file mode 100644 index c276430b..00000000 Binary files a/apps/web/public/fonts/font-chunk-1.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-10.avif b/apps/web/public/fonts/font-chunk-10.avif deleted file mode 100644 index 9761e954..00000000 Binary files a/apps/web/public/fonts/font-chunk-10.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-11.avif b/apps/web/public/fonts/font-chunk-11.avif deleted file mode 100644 index d4f788e0..00000000 Binary files a/apps/web/public/fonts/font-chunk-11.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-12.avif b/apps/web/public/fonts/font-chunk-12.avif deleted file mode 100644 index 91e643ae..00000000 Binary files a/apps/web/public/fonts/font-chunk-12.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-13.avif b/apps/web/public/fonts/font-chunk-13.avif deleted file mode 100644 index 6a507e8b..00000000 Binary files a/apps/web/public/fonts/font-chunk-13.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-14.avif b/apps/web/public/fonts/font-chunk-14.avif deleted file mode 100644 index f67ab51b..00000000 Binary files a/apps/web/public/fonts/font-chunk-14.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-2.avif b/apps/web/public/fonts/font-chunk-2.avif deleted file mode 100644 index bc3ca018..00000000 Binary files a/apps/web/public/fonts/font-chunk-2.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-3.avif b/apps/web/public/fonts/font-chunk-3.avif deleted file mode 100644 index a5b9dd60..00000000 Binary files a/apps/web/public/fonts/font-chunk-3.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-4.avif b/apps/web/public/fonts/font-chunk-4.avif deleted file mode 100644 index 505fcb25..00000000 Binary files a/apps/web/public/fonts/font-chunk-4.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-5.avif b/apps/web/public/fonts/font-chunk-5.avif deleted file mode 100644 index 7d8c0216..00000000 Binary files a/apps/web/public/fonts/font-chunk-5.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-6.avif b/apps/web/public/fonts/font-chunk-6.avif deleted file mode 100644 index d318967d..00000000 Binary files a/apps/web/public/fonts/font-chunk-6.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-7.avif b/apps/web/public/fonts/font-chunk-7.avif deleted file mode 100644 index 0dcb81d7..00000000 Binary files a/apps/web/public/fonts/font-chunk-7.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-8.avif b/apps/web/public/fonts/font-chunk-8.avif deleted file mode 100644 index 63b0e35a..00000000 Binary files a/apps/web/public/fonts/font-chunk-8.avif and /dev/null differ diff --git a/apps/web/public/fonts/font-chunk-9.avif b/apps/web/public/fonts/font-chunk-9.avif deleted file mode 100644 index e7936bf0..00000000 Binary files a/apps/web/public/fonts/font-chunk-9.avif and /dev/null differ diff --git a/apps/web/public/icons/android-icon-144x144.png b/apps/web/public/icons/android-icon-144x144.png deleted file mode 100644 index 7320ece7..00000000 Binary files a/apps/web/public/icons/android-icon-144x144.png and /dev/null differ diff --git a/apps/web/public/icons/android-icon-192x192.png b/apps/web/public/icons/android-icon-192x192.png deleted file mode 100644 index f534f429..00000000 Binary files a/apps/web/public/icons/android-icon-192x192.png and /dev/null differ diff --git a/apps/web/public/icons/android-icon-36x36.png b/apps/web/public/icons/android-icon-36x36.png deleted file mode 100644 index 6b8db020..00000000 Binary files a/apps/web/public/icons/android-icon-36x36.png and /dev/null differ diff --git a/apps/web/public/icons/android-icon-48x48.png b/apps/web/public/icons/android-icon-48x48.png deleted file mode 100644 index 30a68fa5..00000000 Binary files a/apps/web/public/icons/android-icon-48x48.png and /dev/null differ diff --git a/apps/web/public/icons/android-icon-72x72.png b/apps/web/public/icons/android-icon-72x72.png deleted file mode 100644 index e4019c84..00000000 Binary files a/apps/web/public/icons/android-icon-72x72.png and /dev/null differ diff --git a/apps/web/public/icons/android-icon-96x96.png b/apps/web/public/icons/android-icon-96x96.png deleted file mode 100644 index 85591ab4..00000000 Binary files a/apps/web/public/icons/android-icon-96x96.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-114x114.png b/apps/web/public/icons/apple-icon-114x114.png deleted file mode 100644 index c776e3f9..00000000 Binary files a/apps/web/public/icons/apple-icon-114x114.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-120x120.png b/apps/web/public/icons/apple-icon-120x120.png deleted file mode 100644 index 76604df8..00000000 Binary files a/apps/web/public/icons/apple-icon-120x120.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-144x144.png b/apps/web/public/icons/apple-icon-144x144.png deleted file mode 100644 index 7320ece7..00000000 Binary files a/apps/web/public/icons/apple-icon-144x144.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-152x152.png b/apps/web/public/icons/apple-icon-152x152.png deleted file mode 100644 index eb5ef0df..00000000 Binary files a/apps/web/public/icons/apple-icon-152x152.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-180x180.png b/apps/web/public/icons/apple-icon-180x180.png deleted file mode 100644 index b90e62fb..00000000 Binary files a/apps/web/public/icons/apple-icon-180x180.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-57x57.png b/apps/web/public/icons/apple-icon-57x57.png deleted file mode 100644 index 7cfb2e56..00000000 Binary files a/apps/web/public/icons/apple-icon-57x57.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-60x60.png b/apps/web/public/icons/apple-icon-60x60.png deleted file mode 100644 index 1d90a370..00000000 Binary files a/apps/web/public/icons/apple-icon-60x60.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-72x72.png b/apps/web/public/icons/apple-icon-72x72.png deleted file mode 100644 index e4019c84..00000000 Binary files a/apps/web/public/icons/apple-icon-72x72.png and /dev/null differ diff --git a/apps/web/public/icons/apple-icon-76x76.png b/apps/web/public/icons/apple-icon-76x76.png deleted file mode 100644 index 34575f42..00000000 Binary files a/apps/web/public/icons/apple-icon-76x76.png and /dev/null differ diff --git a/apps/web/public/icons/favicon-16x16.png b/apps/web/public/icons/favicon-16x16.png deleted file mode 100644 index 96db3a2f..00000000 Binary files a/apps/web/public/icons/favicon-16x16.png and /dev/null differ diff --git a/apps/web/public/icons/favicon-32x32.png b/apps/web/public/icons/favicon-32x32.png deleted file mode 100644 index f8f589dc..00000000 Binary files a/apps/web/public/icons/favicon-32x32.png and /dev/null differ diff --git a/apps/web/public/icons/favicon-96x96.png b/apps/web/public/icons/favicon-96x96.png deleted file mode 100644 index 85591ab4..00000000 Binary files a/apps/web/public/icons/favicon-96x96.png and /dev/null differ diff --git a/apps/web/public/icons/ms-icon-144x144.png b/apps/web/public/icons/ms-icon-144x144.png deleted file mode 100644 index 7320ece7..00000000 Binary files a/apps/web/public/icons/ms-icon-144x144.png and /dev/null differ diff --git a/apps/web/public/icons/ms-icon-150x150.png b/apps/web/public/icons/ms-icon-150x150.png deleted file mode 100644 index 248ef48a..00000000 Binary files a/apps/web/public/icons/ms-icon-150x150.png and /dev/null differ diff --git a/apps/web/public/icons/ms-icon-310x310.png b/apps/web/public/icons/ms-icon-310x310.png deleted file mode 100644 index 950a3d6b..00000000 Binary files a/apps/web/public/icons/ms-icon-310x310.png and /dev/null differ diff --git a/apps/web/public/icons/ms-icon-70x70.png b/apps/web/public/icons/ms-icon-70x70.png deleted file mode 100644 index 7b9c2694..00000000 Binary files a/apps/web/public/icons/ms-icon-70x70.png and /dev/null differ diff --git a/apps/web/public/landing-page-dark.png b/apps/web/public/landing-page-dark.png deleted file mode 100644 index 3f0e26c8..00000000 Binary files a/apps/web/public/landing-page-dark.png and /dev/null differ diff --git a/apps/web/public/logos/opencut/icon.svg b/apps/web/public/logos/opencut/icon.svg deleted file mode 100644 index 753ebb1d..00000000 --- a/apps/web/public/logos/opencut/icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/apps/web/public/logos/opencut/logo-light.svg b/apps/web/public/logos/opencut/logo-light.svg deleted file mode 100644 index 3dea5278..00000000 --- a/apps/web/public/logos/opencut/logo-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/logos/opencut/logo.svg b/apps/web/public/logos/opencut/logo.svg deleted file mode 100644 index 179db068..00000000 --- a/apps/web/public/logos/opencut/logo.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/web/public/logos/opencut/svg/logo.svg b/apps/web/public/logos/opencut/svg/logo.svg deleted file mode 100644 index 47c19566..00000000 --- a/apps/web/public/logos/opencut/svg/logo.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/apps/web/public/logos/opencut/symbol-light.svg b/apps/web/public/logos/opencut/symbol-light.svg deleted file mode 100644 index 9d43da68..00000000 --- a/apps/web/public/logos/opencut/symbol-light.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/logos/opencut/symbol.svg b/apps/web/public/logos/opencut/symbol.svg deleted file mode 100644 index 4b9f2b84..00000000 --- a/apps/web/public/logos/opencut/symbol.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/apps/web/public/logos/opencut/text-light.svg b/apps/web/public/logos/opencut/text-light.svg deleted file mode 100644 index d30e5128..00000000 --- a/apps/web/public/logos/opencut/text-light.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/apps/web/public/logos/opencut/text.svg b/apps/web/public/logos/opencut/text.svg deleted file mode 100644 index d5013ea8..00000000 --- a/apps/web/public/logos/opencut/text.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/logos/others/fal.svg b/apps/web/public/logos/others/fal.svg deleted file mode 100644 index 6562afd5..00000000 --- a/apps/web/public/logos/others/fal.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/logos/others/vercel.svg b/apps/web/public/logos/others/vercel.svg deleted file mode 100644 index 483c970d..00000000 --- a/apps/web/public/logos/others/vercel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/manifest.json b/apps/web/public/manifest.json deleted file mode 100644 index 3b05a125..00000000 --- a/apps/web/public/manifest.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "OpenCut", - "description": "A simple but powerful video editor that gets the job done. In your browser.", - "display": "standalone", - "start_url": "/", - "icons": [ - { - "src": "/icons/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "/icons/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "/icons/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "/icons/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "/icons/android-icon-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - }, - { - "src": "/icons/android-icon-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": "4.0" - } - ] -} diff --git a/apps/web/public/open-graph/changelog.jpg b/apps/web/public/open-graph/changelog.jpg deleted file mode 100644 index c0a90c3d..00000000 Binary files a/apps/web/public/open-graph/changelog.jpg and /dev/null differ diff --git a/apps/web/public/open-graph/default.jpg b/apps/web/public/open-graph/default.jpg deleted file mode 100644 index d45c0854..00000000 Binary files a/apps/web/public/open-graph/default.jpg and /dev/null differ diff --git a/apps/web/public/open-graph/roadmap.jpg b/apps/web/public/open-graph/roadmap.jpg deleted file mode 100644 index 63374c4f..00000000 Binary files a/apps/web/public/open-graph/roadmap.jpg and /dev/null differ diff --git a/apps/web/public/platform-guides/tiktok-blueprint.png b/apps/web/public/platform-guides/tiktok-blueprint.png deleted file mode 100644 index e87eb36d..00000000 Binary files a/apps/web/public/platform-guides/tiktok-blueprint.png and /dev/null differ diff --git a/apps/web/public/shapes/circle.svg b/apps/web/public/shapes/circle.svg deleted file mode 100644 index 2de141cd..00000000 --- a/apps/web/public/shapes/circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/shapes/diamond.svg b/apps/web/public/shapes/diamond.svg deleted file mode 100644 index a0a31aa8..00000000 --- a/apps/web/public/shapes/diamond.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/shapes/hexagon.svg b/apps/web/public/shapes/hexagon.svg deleted file mode 100644 index e50cd91f..00000000 --- a/apps/web/public/shapes/hexagon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/apps/web/public/shapes/square.svg b/apps/web/public/shapes/square.svg deleted file mode 100644 index 58a0f6ad..00000000 --- a/apps/web/public/shapes/square.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/public/shapes/star.svg b/apps/web/public/shapes/star.svg deleted file mode 100644 index f646764b..00000000 --- a/apps/web/public/shapes/star.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/apps/web/public/shapes/triangle.svg b/apps/web/public/shapes/triangle.svg deleted file mode 100644 index 9c1c5a41..00000000 --- a/apps/web/public/shapes/triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/web/scripts/generate-font-sprites.ts b/apps/web/scripts/generate-font-sprites.ts deleted file mode 100644 index f0d98bc8..00000000 --- a/apps/web/scripts/generate-font-sprites.ts +++ /dev/null @@ -1,281 +0,0 @@ -/** - * Generates font sprite atlas for the font picker. - * - * Downloads Google Fonts from Fontsource, renders each font name as a sprite, - * packs them into chunk images, and outputs a JSON atlas + AVIF images. - * - * Run: npx tsx scripts/generate-font-sprites.ts - * Deps: @napi-rs/canvas sharp (install as devDependencies) - */ - -import { createCanvas, GlobalFonts } from "@napi-rs/canvas"; -import sharp from "sharp"; -import { mkdir, writeFile, readFile } from "node:fs/promises"; -import { existsSync } from "node:fs"; -import { join, dirname } from "node:path"; -import { fileURLToPath } from "node:url"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); - -const FONT_SIZE = 24; -const ROW_HEIGHT = 40; -const CANVAS_WIDTH = 1200; -const MAX_CHUNK_HEIGHT = 800; -const PADDING_X = 14; -const WIDTH_BUFFER = 8; -const CONCURRENT_DOWNLOADS = 30; - -const OUTPUT_DIR = join(__dirname, "..", "public", "fonts"); -const CACHE_DIR = join(__dirname, "..", ".font-cache"); -const FONTSOURCE_API = "https://api.fontsource.org/v1/fonts"; - -interface FontsourceFont { - id: string; - family: string; - subsets: string[]; - weights: number[]; - styles: string[]; - category: string; - type: string; -} - -interface MeasuredFont { - family: string; - width: number; - styles: string[]; -} - -interface PackedFont { - family: string; - x: number; - y: number; - w: number; -} - -interface AtlasEntry { - x: number; - y: number; - w: number; - ch: number; - s: string[]; -} - -async function fetchFontList(): Promise { - console.log("Fetching font list from Fontsource..."); - const response = await fetch(FONTSOURCE_API); - if (!response.ok) throw new Error(`Fontsource API error: ${response.status}`); - - const data: FontsourceFont[] = await response.json(); - const filtered = data.filter( - (font) => - font.type === "google" && - font.subsets.includes("latin") && - font.weights.includes(400), - ); - - console.log( - ` ${filtered.length} Google fonts with Latin subset + 400 weight`, - ); - return filtered; -} - -async function downloadFont({ id }: { id: string }): Promise { - const cachePath = join(CACHE_DIR, `${id}.woff2`); - - if (existsSync(cachePath)) { - return readFile(cachePath); - } - - // Fontsource CDN serves woff2 for all Google fonts - const url = `https://cdn.jsdelivr.net/fontsource/fonts/${id}@latest/latin-400-normal.woff2`; - try { - const response = await fetch(url); - if (!response.ok) throw new Error(`HTTP ${response.status}`); - const buffer = Buffer.from(await response.arrayBuffer()); - await writeFile(cachePath, buffer); - return buffer; - } catch { - return null; - } -} - -async function downloadAllFonts({ - fonts, - concurrency, -}: { - fonts: FontsourceFont[]; - concurrency: number; -}): Promise> { - console.log( - `Downloading ${fonts.length} font files (${concurrency} concurrent)...`, - ); - const results = new Map(); - let nextIndex = 0; - let completed = 0; - - async function worker() { - while (nextIndex < fonts.length) { - const index = nextIndex++; - const font = fonts[index]; - const buffer = await downloadFont({ id: font.id }); - if (buffer) results.set(font.id, buffer); - completed++; - if (completed % 100 === 0 || completed === fonts.length) { - process.stdout.write(`\r ${completed}/${fonts.length}`); - } - } - } - - await Promise.all(Array.from({ length: concurrency }, () => worker())); - console.log(`\n Downloaded ${results.size}/${fonts.length} fonts`); - return results; -} - -function measureFonts({ - fonts, - fontBuffers, -}: { - fonts: FontsourceFont[]; - fontBuffers: Map; -}): MeasuredFont[] { - console.log("Registering fonts and measuring text..."); - const measured: MeasuredFont[] = []; - const canvas = createCanvas(CANVAS_WIDTH, ROW_HEIGHT); - const ctx = canvas.getContext("2d"); - - for (const font of fonts) { - const buffer = fontBuffers.get(font.id); - if (!buffer) continue; - - try { - const ok = GlobalFonts.register(buffer, font.family); - if (!ok) continue; - - ctx.font = `${FONT_SIZE}px "${font.family}"`; - const metrics = ctx.measureText(font.family); - const width = Math.ceil(metrics.width) + WIDTH_BUFFER; - - const styles: string[] = []; - for (const weight of font.weights) { - if (font.styles.includes("normal")) styles.push(String(weight)); - if (font.styles.includes("italic")) styles.push(`${weight}i`); - } - - measured.push({ family: font.family, width, styles }); - } catch { - // skip fonts that fail to register - } - } - - measured.sort((a, b) => a.family.localeCompare(b.family)); - console.log(` ${measured.length} fonts measured`); - return measured; -} - -function packIntoChunks({ measured }: { measured: MeasuredFont[] }): { - atlas: Record; - chunks: PackedFont[][]; -} { - console.log("Packing into sprite chunks..."); - const atlas: Record = {}; - const chunks: PackedFont[][] = [[]]; - let chunkIndex = 0; - let cursorX = 0; - let cursorY = 0; - - for (const font of measured) { - // New row if doesn't fit horizontally - if (cursorX + font.width > CANVAS_WIDTH) { - cursorX = 0; - cursorY += ROW_HEIGHT; - } - - // New chunk if doesn't fit vertically - if (cursorY + ROW_HEIGHT > MAX_CHUNK_HEIGHT) { - chunkIndex++; - chunks.push([]); - cursorX = 0; - cursorY = 0; - } - - // Same data goes to BOTH the atlas and the chunk render list - const x = cursorX; - const y = cursorY; - - atlas[font.family] = { - x, - y, - w: font.width, - ch: chunkIndex, - s: font.styles, - }; - chunks[chunkIndex].push({ family: font.family, x, y, w: font.width }); - - cursorX += font.width + PADDING_X; - } - - console.log(` ${chunks.length} chunks`); - return { atlas, chunks }; -} - -async function renderChunks({ - chunks, -}: { - chunks: PackedFont[][]; -}): Promise { - console.log("Rendering sprite chunks..."); - - for (let i = 0; i < chunks.length; i++) { - const chunk = chunks[i]; - const chunkHeight = Math.max(...chunk.map((f) => f.y)) + ROW_HEIGHT; - - const canvas = createCanvas(CANVAS_WIDTH, chunkHeight); - const ctx = canvas.getContext("2d"); - - for (const font of chunk) { - ctx.font = `${FONT_SIZE}px "${font.family}"`; - ctx.fillStyle = "#000000"; - ctx.textBaseline = "middle"; - ctx.fillText(font.family, font.x, font.y + ROW_HEIGHT / 2); - } - - const pngBuffer = canvas.toBuffer("image/png"); - await sharp(pngBuffer) - .avif({ quality: 80 }) - .toFile(join(OUTPUT_DIR, `font-chunk-${i}.avif`)); - - console.log( - ` Chunk ${i}: ${chunk.length} fonts, ${CANVAS_WIDTH}×${chunkHeight}`, - ); - } -} - -async function main() { - await mkdir(OUTPUT_DIR, { recursive: true }); - await mkdir(CACHE_DIR, { recursive: true }); - - const fonts = await fetchFontList(); - const fontBuffers = await downloadAllFonts({ - fonts, - concurrency: CONCURRENT_DOWNLOADS, - }); - const measured = measureFonts({ fonts, fontBuffers }); - const { atlas, chunks } = packIntoChunks({ measured }); - await renderChunks({ chunks }); - - // Write atlas JSON (compact for smaller file size) - await writeFile( - join(OUTPUT_DIR, "font-atlas.json"), - JSON.stringify({ fonts: atlas }), - ); - - const totalFonts = Object.keys(atlas).length; - console.log( - `\nDone! ${totalFonts} fonts in ${chunks.length} chunks → ${OUTPUT_DIR}`, - ); -} - -main().catch((error) => { - console.error("Failed:", error); - process.exit(1); -}); diff --git a/apps/web/src/actions/components/shortcuts-dialog.tsx b/apps/web/src/actions/components/shortcuts-dialog.tsx deleted file mode 100644 index cd9c0242..00000000 --- a/apps/web/src/actions/components/shortcuts-dialog.tsx +++ /dev/null @@ -1,229 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import { toast } from "sonner"; -import { - type KeyboardShortcut, - useKeyboardShortcutsHelp, -} from "@/actions/use-keyboard-shortcuts-help"; -import { useKeybindingsStore } from "@/actions/keybindings-store"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogBody, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; - -export function ShortcutsDialog({ - isOpen, - onOpenChange, -}: { - isOpen: boolean; - onOpenChange: (open: boolean) => void; -}) { - const [recordingShortcut, setRecordingShortcut] = - useState(null); - - const { - updateKeybinding, - removeKeybinding, - getKeybindingString, - validateKeybinding, - getKeybindingsForAction, - setIsRecording, - resetToDefaults, - isRecording, - } = useKeybindingsStore(); - - const { shortcuts } = useKeyboardShortcutsHelp(); - - const categories = Array.from(new Set(shortcuts.map((s) => s.category))); - - useEffect(() => { - if (!isRecording || !recordingShortcut) return; - - const handleKeyDown = (e: KeyboardEvent) => { - e.preventDefault(); - e.stopPropagation(); - - const keyString = getKeybindingString(e); - if (keyString) { - const conflict = validateKeybinding( - keyString, - recordingShortcut.action, - ); - if (conflict) { - toast.error( - `Key "${keyString}" is already bound to "${conflict.existingAction}"`, - ); - setRecordingShortcut(null); - return; - } - - const oldKeys = getKeybindingsForAction(recordingShortcut.action); - for (const key of oldKeys) { - removeKeybinding(key); - } - - updateKeybinding(keyString, recordingShortcut.action); - - setIsRecording(false); - setRecordingShortcut(null); - } - }; - - const handleClickOutside = () => { - setRecordingShortcut(null); - setIsRecording(false); - }; - - document.addEventListener("keydown", handleKeyDown); - document.addEventListener("click", handleClickOutside); - - return () => { - document.removeEventListener("keydown", handleKeyDown); - document.removeEventListener("click", handleClickOutside); - }; - }, [ - recordingShortcut, - getKeybindingString, - updateKeybinding, - removeKeybinding, - validateKeybinding, - getKeybindingsForAction, - setIsRecording, - isRecording, - ]); - - const handleStartRecording = (shortcut: KeyboardShortcut) => { - setRecordingShortcut(shortcut); - setIsRecording(true); - }; - - return ( - - - - Keyboard shortcuts - - - -
- {categories.map((category) => ( -
-

- {category} -

-
- {shortcuts - .filter((shortcut) => shortcut.category === category) - .map((shortcut) => ( - handleStartRecording(shortcut)} - /> - ))} -
-
- ))} -
-
- - - -
-
- ); -} - -function ShortcutItem({ - shortcut, - isRecording, - onStartRecording, -}: { - shortcut: KeyboardShortcut; - isRecording: boolean; - onStartRecording: (params: { shortcut: KeyboardShortcut }) => void; -}) { - const displayKeys = shortcut.keys.filter((key: string) => { - if ( - key.includes("Cmd") && - shortcut.keys.includes(key.replace("Cmd", "Ctrl")) - ) - return false; - - return true; - }); - - return ( -
-
- {shortcut.icon && ( -
{shortcut.icon}
- )} - {shortcut.description} -
-
- {displayKeys.map((key: string, index: number) => ( -
-
- {key.split("+").map((keyPart: string, partIndex: number) => { - const keyId = `${shortcut.id}-${index}-${partIndex}`; - return ( - onStartRecording({ shortcut })} - > - {keyPart} - - ); - })} -
- {index < displayKeys.length - 1 && ( - or - )} -
- ))} -
-
- ); -} - -function EditableShortcutKey({ - children, - isRecording, - onStartRecording, -}: { - children: React.ReactNode; - isRecording: boolean; - onStartRecording: () => void; -}) { - const handleClick = (e: React.MouseEvent) => { - e.preventDefault(); - e.stopPropagation(); - onStartRecording(); - }; - - return ( - - ); -} diff --git a/apps/web/src/actions/definitions.ts b/apps/web/src/actions/definitions.ts deleted file mode 100644 index 6f0ba700..00000000 --- a/apps/web/src/actions/definitions.ts +++ /dev/null @@ -1,209 +0,0 @@ -import type { - KeybindingConfig, - ShortcutKey, -} from "@/actions/keybinding"; -import type { TActionWithOptionalArgs } from "./types"; - -export type TActionCategory = - | "playback" - | "navigation" - | "editing" - | "selection" - | "history" - | "timeline" - | "controls" - | "assets"; - -export interface TActionBaseDefinition { - description: string; - category: TActionCategory; - args?: Record; -} - -export interface TActionDefinition extends TActionBaseDefinition { - defaultShortcuts?: readonly ShortcutKey[]; -} - -export const ACTIONS = { - "toggle-play": { - description: "Play/Pause", - category: "playback", - }, - "stop-playback": { - description: "Stop playback", - category: "playback", - }, - "seek-forward": { - description: "Seek forward 1 second", - category: "playback", - args: { seconds: "number" }, - }, - "seek-backward": { - description: "Seek backward 1 second", - category: "playback", - args: { seconds: "number" }, - }, - "frame-step-forward": { - description: "Frame step forward", - category: "navigation", - }, - "frame-step-backward": { - description: "Frame step backward", - category: "navigation", - }, - "jump-forward": { - description: "Jump forward 5 seconds", - category: "navigation", - args: { seconds: "number" }, - }, - "jump-backward": { - description: "Jump backward 5 seconds", - category: "navigation", - args: { seconds: "number" }, - }, - "goto-start": { - description: "Go to timeline start", - category: "navigation", - }, - "goto-end": { - description: "Go to timeline end", - category: "navigation", - }, - split: { - description: "Split elements at playhead", - category: "editing", - }, - "split-left": { - description: "Split and remove left", - category: "editing", - }, - "split-right": { - description: "Split and remove right", - category: "editing", - }, - "delete-selected": { - description: "Delete current selection", - category: "editing", - }, - "copy-selected": { - description: "Copy selected elements", - category: "editing", - }, - "paste-copied": { - description: "Paste elements at playhead", - category: "editing", - }, - "toggle-snapping": { - description: "Toggle snapping", - category: "editing", - }, - "toggle-ripple-editing": { - description: "Toggle ripple editing", - category: "editing", - }, - "toggle-source-audio": { - description: "Extract or recover source audio", - category: "editing", - }, - "select-all": { - description: "Select all elements", - category: "selection", - }, - "cancel-interaction": { - description: "Cancel current interaction", - category: "controls", - }, - "deselect-all": { - description: "Deselect all elements", - category: "selection", - }, - "duplicate-selected": { - description: "Duplicate selected element", - category: "selection", - }, - "toggle-elements-muted-selected": { - description: "Mute/unmute selected elements", - category: "selection", - }, - "toggle-elements-visibility-selected": { - description: "Show/hide selected elements", - category: "selection", - }, - "toggle-bookmark": { - description: "Toggle bookmark at playhead", - category: "timeline", - }, - undo: { - description: "Undo", - category: "history", - }, - redo: { - description: "Redo", - category: "history", - }, - "remove-media-asset": { - description: "Remove media asset", - category: "assets", - args: { projectId: "string", assetId: "string" }, - }, - "remove-media-assets": { - description: "Remove media assets", - category: "assets", - args: { projectId: "string", assetIds: "string[]" }, - }, -} as const satisfies Record; - -export type TAction = keyof typeof ACTIONS; - -const ACTION_DEFAULT_SHORTCUTS = { - "toggle-play": ["space", "k"], - "seek-forward": ["l"], - "seek-backward": ["j"], - "frame-step-forward": ["right"], - "frame-step-backward": ["left"], - "jump-forward": ["shift+right"], - "jump-backward": ["shift+left"], - "goto-start": ["home", "enter"], - "goto-end": ["end"], - split: ["s"], - "split-left": ["q"], - "split-right": ["w"], - "delete-selected": ["backspace", "delete"], - "copy-selected": ["ctrl+c"], - "paste-copied": ["ctrl+v"], - "toggle-snapping": ["n"], - "select-all": ["ctrl+a"], - "cancel-interaction": ["escape"], - "duplicate-selected": ["ctrl+d"], - undo: ["ctrl+z"], - redo: ["ctrl+shift+z", "ctrl+y"], -} as const satisfies Partial>; - -const ACTION_DEFAULT_SHORTCUTS_BY_ACTION: Partial< - Record -> = ACTION_DEFAULT_SHORTCUTS; - -export function getActionDefinition({ - action, -}: { - action: TAction; -}): TActionDefinition { - return { - ...ACTIONS[action], - defaultShortcuts: ACTION_DEFAULT_SHORTCUTS_BY_ACTION[action], - }; -} - -export function getDefaultShortcuts(): KeybindingConfig { - const shortcuts: KeybindingConfig = {}; - - for (const [action, defaultShortcuts] of Object.entries( - ACTION_DEFAULT_SHORTCUTS, - ) as Array<[TActionWithOptionalArgs, readonly ShortcutKey[]]>) { - for (const shortcut of defaultShortcuts) { - shortcuts[shortcut] = action; - } - } - - return shortcuts; -} diff --git a/apps/web/src/actions/index.ts b/apps/web/src/actions/index.ts deleted file mode 100644 index 801a846a..00000000 --- a/apps/web/src/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./definitions"; -export * from "./types"; -export * from "./registry"; diff --git a/apps/web/src/actions/keybinding.ts b/apps/web/src/actions/keybinding.ts deleted file mode 100644 index 65ef4538..00000000 --- a/apps/web/src/actions/keybinding.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { TActionWithOptionalArgs } from "./types"; - -/** - * Alt is also regarded as macOS OPTION (⌥) key - * Ctrl is also regarded as macOS COMMAND (⌘) key (NOTE: this differs from HTML Keyboard spec where COMMAND is Meta key!) - */ -export type ModifierKeys = - | "ctrl" - | "alt" - | "shift" - | "ctrl+shift" - | "alt+shift" - | "ctrl+alt" - | "ctrl+alt+shift"; - -export type Key = - | "a" - | "b" - | "c" - | "d" - | "e" - | "f" - | "g" - | "h" - | "i" - | "j" - | "k" - | "l" - | "m" - | "n" - | "o" - | "p" - | "q" - | "r" - | "s" - | "t" - | "u" - | "v" - | "w" - | "x" - | "y" - | "z" - | "0" - | "1" - | "2" - | "3" - | "4" - | "5" - | "6" - | "7" - | "8" - | "9" - | "up" - | "down" - | "left" - | "right" - | "/" - | "?" - | "." - | "enter" - | "tab" - | "space" - | "escape" - | "esc" - | "backspace" - | "delete" - | "home" - | "end"; -/* eslint-enable */ - -export type ModifierBasedShortcutKey = `${ModifierKeys}+${Key}`; -// Singular keybindings (these will be disabled when an input-ish area has been focused) -export type SingleCharacterShortcutKey = `${Key}`; - -export type ShortcutKey = ModifierBasedShortcutKey | SingleCharacterShortcutKey; - -export type KeybindingConfig = { - [key in ShortcutKey]?: TActionWithOptionalArgs; -}; diff --git a/apps/web/src/actions/keybindings-store.ts b/apps/web/src/actions/keybindings-store.ts deleted file mode 100644 index c0a1a5e2..00000000 --- a/apps/web/src/actions/keybindings-store.ts +++ /dev/null @@ -1,251 +0,0 @@ -"use client"; - -import { create } from "zustand"; -import { persist } from "zustand/middleware"; -import type { TActionWithOptionalArgs } from "@/actions"; -import { getDefaultShortcuts } from "@/actions"; -import { isTypableDOMElement } from "@/utils/browser"; -import { isAppleDevice } from "@/utils/platform"; -import type { KeybindingConfig, ShortcutKey } from "@/actions/keybinding"; -import { runMigrations, CURRENT_VERSION } from "./keybindings/migrations"; - -const defaultKeybindings: KeybindingConfig = getDefaultShortcuts(); - -export interface KeybindingConflict { - key: ShortcutKey; - existingAction: TActionWithOptionalArgs; - newAction: TActionWithOptionalArgs; -} - -interface KeybindingsState { - keybindings: KeybindingConfig; - isCustomized: boolean; - overlayDepth: number; - openOverlayIds: string[]; - isLoadingProject: boolean; - isRecording: boolean; - - updateKeybinding: (key: ShortcutKey, action: TActionWithOptionalArgs) => void; - removeKeybinding: (key: ShortcutKey) => void; - resetToDefaults: () => void; - importKeybindings: (config: KeybindingConfig) => void; - exportKeybindings: () => KeybindingConfig; - openOverlay: (overlayId: string) => void; - closeOverlay: (overlayId: string) => void; - setLoadingProject: (loading: boolean) => void; - setIsRecording: (isRecording: boolean) => void; - validateKeybinding: ( - key: ShortcutKey, - action: TActionWithOptionalArgs, - ) => KeybindingConflict | null; - getKeybindingsForAction: (action: TActionWithOptionalArgs) => ShortcutKey[]; - getKeybindingString: (ev: KeyboardEvent) => ShortcutKey | null; -} - -function isDOMElement(element: EventTarget | null): element is HTMLElement { - return element instanceof HTMLElement; -} - -export const useKeybindingsStore = create()( - persist( - (set, get) => ({ - keybindings: { ...defaultKeybindings }, - isCustomized: false, - overlayDepth: 0, - openOverlayIds: [], - isLoadingProject: false, - isRecording: false, - - openOverlay: (overlayId) => - set((s) => { - const openOverlayIds = s.openOverlayIds.includes(overlayId) - ? s.openOverlayIds - : [...s.openOverlayIds, overlayId]; - const nextOverlayDepth = openOverlayIds.length; - return { - openOverlayIds, - overlayDepth: nextOverlayDepth, - }; - }), - closeOverlay: (overlayId) => - set((s) => { - const openOverlayIds = s.openOverlayIds.filter( - (id) => id !== overlayId, - ); - const nextOverlayDepth = openOverlayIds.length; - return { - openOverlayIds, - overlayDepth: nextOverlayDepth, - }; - }), - setLoadingProject: (loading) => { - set({ isLoadingProject: loading }); - }, - - updateKeybinding: (key: ShortcutKey, action: TActionWithOptionalArgs) => { - set((state) => { - const newKeybindings = { ...state.keybindings }; - newKeybindings[key] = action; - - return { - keybindings: newKeybindings, - isCustomized: true, - }; - }); - }, - - removeKeybinding: (key: ShortcutKey) => { - set((state) => { - const newKeybindings = { ...state.keybindings }; - delete newKeybindings[key]; - - return { - keybindings: newKeybindings, - isCustomized: true, - }; - }); - }, - - resetToDefaults: () => { - set({ - keybindings: { ...defaultKeybindings }, - isCustomized: false, - }); - }, - - importKeybindings: (config: KeybindingConfig) => { - for (const [key] of Object.entries(config)) { - if (typeof key !== "string" || key.length === 0) { - throw new Error(`Invalid key format: ${key}`); - } - } - set({ - keybindings: { ...config }, - isCustomized: true, - }); - }, - - exportKeybindings: () => { - return get().keybindings; - }, - - validateKeybinding: ( - key: ShortcutKey, - action: TActionWithOptionalArgs, - ) => { - const { keybindings } = get(); - const existingAction = keybindings[key]; - - if (existingAction && existingAction !== action) { - return { - key, - existingAction, - newAction: action, - }; - } - - return null; - }, - setIsRecording: (isRecording: boolean) => { - set({ isRecording }); - }, - - getKeybindingsForAction: (action: TActionWithOptionalArgs) => { - const { keybindings } = get(); - return Object.keys(keybindings).filter( - (key) => keybindings[key as ShortcutKey] === action, - ) as ShortcutKey[]; - }, - - getKeybindingString: (ev: KeyboardEvent) => { - return generateKeybindingString(ev) as ShortcutKey | null; - }, - }), - { - name: "opencut-keybindings", - version: CURRENT_VERSION, - partialize: (state) => ({ - keybindings: state.keybindings, - isCustomized: state.isCustomized, - }), - migrate: (persisted, version) => - runMigrations({ state: persisted, fromVersion: version }), - }, - ), -); - -function generateKeybindingString(ev: KeyboardEvent): ShortcutKey | null { - const target = ev.target; - const modifierKey = getActiveModifier(ev); - const key = getPressedKey(ev); - if (!key) return null; - - if (modifierKey) { - if ( - modifierKey === "shift" && - isDOMElement(target) && - isTypableDOMElement({ element: target as HTMLElement }) - ) { - return null; - } - - return `${modifierKey}+${key}` as ShortcutKey; - } - - if ( - isDOMElement(target) && - isTypableDOMElement({ element: target as HTMLElement }) - ) - return null; - - return `${key}` as ShortcutKey; -} - -function getPressedKey(ev: KeyboardEvent): string | null { - const key = (ev.key ?? "").toLowerCase(); - const code = ev.code ?? ""; - - if (code === "Space" || key === " " || key === "spacebar" || key === "space") - return "space"; - - if (key.startsWith("arrow")) return key.slice(5); - - if (key === "escape") return "escape"; - if (key === "tab") return "tab"; - if (key === "home") return "home"; - if (key === "end") return "end"; - if (key === "delete") return "delete"; - if (key === "backspace") return "backspace"; - - if (code.startsWith("Key")) { - const letter = code.slice(3).toLowerCase(); - if (letter.length === 1 && letter >= "a" && letter <= "z") return letter; - } - - // Use physical key position for AZERTY and other non-QWERTY layouts - if (code.startsWith("Digit")) { - const digit = code.slice(5); - if (digit.length === 1 && digit >= "0" && digit <= "9") return digit; - } - - const isDigit = key.length === 1 && key >= "0" && key <= "9"; - if (isDigit) return key; - - if (key === "/" || key === "." || key === "enter") return key; - - return null; -} - -function getActiveModifier(ev: KeyboardEvent): string | null { - const modifierKeys = { - ctrl: isAppleDevice() ? ev.metaKey : ev.ctrlKey, - alt: ev.altKey, - shift: ev.shiftKey, - }; - - const activeModifier = Object.keys(modifierKeys) - .filter((key) => modifierKeys[key as keyof typeof modifierKeys]) - .join("+"); - - return activeModifier === "" ? null : activeModifier; -} diff --git a/apps/web/src/actions/keybindings/migrations/index.ts b/apps/web/src/actions/keybindings/migrations/index.ts deleted file mode 100644 index 71fd81a6..00000000 --- a/apps/web/src/actions/keybindings/migrations/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { v2ToV3 } from "./v2-to-v3"; -import { v3ToV4 } from "./v3-to-v4"; -import { v4ToV5 } from "./v4-to-v5"; -import { v5ToV6 } from "./v5-to-v6"; -import { v6ToV7 } from "./v6-to-v7"; - -type MigrationFn = ({ state }: { state: unknown }) => unknown; - -const migrations: Record = { - 2: v2ToV3, - 3: v3ToV4, - 4: v4ToV5, - 5: v5ToV6, - 6: v6ToV7, -}; - -export const CURRENT_VERSION = 7; - -export function runMigrations({ - state, - fromVersion, -}: { - state: unknown; - fromVersion: number; -}): unknown { - let current = state; - for (let version = fromVersion; version < CURRENT_VERSION; version++) { - const migrate = migrations[version]; - if (migrate) current = migrate({ state: current }); - } - return current; -} diff --git a/apps/web/src/actions/keybindings/migrations/v2-to-v3.ts b/apps/web/src/actions/keybindings/migrations/v2-to-v3.ts deleted file mode 100644 index 0171c5a5..00000000 --- a/apps/web/src/actions/keybindings/migrations/v2-to-v3.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { KeybindingConfig, ShortcutKey } from "@/actions/keybinding"; -import type { TActionWithOptionalArgs } from "@/actions"; - -interface V2State { - keybindings: KeybindingConfig; - isCustomized: boolean; -} - -export function v2ToV3({ state }: { state: unknown }): unknown { - const v2 = state as V2State; - - const renames: Record = { - "split-selected": "split", - "split-selected-left": "split-left", - "split-selected-right": "split-right", - }; - - const migrated = { ...v2.keybindings }; - for (const [key, action] of Object.entries(migrated)) { - if (action && renames[action]) { - migrated[key as ShortcutKey] = renames[action] as TActionWithOptionalArgs; - } - } - - return { ...v2, keybindings: migrated }; -} diff --git a/apps/web/src/actions/keybindings/migrations/v3-to-v4.ts b/apps/web/src/actions/keybindings/migrations/v3-to-v4.ts deleted file mode 100644 index 8541071b..00000000 --- a/apps/web/src/actions/keybindings/migrations/v3-to-v4.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { TActionWithOptionalArgs } from "@/actions"; -import type { ShortcutKey } from "@/actions/keybinding"; -import type { KeybindingConfig } from "@/actions/keybinding"; - -interface V3State { - keybindings: KeybindingConfig; - isCustomized: boolean; -} - -export function v3ToV4({ state }: { state: unknown }): unknown { - const v3 = state as V3State; - - const renames: Record = { - "paste-selected": "paste-copied", - }; - - const migrated = { ...v3.keybindings }; - for (const [key, action] of Object.entries(migrated)) { - if (action && renames[action]) { - migrated[key as ShortcutKey] = renames[action] as TActionWithOptionalArgs; - } - } - - return { ...v3, keybindings: migrated }; -} diff --git a/apps/web/src/actions/keybindings/migrations/v4-to-v5.ts b/apps/web/src/actions/keybindings/migrations/v4-to-v5.ts deleted file mode 100644 index f6937c39..00000000 --- a/apps/web/src/actions/keybindings/migrations/v4-to-v5.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { KeybindingConfig } from "@/actions/keybinding"; - -interface V4State { - keybindings: KeybindingConfig; - isCustomized: boolean; -} - -export function v4ToV5({ state }: { state: unknown }): unknown { - const v4 = state as V4State; - const keybindings = { ...v4.keybindings }; - - if (!keybindings.escape) { - keybindings.escape = "deselect-all"; - } - - return { ...v4, keybindings }; -} diff --git a/apps/web/src/actions/keybindings/migrations/v5-to-v6.ts b/apps/web/src/actions/keybindings/migrations/v5-to-v6.ts deleted file mode 100644 index 09b44307..00000000 --- a/apps/web/src/actions/keybindings/migrations/v5-to-v6.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { KeybindingConfig } from "@/actions/keybinding"; - -interface V5State { - keybindings: KeybindingConfig; - isCustomized: boolean; -} - -export function v5ToV6({ state }: { state: unknown }): unknown { - const v5 = state as V5State; - const keybindings = { ...v5.keybindings }; - - if (keybindings.escape === "deselect-all") { - keybindings.escape = "cancel-interaction"; - } - - return { ...v5, keybindings }; -} diff --git a/apps/web/src/actions/keybindings/migrations/v6-to-v7.ts b/apps/web/src/actions/keybindings/migrations/v6-to-v7.ts deleted file mode 100644 index 46a99ac1..00000000 --- a/apps/web/src/actions/keybindings/migrations/v6-to-v7.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { KeybindingConfig } from "@/actions/keybinding"; - -interface V6State { - keybindings: KeybindingConfig; - isCustomized: boolean; -} - -export function v6ToV7({ state }: { state: unknown }): unknown { - const v6 = state as V6State; - const keybindings = { ...v6.keybindings }; - - for (const key of Object.keys(keybindings) as Array) { - if (keybindings[key] === ("split-element" as never)) { - keybindings[key] = "split"; - } - } - - return { ...v6, keybindings }; -} diff --git a/apps/web/src/actions/registry.ts b/apps/web/src/actions/registry.ts deleted file mode 100644 index e69b3b9f..00000000 --- a/apps/web/src/actions/registry.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { - TAction, - TActionFunc, - TActionWithArgs, - TActionWithOptionalArgs, - TActionArgsMap, - TArgOfAction, - TInvocationTrigger, -} from "./types"; - -type ActionHandler = (arg: unknown, trigger?: TInvocationTrigger) => void; -const boundActions: Partial> = {}; - -export function bindAction( - action: A, - handler: TActionFunc, -) { - const handlers = boundActions[action]; - const typedHandler = handler as ActionHandler; - if (handlers) { - handlers.push(typedHandler); - } else { - boundActions[action] = [typedHandler]; - } -} - -export function unbindAction( - action: A, - handler: TActionFunc, -) { - const handlers = boundActions[action]; - if (!handlers) return; - - const typedHandler = handler as ActionHandler; - boundActions[action] = handlers.filter((h) => h !== typedHandler); - - if (boundActions[action]?.length === 0) { - delete boundActions[action]; - } -} - -type InvokeActionFunc = { - ( - action: TActionWithOptionalArgs, - args?: undefined, - trigger?: TInvocationTrigger, - ): void; - ( - action: A, - args: TActionArgsMap[A], - trigger?: TInvocationTrigger, - ): void; -}; - -export const invokeAction: InvokeActionFunc = ( - action: A, - args?: TArgOfAction, - trigger?: TInvocationTrigger, -) => { - boundActions[action]?.forEach((handler) => { - handler(args, trigger); - }); -}; diff --git a/apps/web/src/actions/types.ts b/apps/web/src/actions/types.ts deleted file mode 100644 index 41258c7b..00000000 --- a/apps/web/src/actions/types.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { MutableRefObject } from "react"; -import type { TAction } from "./definitions"; - -export type { TAction }; - -export type TActionArgsMap = { - "seek-forward": { seconds: number } | undefined; - "seek-backward": { seconds: number } | undefined; - "jump-forward": { seconds: number } | undefined; - "jump-backward": { seconds: number } | undefined; - "remove-media-asset": { projectId: string; assetId: string }; - "remove-media-assets": { projectId: string; assetIds: string[] }; -}; - -type TKeysWithValueUndefined = { - [K in keyof T]: undefined extends T[K] ? K : never; -}[keyof T]; - -export type TActionWithArgs = keyof TActionArgsMap; - -export type TActionWithOptionalArgs = - | TActionWithNoArgs - | TKeysWithValueUndefined; - -export type TActionWithNoArgs = Exclude; - -export type TArgOfAction = A extends TActionWithArgs - ? TActionArgsMap[A] - : undefined; - -export type TActionFunc = A extends TActionWithArgs - ? (arg: TArgOfAction, trigger?: TInvocationTrigger) => void - : (_?: undefined, trigger?: TInvocationTrigger) => void; - -export type TInvocationTrigger = "keypress" | "mouseclick"; - -export type TBoundActionList = { - [A in TAction]?: Array>; -}; - -export type TActionHandlerOptions = - | MutableRefObject - | boolean - | undefined; diff --git a/apps/web/src/actions/use-action-handler.ts b/apps/web/src/actions/use-action-handler.ts deleted file mode 100644 index a8bb0054..00000000 --- a/apps/web/src/actions/use-action-handler.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { useCallback, useEffect, useRef } from "react"; -import type { - TAction, - TActionFunc, - TActionHandlerOptions, - TArgOfAction, - TInvocationTrigger, -} from "@/actions"; -import { bindAction, unbindAction } from "@/actions"; - -export function useActionHandler( - action: A, - handler: TActionFunc, - isActive: TActionHandlerOptions, -) { - const handlerRef = useRef>(handler); - const isBoundRef = useRef(false); - - useEffect(() => { - handlerRef.current = handler; - }, [handler]); - - const stableHandler = useCallback( - (...parameters: [TArgOfAction, TInvocationTrigger?]) => { - ( - handlerRef.current as ( - ...handlerParameters: [TArgOfAction, TInvocationTrigger?] - ) => void - )(...parameters); - }, - [], - ) as TActionFunc; - - useEffect(() => { - const shouldBind = - isActive === undefined || - (typeof isActive === "boolean" ? isActive : isActive.current); - - if (shouldBind && !isBoundRef.current) { - bindAction(action, stableHandler); - isBoundRef.current = true; - } else if (!shouldBind && isBoundRef.current) { - unbindAction(action, stableHandler); - isBoundRef.current = false; - } - - return () => { - unbindAction(action, stableHandler); - isBoundRef.current = false; - }; - }, [action, stableHandler, isActive]); -} diff --git a/apps/web/src/actions/use-editor-actions.ts b/apps/web/src/actions/use-editor-actions.ts deleted file mode 100644 index 5e90a6a1..00000000 --- a/apps/web/src/actions/use-editor-actions.ts +++ /dev/null @@ -1,532 +0,0 @@ -"use client"; - -import { useEffect, useRef } from "react"; -import { useTimelineStore } from "@/timeline/timeline-store"; -import { useActionHandler } from "@/actions/use-action-handler"; -import { useEditor } from "@/editor/use-editor"; -import { useElementSelection } from "@/timeline/hooks/element/use-element-selection"; -import { - addMediaTime, - maxMediaTime, - mediaTime, - mediaTimeFromSeconds, - minMediaTime, - subMediaTime, - TICKS_PER_SECOND, - ZERO_MEDIA_TIME, -} from "@/wasm"; -import { useKeyframeSelection } from "@/timeline/hooks/element/use-keyframe-selection"; -import { getElementsAtTime, hasMediaId } from "@/timeline"; -import { cancelInteraction } from "@/editor/cancel-interaction"; -import { invokeAction } from "@/actions"; -import { canToggleSourceAudio } from "@/timeline/audio-separation"; -import { - activateScope, - clearActiveScope, - type ScopeEntry, -} from "@/selection/scope"; - -export function useEditorActions() { - const editor = useEditor(); - const { selectedElements, setElementSelection } = useElementSelection(); - const { selectedKeyframes, clearKeyframeSelection } = useKeyframeSelection(); - const selectedMaskPointSelection = useEditor((e) => - e.selection.getSelectedMaskPointSelection(), - ); - const toggleSnapping = useTimelineStore((s) => s.toggleSnapping); - const rippleEditingEnabled = useTimelineStore((s) => s.rippleEditingEnabled); - const toggleRippleEditing = useTimelineStore((s) => s.toggleRippleEditing); - const hasTimelineSelectionRef = useRef(false); - const clearTimelineSelectionRef = useRef(() => {}); - const clearTimelineActiveSelectionRef = useRef(() => {}); - const timelineScopeRef = useRef(null); - const hasTimelineSelection = - selectedElements.length > 0 || - selectedKeyframes.length > 0 || - selectedMaskPointSelection !== null; - - hasTimelineSelectionRef.current = hasTimelineSelection; - clearTimelineSelectionRef.current = () => { - editor.selection.clearSelection(); - }; - clearTimelineActiveSelectionRef.current = () => { - editor.selection.clearMostSpecificSelection(); - }; - - if (!timelineScopeRef.current) { - timelineScopeRef.current = { - hasSelection: () => hasTimelineSelectionRef.current, - clear: () => { - clearTimelineSelectionRef.current(); - }, - clearActive: () => { - clearTimelineActiveSelectionRef.current(); - }, - }; - } - - useEffect(() => { - if (!hasTimelineSelection) { - return; - } - - const timelineScope = timelineScopeRef.current; - if (!timelineScope) { - return; - } - - return activateScope({ entry: timelineScope }); - }, [hasTimelineSelection]); - - useActionHandler( - "toggle-play", - () => { - editor.playback.toggle(); - }, - undefined, - ); - - useActionHandler( - "stop-playback", - () => { - if (editor.playback.getIsPlaying()) { - editor.playback.toggle(); - } - editor.playback.seek({ time: ZERO_MEDIA_TIME }); - }, - undefined, - ); - - useActionHandler( - "seek-forward", - (args) => { - const seconds = args?.seconds ?? 1; - const delta = mediaTimeFromSeconds({ seconds }); - editor.playback.seek({ - time: minMediaTime({ - a: editor.timeline.getTotalDuration(), - b: addMediaTime({ - a: editor.playback.getCurrentTime(), - b: delta, - }), - }), - }); - }, - undefined, - ); - - useActionHandler( - "seek-backward", - (args) => { - const seconds = args?.seconds ?? 1; - const delta = mediaTimeFromSeconds({ seconds }); - editor.playback.seek({ - time: maxMediaTime({ - a: ZERO_MEDIA_TIME, - b: subMediaTime({ - a: editor.playback.getCurrentTime(), - b: delta, - }), - }), - }); - }, - undefined, - ); - - useActionHandler( - "frame-step-forward", - () => { - const fps = editor.project.getActive().settings.fps; - const ticksPerFrame = mediaTime({ - ticks: Math.round( - (TICKS_PER_SECOND * fps.denominator) / fps.numerator, - ), - }); - editor.playback.seek({ - time: minMediaTime({ - a: editor.timeline.getTotalDuration(), - b: addMediaTime({ - a: editor.playback.getCurrentTime(), - b: ticksPerFrame, - }), - }), - }); - }, - undefined, - ); - - useActionHandler( - "frame-step-backward", - () => { - const fps = editor.project.getActive().settings.fps; - const ticksPerFrame = mediaTime({ - ticks: Math.round( - (TICKS_PER_SECOND * fps.denominator) / fps.numerator, - ), - }); - editor.playback.seek({ - time: maxMediaTime({ - a: ZERO_MEDIA_TIME, - b: subMediaTime({ - a: editor.playback.getCurrentTime(), - b: ticksPerFrame, - }), - }), - }); - }, - undefined, - ); - - useActionHandler( - "jump-forward", - (args) => { - const seconds = args?.seconds ?? 5; - const delta = mediaTimeFromSeconds({ seconds }); - editor.playback.seek({ - time: minMediaTime({ - a: editor.timeline.getTotalDuration(), - b: addMediaTime({ - a: editor.playback.getCurrentTime(), - b: delta, - }), - }), - }); - }, - undefined, - ); - - useActionHandler( - "jump-backward", - (args) => { - const seconds = args?.seconds ?? 5; - const delta = mediaTimeFromSeconds({ seconds }); - editor.playback.seek({ - time: maxMediaTime({ - a: ZERO_MEDIA_TIME, - b: subMediaTime({ - a: editor.playback.getCurrentTime(), - b: delta, - }), - }), - }); - }, - undefined, - ); - - useActionHandler( - "goto-start", - () => { - editor.playback.seek({ time: ZERO_MEDIA_TIME }); - }, - undefined, - ); - - useActionHandler( - "goto-end", - () => { - editor.playback.seek({ time: editor.timeline.getTotalDuration() }); - }, - undefined, - ); - - useActionHandler( - "split", - () => { - const currentTime = editor.playback.getCurrentTime(); - const tracks = editor.scenes.getActiveScene().tracks; - const elementsToSplit = - selectedElements.length > 0 - ? selectedElements - : getElementsAtTime({ - tracks, - time: currentTime, - }); - - if (elementsToSplit.length === 0) return; - - editor.timeline.splitElements({ - elements: elementsToSplit, - splitTime: currentTime, - }); - }, - undefined, - ); - - useActionHandler( - "split-left", - () => { - const currentTime = editor.playback.getCurrentTime(); - const tracks = editor.scenes.getActiveScene().tracks; - const elementsToSplit = - selectedElements.length > 0 - ? selectedElements - : getElementsAtTime({ - tracks, - time: currentTime, - }); - - if (elementsToSplit.length === 0) return; - - const rightSideElements = editor.timeline.splitElements({ - elements: elementsToSplit, - splitTime: currentTime, - retainSide: "right", - }); - - if (rippleEditingEnabled && rightSideElements.length > 0) { - const firstRightElement = editor.timeline.getElementsWithTracks({ - elements: [rightSideElements[0]], - })[0]; - if (firstRightElement) { - editor.playback.seek({ time: firstRightElement.element.startTime }); - } - } - }, - undefined, - ); - - useActionHandler( - "split-right", - () => { - const currentTime = editor.playback.getCurrentTime(); - const tracks = editor.scenes.getActiveScene().tracks; - const elementsToSplit = - selectedElements.length > 0 - ? selectedElements - : getElementsAtTime({ - tracks, - time: currentTime, - }); - - if (elementsToSplit.length === 0) return; - - editor.timeline.splitElements({ - elements: elementsToSplit, - splitTime: currentTime, - retainSide: "left", - }); - }, - undefined, - ); - - useActionHandler( - "delete-selected", - () => { - switch (editor.selection.getActiveSelectionKind()) { - case "mask-points": - if (!selectedMaskPointSelection) { - return; - } - editor.timeline.deleteCustomMaskPoints({ - trackId: selectedMaskPointSelection.trackId, - elementId: selectedMaskPointSelection.elementId, - maskId: selectedMaskPointSelection.maskId, - pointIds: selectedMaskPointSelection.pointIds, - }); - return; - case "keyframes": - if (selectedKeyframes.length === 0) { - return; - } - editor.timeline.removeKeyframes({ keyframes: selectedKeyframes }); - clearKeyframeSelection(); - return; - case "elements": - if (selectedElements.length === 0) { - return; - } - editor.timeline.deleteElements({ - elements: selectedElements, - }); - return; - default: - return; - } - }, - undefined, - ); - - useActionHandler( - "toggle-source-audio", - () => { - if (selectedElements.length !== 1) { - return; - } - - const selectedElement = editor.timeline.getElementsWithTracks({ - elements: selectedElements, - })[0]; - if (!selectedElement) { - return; - } - - const mediaAsset = (() => { - const { element } = selectedElement; - if (!hasMediaId(element)) { - return null; - } - - return ( - editor.media - .getAssets() - .find((asset) => asset.id === element.mediaId) ?? null - ); - })(); - if (!canToggleSourceAudio(selectedElement.element, mediaAsset)) { - return; - } - - editor.timeline.toggleSourceAudioSeparation({ - trackId: selectedElement.track.id, - elementId: selectedElement.element.id, - }); - }, - undefined, - ); - - useActionHandler( - "select-all", - () => { - const scene = editor.scenes.getActiveScene(); - const allElements = [ - ...scene.tracks.overlay, - scene.tracks.main, - ...scene.tracks.audio, - ].flatMap((track) => - track.elements.map((element) => ({ - trackId: track.id, - elementId: element.id, - })), - ); - setElementSelection({ elements: allElements }); - }, - undefined, - ); - - useActionHandler( - "cancel-interaction", - () => { - if (!cancelInteraction()) { - invokeAction("deselect-all"); - } - }, - undefined, - ); - - useActionHandler( - "deselect-all", - () => { - if (!clearActiveScope()) { - editor.selection.clearMostSpecificSelection(); - } - }, - undefined, - ); - - useActionHandler( - "duplicate-selected", - () => { - editor.timeline.duplicateElements({ - elements: selectedElements, - }); - }, - undefined, - ); - - useActionHandler( - "toggle-elements-muted-selected", - () => { - editor.timeline.toggleElementsMuted({ elements: selectedElements }); - }, - undefined, - ); - - useActionHandler( - "toggle-elements-visibility-selected", - () => { - editor.timeline.toggleElementsVisibility({ elements: selectedElements }); - }, - undefined, - ); - - useActionHandler( - "toggle-bookmark", - () => { - editor.scenes.toggleBookmark({ time: editor.playback.getCurrentTime() }); - }, - undefined, - ); - - useActionHandler( - "copy-selected", - () => { - editor.clipboard.copy(); - }, - undefined, - ); - - useActionHandler( - "paste-copied", - () => { - editor.clipboard.paste(); - }, - undefined, - ); - - useActionHandler( - "toggle-snapping", - () => { - toggleSnapping(); - }, - undefined, - ); - - useActionHandler( - "toggle-ripple-editing", - () => { - toggleRippleEditing(); - }, - undefined, - ); - - useActionHandler( - "undo", - () => { - editor.command.undo(); - }, - undefined, - ); - - useActionHandler( - "redo", - () => { - editor.command.redo(); - }, - undefined, - ); - - // todo: potnetially unify these two actions: - useActionHandler( - "remove-media-asset", - (args) => { - if (!args) return; - editor.media.removeMediaAsset({ - projectId: args.projectId, - id: args.assetId, - }); - }, - undefined, - ); - - useActionHandler( - "remove-media-assets", - (args) => { - if (!args) return; - editor.media.removeMediaAssets({ - projectId: args.projectId, - ids: args.assetIds, - }); - }, - undefined, - ); -} diff --git a/apps/web/src/actions/use-keybindings.ts b/apps/web/src/actions/use-keybindings.ts deleted file mode 100644 index c129795c..00000000 --- a/apps/web/src/actions/use-keybindings.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { useEffect } from "react"; -import { invokeAction } from "@/actions"; -import { useEditor } from "@/editor/use-editor"; -import { useKeybindingsStore } from "@/actions/keybindings-store"; -import { isTypableDOMElement } from "@/utils/browser"; - -/** - * a composable that hooks to the caller component's - * lifecycle and hooks to the keyboard events to fire - * the appropriate actions based on keybindings - */ -export function useKeybindingsListener() { - const editor = useEditor(); - const { - keybindings, - getKeybindingString, - overlayDepth, - isLoadingProject, - isRecording, - } = useKeybindingsStore(); - - useEffect(() => { - const eventOptions: AddEventListenerOptions = { capture: true }; - const handleKeyDown = (ev: KeyboardEvent) => { - const normalizedKey = (ev.key ?? "").toLowerCase(); - - if (overlayDepth > 0 || isLoadingProject || isRecording) { - return; - } - - const binding = getKeybindingString(ev); - const activeElement = document.activeElement; - const isTextInput = - activeElement instanceof HTMLElement && - isTypableDOMElement({ element: activeElement }); - const boundAction = binding ? keybindings[binding] : undefined; - - if (normalizedKey === "escape" && isTextInput) { - activeElement.blur(); - return; - } - - if (!binding) return; - if (!boundAction) return; - - if (isTextInput) return; - if (boundAction === "paste-copied") { - if (!editor.clipboard.hasEntry()) return; - ev.preventDefault(); - invokeAction("paste-copied", undefined, "keypress"); - return; - } - - ev.preventDefault(); - - switch (boundAction) { - case "seek-forward": - invokeAction("seek-forward", { seconds: 1 }, "keypress"); - break; - case "seek-backward": - invokeAction("seek-backward", { seconds: 1 }, "keypress"); - break; - case "jump-forward": - invokeAction("jump-forward", { seconds: 5 }, "keypress"); - break; - case "jump-backward": - invokeAction("jump-backward", { seconds: 5 }, "keypress"); - break; - default: - invokeAction(boundAction, undefined, "keypress"); - } - }; - - document.addEventListener("keydown", handleKeyDown, eventOptions); - - return () => { - document.removeEventListener("keydown", handleKeyDown, eventOptions); - }; - }, [ - keybindings, - getKeybindingString, - overlayDepth, - isLoadingProject, - isRecording, - editor, - ]); -} diff --git a/apps/web/src/actions/use-keyboard-shortcuts-help.ts b/apps/web/src/actions/use-keyboard-shortcuts-help.ts deleted file mode 100644 index 7681e664..00000000 --- a/apps/web/src/actions/use-keyboard-shortcuts-help.ts +++ /dev/null @@ -1,83 +0,0 @@ -"use client"; - -import { useMemo } from "react"; -import { useKeybindingsStore } from "@/actions/keybindings-store"; -import { ACTIONS, type TActionWithOptionalArgs } from "@/actions"; -import { - getPlatformAlternateKey, - getPlatformSpecialKey, -} from "@/utils/platform"; - -export interface KeyboardShortcut { - id: string; - keys: string[]; - description: string; - category: string; - action: TActionWithOptionalArgs; - icon?: React.ReactNode; -} - -function formatKey({ key }: { key: string }): string { - return key - .replace("ctrl", getPlatformSpecialKey()) - .replace("alt", getPlatformAlternateKey()) - .replace("shift", "Shift") - .replace("left", "←") - .replace("right", "→") - .replace("up", "↑") - .replace("down", "↓") - .replace("space", "Space") - .replace("home", "Home") - .replace("enter", "Enter") - .replace("end", "End") - .replace("delete", "Delete") - .replace("backspace", "Backspace") - .replace("-", "+"); -} - -export function useKeyboardShortcutsHelp() { - const { keybindings } = useKeybindingsStore(); - - const shortcuts = useMemo(() => { - const result: KeyboardShortcut[] = []; - const actionToKeys: Partial> = {}; - - for (const [key, action] of Object.entries(keybindings) as Array< - [string, TActionWithOptionalArgs | undefined] - >) { - if (action) { - if (!actionToKeys[action]) { - actionToKeys[action] = []; - } - actionToKeys[action].push(formatKey({ key })); - } - } - - for (const [action, keys] of Object.entries(actionToKeys) as Array< - [TActionWithOptionalArgs, string[]] - >) { - const actionDef = ACTIONS[action]; - if (!actionDef) { - continue; - } - result.push({ - id: action, - keys, - description: actionDef.description, - category: actionDef.category, - action, - }); - } - - return result.sort((a, b) => { - if (a.category !== b.category) { - return a.category.localeCompare(b.category); - } - return a.description.localeCompare(b.description); - }); - }, [keybindings]); - - return { - shortcuts, - }; -} diff --git a/apps/web/src/animation/__tests__/animated-params.test.ts b/apps/web/src/animation/__tests__/animated-params.test.ts deleted file mode 100644 index 7b9d312d..00000000 --- a/apps/web/src/animation/__tests__/animated-params.test.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { describe, expect, test } from "bun:test"; -import { - coerceAnimationParamValue, - getAnimationParamDefaultInterpolation, - getAnimationParamNumericRange, - getAnimationParamValueKind, -} from "@/animation/animated-params"; - -describe("animated params", () => { - test("snaps and clamps number params", () => { - expect( - coerceAnimationParamValue({ - param: { - key: "intensity", - label: "Intensity", - type: "number", - default: 0, - min: 0, - max: 1, - step: 0.25, - }, - value: 0.62, - }), - ).toBe(0.5); - - expect( - coerceAnimationParamValue({ - param: { - key: "intensity", - label: "Intensity", - type: "number", - default: 0, - min: 0, - max: 1, - step: 0.25, - }, - value: 1.2, - }), - ).toBe(1); - }); - - test("rejects NaN and non-number values for number params", () => { - const param = { - key: "intensity", - label: "Intensity", - type: "number" as const, - default: 0, - min: 0, - max: 1, - step: 0.25, - }; - expect(coerceAnimationParamValue({ param, value: Number.NaN })).toBeNull(); - expect(coerceAnimationParamValue({ param, value: "0.5" })).toBeNull(); - expect(coerceAnimationParamValue({ param, value: true })).toBeNull(); - }); - - test("passthrough with step <= 0 guard", () => { - expect( - coerceAnimationParamValue({ - param: { - key: "x", - label: "X", - type: "number", - default: 0, - min: 0, - step: 0, - }, - value: 0.123, - }), - ).toBe(0.123); - }); - - test("accepts valid select values", () => { - const param = { - key: "blend", - label: "Blend", - type: "select" as const, - default: "normal", - options: [ - { value: "normal", label: "Normal" }, - { value: "multiply", label: "Multiply" }, - ], - }; - expect(coerceAnimationParamValue({ param, value: "normal" })).toBe("normal"); - expect(coerceAnimationParamValue({ param, value: "multiply" })).toBe("multiply"); - }); - - test("rejects select values outside the allowed options", () => { - expect( - coerceAnimationParamValue({ - param: { - key: "blend", - label: "Blend", - type: "select", - default: "normal", - options: [ - { value: "normal", label: "Normal" }, - { value: "multiply", label: "Multiply" }, - ], - }, - value: "screen", - }), - ).toBeNull(); - }); - - test("rejects non-string select values", () => { - const param = { - key: "blend", - label: "Blend", - type: "select" as const, - default: "normal", - options: [{ value: "normal", label: "Normal" }], - }; - expect(coerceAnimationParamValue({ param, value: 42 })).toBeNull(); - expect(coerceAnimationParamValue({ param, value: null })).toBeNull(); - expect(coerceAnimationParamValue({ param, value: undefined })).toBeNull(); - }); - - test("boolean params accept booleans and reject other types", () => { - const param = { - key: "visible", - label: "Visible", - type: "boolean" as const, - default: true, - }; - expect(coerceAnimationParamValue({ param, value: true })).toBe(true); - expect(coerceAnimationParamValue({ param, value: false })).toBe(false); - expect(coerceAnimationParamValue({ param, value: 1 })).toBeNull(); - expect(coerceAnimationParamValue({ param, value: "true" })).toBeNull(); - }); - - test("color params accept strings and reject other types", () => { - const param = { - key: "fill", - label: "Fill", - type: "color" as const, - default: "#ffffff", - }; - expect(coerceAnimationParamValue({ param, value: "#ff0000" })).toBe("#ff0000"); - expect(coerceAnimationParamValue({ param, value: 0xff0000 })).toBeNull(); - expect(coerceAnimationParamValue({ param, value: null })).toBeNull(); - }); - - test("getAnimationParamValueKind maps param type to binding kind", () => { - expect( - getAnimationParamValueKind({ - param: { - key: "n", - label: "N", - type: "number", - default: 0, - min: 0, - step: 1, - }, - }), - ).toBe("number"); - expect( - getAnimationParamValueKind({ - param: { key: "c", label: "C", type: "color", default: "#fff" }, - }), - ).toBe("color"); - expect( - getAnimationParamValueKind({ - param: { key: "b", label: "B", type: "boolean", default: false }, - }), - ).toBe("discrete"); - expect( - getAnimationParamValueKind({ - param: { - key: "s", - label: "S", - type: "select", - default: "a", - options: [{ value: "a", label: "A" }], - }, - }), - ).toBe("discrete"); - }); - - test("getAnimationParamDefaultInterpolation is linear for continuous, hold for discrete", () => { - expect( - getAnimationParamDefaultInterpolation({ - param: { - key: "n", - label: "N", - type: "number", - default: 0, - min: 0, - step: 1, - }, - }), - ).toBe("linear"); - expect( - getAnimationParamDefaultInterpolation({ - param: { key: "c", label: "C", type: "color", default: "#fff" }, - }), - ).toBe("linear"); - expect( - getAnimationParamDefaultInterpolation({ - param: { key: "b", label: "B", type: "boolean", default: false }, - }), - ).toBe("hold"); - expect( - getAnimationParamDefaultInterpolation({ - param: { - key: "s", - label: "S", - type: "select", - default: "a", - options: [{ value: "a", label: "A" }], - }, - }), - ).toBe("hold"); - }); - - test("getAnimationParamNumericRange returns spec for number params, undefined otherwise", () => { - expect( - getAnimationParamNumericRange({ - param: { - key: "intensity", - label: "Intensity", - type: "number", - default: 0.5, - min: 0, - max: 1, - step: 0.1, - }, - }), - ).toEqual({ min: 0, max: 1, step: 0.1 }); - expect( - getAnimationParamNumericRange({ - param: { key: "c", label: "C", type: "color", default: "#fff" }, - }), - ).toBeUndefined(); - expect( - getAnimationParamNumericRange({ - param: { key: "b", label: "B", type: "boolean", default: false }, - }), - ).toBeUndefined(); - }); -}); diff --git a/apps/web/src/animation/__tests__/binding-values.test.ts b/apps/web/src/animation/__tests__/binding-values.test.ts deleted file mode 100644 index a1f2010c..00000000 --- a/apps/web/src/animation/__tests__/binding-values.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { describe, expect, test } from "bun:test"; -import { - composeAnimationValue, - createAnimationBinding, -} from "@/animation/binding-values"; - -describe("binding values", () => { - test("formats composed animated colors as hex", () => { - const binding = createAnimationBinding({ - path: "color", - kind: "color", - }); - - expect( - composeAnimationValue({ - binding, - componentValues: { - r: 1, - g: 0, - b: 0, - a: 1, - }, - }), - ).toBe("#ff0000"); - }); -}); diff --git a/apps/web/src/animation/animated-params.ts b/apps/web/src/animation/animated-params.ts deleted file mode 100644 index bc27b15d..00000000 --- a/apps/web/src/animation/animated-params.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { snapToStep } from "@/utils/math"; -import type { ParamDefinition } from "@/params"; -import type { DynamicAnimationPathValue, NumericSpec } from "./types"; - -export function getAnimationParamValueKind({ - param, -}: { - param: ParamDefinition; -}): "number" | "color" | "discrete" { - if (param.type === "number") { - return "number"; - } - - if (param.type === "color") { - return "color"; - } - - return "discrete"; -} - -export function getAnimationParamDefaultInterpolation({ - param, -}: { - param: ParamDefinition; -}): "linear" | "hold" { - return param.type === "number" || param.type === "color" ? "linear" : "hold"; -} - -export function getAnimationParamNumericRange({ - param, -}: { - param: ParamDefinition; -}): NumericSpec | undefined { - if (param.type !== "number") { - return undefined; - } - - return { - min: param.min, - max: param.max, - step: param.step, - }; -} - -/** - * `coerceAnimationParamValue` accepts `unknown` rather than a narrow - * `DynamicAnimationPathValue` because it doubles as a runtime gate for - * untrusted inputs (persisted state, paste payloads, programmatic updates). - * The caller does not need to pre-validate; null means "this value cannot live - * on this param". - */ -export function coerceAnimationParamValue({ - param, - value, -}: { - param: ParamDefinition; - value: unknown; -}): DynamicAnimationPathValue | null { - if (param.type === "number") { - if (typeof value !== "number" || Number.isNaN(value)) { - return null; - } - - const steppedValue = snapToStep({ value, step: param.step }); - const minValue = param.min; - const maxValue = param.max ?? Number.POSITIVE_INFINITY; - return Math.min(maxValue, Math.max(minValue, steppedValue)); - } - - if (param.type === "color") { - return typeof value === "string" ? value : null; - } - - if (param.type === "boolean") { - return typeof value === "boolean" ? value : null; - } - - if (typeof value !== "string") { - return null; - } - - return param.options.some((option) => option.value === value) ? value : null; -} diff --git a/apps/web/src/animation/bezier.ts b/apps/web/src/animation/bezier.ts deleted file mode 100644 index 6f9a1d18..00000000 --- a/apps/web/src/animation/bezier.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type { ScalarAnimationKey } from "@/animation/types"; - -const BEZIER_SOLVE_ITERATIONS = 20; - -export function getBezierPoint({ - progress, - p0, - p1, - p2, - p3, -}: { - progress: number; - p0: number; - p1: number; - p2: number; - p3: number; -}) { - const mt = 1 - progress; - return ( - mt * mt * mt * p0 + - 3 * mt * mt * progress * p1 + - 3 * mt * progress * progress * p2 + - progress * progress * progress * p3 - ); -} - -export function getDefaultRightHandle({ - leftKey, - rightKey, -}: { - leftKey: ScalarAnimationKey; - rightKey: ScalarAnimationKey; -}) { - const span = rightKey.time - leftKey.time; - const valueDelta = rightKey.value - leftKey.value; - return { - dt: span / 3, - dv: valueDelta / 3, - }; -} - -export function getDefaultLeftHandle({ - leftKey, - rightKey, -}: { - leftKey: ScalarAnimationKey; - rightKey: ScalarAnimationKey; -}) { - const span = rightKey.time - leftKey.time; - const valueDelta = rightKey.value - leftKey.value; - return { - dt: -span / 3, - dv: -valueDelta / 3, - }; -} - -export function solveBezierProgressForTime({ - time, - leftKey, - rightKey, -}: { - time: number; - leftKey: ScalarAnimationKey; - rightKey: ScalarAnimationKey; -}) { - let lower = 0; - let upper = 1; - const rightHandle = - leftKey.rightHandle ?? getDefaultRightHandle({ leftKey, rightKey }); - const leftHandle = - rightKey.leftHandle ?? getDefaultLeftHandle({ leftKey, rightKey }); - - for (let iteration = 0; iteration < BEZIER_SOLVE_ITERATIONS; iteration++) { - const mid = (lower + upper) / 2; - const estimate = getBezierPoint({ - progress: mid, - p0: leftKey.time, - p1: leftKey.time + rightHandle.dt, - p2: rightKey.time + leftHandle.dt, - p3: rightKey.time, - }); - if (estimate < time) { - lower = mid; - } else { - upper = mid; - } - } - - return (lower + upper) / 2; -} diff --git a/apps/web/src/animation/binding-values.ts b/apps/web/src/animation/binding-values.ts deleted file mode 100644 index a46aa9a6..00000000 --- a/apps/web/src/animation/binding-values.ts +++ /dev/null @@ -1,344 +0,0 @@ -import { converter, formatHex, formatHex8, parse } from "culori"; -import type { - AnimationBindingComponent, - AnimationBindingOfKind, - AnimationBindingInstance, - AnimationBindingKind, - ColorAnimationBinding, - DiscreteAnimationBinding, - NumberAnimationBinding, - AnimationPath, - AnimationValue, - DiscreteValue, - Vector2AnimationBinding, - VectorValue, -} from "@/animation/types"; -import { clamp } from "@/utils/math"; - -interface LinearRgba { - r: number; - g: number; - b: number; - a: number; -} - -export type AnimationComponentValue = number | DiscreteValue; - -const toRgb = converter("rgb"); - -function srgbToLinear({ value }: { value: number }): number { - return value <= 0.04045 - ? value / 12.92 - : Math.pow((value + 0.055) / 1.055, 2.4); -} - -function linearToSrgb({ value }: { value: number }): number { - const clamped = clamp({ value, min: 0, max: 1 }); - return clamped <= 0.0031308 - ? clamped * 12.92 - : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055; -} - -function isRecord(value: unknown): value is Record { - return typeof value === "object" && value !== null; -} - -export function isVectorValue(value: unknown): value is VectorValue { - return isRecord(value) && typeof value.x === "number" && typeof value.y === "number"; -} - -export type EasingMode = "independent" | "shared"; - -/** - * Declares how easing curves apply to a binding's components. - * "shared" means all components always use the same curve (e.g. color — you never - * want to ease R independently from G/B/A). "independent" means each component - * can have its own curve. - */ -export function getEasingModeForKind(kind: AnimationBindingKind): EasingMode { - return kind === "color" ? "shared" : "independent"; -} - -export function getBindingComponentKeys({ - kind, -}: { - kind: AnimationBindingKind; -}): string[] { - if (kind === "vector2") { - return ["x", "y"]; - } - - if (kind === "color") { - return ["r", "g", "b", "a"]; - } - - return ["value"]; -} - -export function buildBindingChannelId({ - path, - componentKey, -}: { - path: AnimationPath; - componentKey: string; -}): string { - return `${path}:${componentKey}`; -} - -function createBindingComponent({ - path, - key, -}: { - path: AnimationPath; - key: TKey; -}): AnimationBindingComponent { - return { - key, - channelId: buildBindingChannelId({ path, componentKey: key }), - }; -} - -function cloneBindingComponents({ - components, -}: { - components: AnimationBindingComponent[]; -}): AnimationBindingComponent[] { - return components.map((component) => ({ ...component })); -} - -const animationBindingFactories = { - color: ({ path }: { path: AnimationPath }): ColorAnimationBinding => ({ - path, - kind: "color", - colorSpace: "srgb-linear", - components: [ - createBindingComponent({ path, key: "r" }), - createBindingComponent({ path, key: "g" }), - createBindingComponent({ path, key: "b" }), - createBindingComponent({ path, key: "a" }), - ], - }), - vector2: ({ path }: { path: AnimationPath }): Vector2AnimationBinding => ({ - path, - kind: "vector2", - components: [ - createBindingComponent({ path, key: "x" }), - createBindingComponent({ path, key: "y" }), - ], - }), - number: ({ path }: { path: AnimationPath }): NumberAnimationBinding => ({ - path, - kind: "number", - components: [createBindingComponent({ path, key: "value" })], - }), - discrete: ({ path }: { path: AnimationPath }): DiscreteAnimationBinding => ({ - path, - kind: "discrete", - components: [createBindingComponent({ path, key: "value" })], - }), -} satisfies { - [K in AnimationBindingKind]: ({ - path, - }: { - path: AnimationPath; - }) => AnimationBindingOfKind; -}; - -export function createAnimationBinding({ - path, - kind, -}: { - path: AnimationPath; - kind: TKind; -}): AnimationBindingOfKind; -export function createAnimationBinding({ - path, - kind, -}: { - path: AnimationPath; - kind: AnimationBindingKind; -}): AnimationBindingInstance { - return animationBindingFactories[kind]({ path }); -} - -const animationBindingCloners = { - color: ({ binding }: { binding: ColorAnimationBinding }): ColorAnimationBinding => ({ - ...binding, - components: cloneBindingComponents({ - components: binding.components, - }), - }), - vector2: ({ - binding, - }: { - binding: Vector2AnimationBinding; - }): Vector2AnimationBinding => ({ - ...binding, - components: cloneBindingComponents({ - components: binding.components, - }), - }), - number: ({ - binding, - }: { - binding: NumberAnimationBinding; - }): NumberAnimationBinding => ({ - ...binding, - components: cloneBindingComponents({ - components: binding.components, - }), - }), - discrete: ({ - binding, - }: { - binding: DiscreteAnimationBinding; - }): DiscreteAnimationBinding => ({ - ...binding, - components: cloneBindingComponents({ - components: binding.components, - }), - }), -} satisfies { - [K in AnimationBindingKind]: ({ - binding, - }: { - binding: AnimationBindingOfKind; - }) => AnimationBindingOfKind; -}; - -export function cloneAnimationBinding({ - binding, -}: { - binding: AnimationBindingOfKind; -}): AnimationBindingOfKind; -export function cloneAnimationBinding({ - binding, -}: { - binding: AnimationBindingInstance; -}): AnimationBindingInstance { - switch (binding.kind) { - case "color": - return animationBindingCloners.color({ binding }); - case "vector2": - return animationBindingCloners.vector2({ binding }); - case "number": - return animationBindingCloners.number({ binding }); - case "discrete": - return animationBindingCloners.discrete({ binding }); - } -} - -export function parseColorToLinearRgba({ - color, -}: { - color: string; -}): LinearRgba | null { - const parsed = parse(color); - const rgb = parsed ? toRgb(parsed) : null; - if (!rgb) { - return null; - } - - return { - r: srgbToLinear({ value: rgb.r ?? 0 }), - g: srgbToLinear({ value: rgb.g ?? 0 }), - b: srgbToLinear({ value: rgb.b ?? 0 }), - a: clamp({ value: rgb.alpha ?? 1, min: 0, max: 1 }), - }; -} - -export function formatLinearRgba({ - color, -}: { - color: LinearRgba; -}): string { - const rgb = { - mode: "rgb", - r: linearToSrgb({ value: color.r }), - g: linearToSrgb({ value: color.g }), - b: linearToSrgb({ value: color.b }), - alpha: clamp({ value: color.a, min: 0, max: 1 }), - } as const; - return rgb.alpha < 1 ? formatHex8(rgb) : formatHex(rgb); -} - -export function decomposeAnimationValue({ - kind, - value, -}: { - kind: AnimationBindingKind; - value: AnimationValue; -}): Record | null { - if (kind === "number") { - return typeof value === "number" ? { value } : null; - } - - if (kind === "vector2") { - return isVectorValue(value) ? { x: value.x, y: value.y } : null; - } - - if (kind === "color") { - if (typeof value !== "string") { - return null; - } - const parsed = parseColorToLinearRgba({ color: value }); - if (!parsed) { - return null; - } - return { - r: parsed.r, - g: parsed.g, - b: parsed.b, - a: parsed.a, - }; - } - - return typeof value === "string" || typeof value === "boolean" - ? { value } - : null; -} - -export function composeAnimationValue({ - binding, - componentValues, -}: { - binding: AnimationBindingInstance; - componentValues: Record; -}): AnimationValue | null { - if (binding.kind === "number") { - const value = componentValues.value; - return typeof value === "number" ? value : null; - } - - if (binding.kind === "vector2") { - const x = componentValues.x; - const y = componentValues.y; - return typeof x === "number" && typeof y === "number" ? { x, y } : null; - } - - if (binding.kind === "color") { - const r = componentValues.r; - const g = componentValues.g; - const b = componentValues.b; - const a = componentValues.a; - if ( - typeof r !== "number" || - typeof g !== "number" || - typeof b !== "number" || - typeof a !== "number" - ) { - return null; - } - return formatLinearRgba({ - color: { - r, - g, - b, - a, - }, - }); - } - - const value = componentValues.value; - return typeof value === "string" || typeof value === "boolean" ? value : null; -} diff --git a/apps/web/src/animation/curve-bridge.ts b/apps/web/src/animation/curve-bridge.ts deleted file mode 100644 index c947e7dc..00000000 --- a/apps/web/src/animation/curve-bridge.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { - getDefaultLeftHandle, - getDefaultRightHandle, -} from "@/animation/bezier"; -import type { - CurveHandle, - NormalizedCubicBezier, - ScalarAnimationKey, -} from "@/animation/types"; -import { roundMediaTime } from "@/wasm"; - -const VALUE_EPSILON = 1e-6; - -function clamp01({ value }: { value: number }): number { - return Math.max(0, Math.min(1, value)); -} - -export function getNormalizedCubicBezierForScalarSegment({ - leftKey, - rightKey, - referenceSpanValue, -}: { - leftKey: ScalarAnimationKey; - rightKey: ScalarAnimationKey; - /** Fallback Y-axis scale used when the segment is flat (spanValue ≈ 0). */ - referenceSpanValue?: number; -}): NormalizedCubicBezier | null { - const spanTime = rightKey.time - leftKey.time; - const spanValue = rightKey.value - leftKey.value; - const effectiveSpanValue = - Math.abs(spanValue) > VALUE_EPSILON - ? spanValue - : referenceSpanValue !== undefined && Math.abs(referenceSpanValue) > VALUE_EPSILON - ? referenceSpanValue - : null; - - if (spanTime === 0 || effectiveSpanValue === null) { - return null; - } - - const rightHandle = - leftKey.rightHandle ?? getDefaultRightHandle({ leftKey, rightKey }); - const leftHandle = - rightKey.leftHandle ?? getDefaultLeftHandle({ leftKey, rightKey }); - - return [ - clamp01({ value: rightHandle.dt / spanTime }), - rightHandle.dv / effectiveSpanValue, - clamp01({ value: 1 + leftHandle.dt / spanTime }), - 1 + leftHandle.dv / effectiveSpanValue, - ]; -} - -export function getCurveHandlesForNormalizedCubicBezier({ - leftKey, - rightKey, - cubicBezier, - referenceSpanValue, -}: { - leftKey: ScalarAnimationKey; - rightKey: ScalarAnimationKey; - cubicBezier: NormalizedCubicBezier; - /** Fallback Y-axis scale used when the segment is flat (spanValue ≈ 0). */ - referenceSpanValue?: number; -}): { - rightHandle: CurveHandle; - leftHandle: CurveHandle; -} | null { - const spanTime = rightKey.time - leftKey.time; - const spanValue = rightKey.value - leftKey.value; - const effectiveSpanValue = - Math.abs(spanValue) > VALUE_EPSILON - ? spanValue - : referenceSpanValue !== undefined && Math.abs(referenceSpanValue) > VALUE_EPSILON - ? referenceSpanValue - : null; - - if (spanTime === 0 || effectiveSpanValue === null) { - return null; - } - - const [rawX1, y1, rawX2, y2] = cubicBezier; - const x1 = clamp01({ value: rawX1 }); - const x2 = clamp01({ value: rawX2 }); - - return { - rightHandle: { - dt: roundMediaTime({ time: spanTime * x1 }), - dv: effectiveSpanValue * y1, - }, - leftHandle: { - dt: roundMediaTime({ time: spanTime * (x2 - 1) }), - dv: effectiveSpanValue * (y2 - 1), - }, - }; -} diff --git a/apps/web/src/animation/effect-param-channel.ts b/apps/web/src/animation/effect-param-channel.ts deleted file mode 100644 index e1c442f7..00000000 --- a/apps/web/src/animation/effect-param-channel.ts +++ /dev/null @@ -1,102 +0,0 @@ -import type { - ElementAnimations, - EffectParamPath, -} from "@/animation/types"; -import type { ParamValues } from "@/params"; -import { removeElementKeyframe } from "./keyframes"; -import { resolveAnimationPathValueAtTime } from "./resolve"; - -export const EFFECT_PARAM_PATH_PREFIX = "effects."; -export const EFFECT_PARAM_PATH_SUFFIX = ".params."; - -export function buildEffectParamPath({ - effectId, - paramKey, -}: { - effectId: string; - paramKey: string; -}): EffectParamPath { - return `${EFFECT_PARAM_PATH_PREFIX}${effectId}${EFFECT_PARAM_PATH_SUFFIX}${paramKey}`; -} - -export function isEffectParamPath( - propertyPath: string, -): propertyPath is EffectParamPath { - return ( - propertyPath.startsWith(EFFECT_PARAM_PATH_PREFIX) && - propertyPath.includes(EFFECT_PARAM_PATH_SUFFIX) - ); -} - -export function parseEffectParamPath({ - propertyPath, -}: { - propertyPath: string; -}): { effectId: string; paramKey: string } | null { - if (!isEffectParamPath(propertyPath)) { - return null; - } - - const withoutPrefix = propertyPath.slice(EFFECT_PARAM_PATH_PREFIX.length); - const separatorIndex = withoutPrefix.indexOf(EFFECT_PARAM_PATH_SUFFIX); - if (separatorIndex <= 0) { - return null; - } - - const effectId = withoutPrefix.slice(0, separatorIndex); - const paramKey = withoutPrefix.slice( - separatorIndex + EFFECT_PARAM_PATH_SUFFIX.length, - ); - if (!effectId || !paramKey) { - return null; - } - - return { effectId, paramKey }; -} - -export function resolveEffectParamsAtTime({ - effectId, - params, - animations, - localTime, -}: { - effectId: string; - params: ParamValues; - animations: ElementAnimations | undefined; - localTime: number; -}): ParamValues { - const safeLocalTime = Math.max(0, localTime); - const resolved: ParamValues = {}; - - for (const [paramKey, staticValue] of Object.entries(params)) { - const path = buildEffectParamPath({ effectId, paramKey }); - resolved[paramKey] = animations?.bindings[path] - ? resolveAnimationPathValueAtTime({ - animations, - propertyPath: path, - localTime: safeLocalTime, - fallbackValue: staticValue, - }) - : staticValue; - } - - return resolved; -} - -export function removeEffectParamKeyframe({ - animations, - effectId, - paramKey, - keyframeId, -}: { - animations: ElementAnimations | undefined; - effectId: string; - paramKey: string; - keyframeId: string; -}): ElementAnimations | undefined { - return removeElementKeyframe({ - animations, - propertyPath: buildEffectParamPath({ effectId, paramKey }), - keyframeId, - }); -} diff --git a/apps/web/src/animation/graph-channels.ts b/apps/web/src/animation/graph-channels.ts deleted file mode 100644 index d6482602..00000000 --- a/apps/web/src/animation/graph-channels.ts +++ /dev/null @@ -1,99 +0,0 @@ -import type { - AnimationBindingInstance, - AnimationPath, - ElementAnimations, - ScalarAnimationChannel, - ScalarGraphChannel, - ScalarGraphKeyframeContext, -} from "@/animation/types"; - -export interface EditableScalarChannels { - binding: AnimationBindingInstance; - channels: ScalarGraphChannel[]; -} - -function isScalarAnimationChannel( - channel: ElementAnimations["channels"][string], -): channel is ScalarAnimationChannel { - return channel?.kind === "scalar"; -} - -export function getEditableScalarChannels({ - animations, - propertyPath, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; -}): EditableScalarChannels | null { - const binding = animations?.bindings[propertyPath]; - if (!binding) { - return null; - } - - const channels = binding.components.flatMap((component) => { - const channel = animations?.channels[component.channelId]; - if (!isScalarAnimationChannel(channel)) { - return []; - } - - return [ - { - propertyPath, - componentKey: component.key, - channelId: component.channelId, - channel, - } satisfies ScalarGraphChannel, - ]; - }); - - return { binding, channels }; -} - -export function getEditableScalarChannel({ - animations, - propertyPath, - componentKey, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - componentKey: string; -}): ScalarGraphChannel | null { - const result = getEditableScalarChannels({ animations, propertyPath }); - return result?.channels.find((channel) => channel.componentKey === componentKey) ?? null; -} - -export function getScalarKeyframeContext({ - animations, - propertyPath, - componentKey, - keyframeId, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - componentKey: string; - keyframeId: string; -}): ScalarGraphKeyframeContext | null { - const scalarChannel = getEditableScalarChannel({ - animations, - propertyPath, - componentKey, - }); - if (!scalarChannel) { - return null; - } - - const keyframeIndex = scalarChannel.channel.keys.findIndex( - (keyframe) => keyframe.id === keyframeId, - ); - if (keyframeIndex < 0) { - return null; - } - - return { - ...scalarChannel, - keyframe: scalarChannel.channel.keys[keyframeIndex], - keyframeIndex, - previousKey: scalarChannel.channel.keys[keyframeIndex - 1] ?? null, - nextKey: scalarChannel.channel.keys[keyframeIndex + 1] ?? null, - }; -} diff --git a/apps/web/src/animation/graphic-param-channel.ts b/apps/web/src/animation/graphic-param-channel.ts deleted file mode 100644 index d0bfdded..00000000 --- a/apps/web/src/animation/graphic-param-channel.ts +++ /dev/null @@ -1,65 +0,0 @@ -import type { - ElementAnimations, - GraphicParamPath, -} from "@/animation/types"; -import type { ParamDefinition, ParamValues } from "@/params"; -import { resolveAnimationPathValueAtTime } from "./resolve"; - -export const GRAPHIC_PARAM_PATH_PREFIX = "params."; - -export function buildGraphicParamPath({ - paramKey, -}: { - paramKey: string; -}): GraphicParamPath { - return `${GRAPHIC_PARAM_PATH_PREFIX}${paramKey}`; -} - -export function isGraphicParamPath( - propertyPath: string, -): propertyPath is GraphicParamPath { - return propertyPath.startsWith(GRAPHIC_PARAM_PATH_PREFIX); -} - -export function parseGraphicParamPath({ - propertyPath, -}: { - propertyPath: string; -}): { paramKey: string } | null { - if (!isGraphicParamPath(propertyPath)) { - return null; - } - - const paramKey = propertyPath.slice(GRAPHIC_PARAM_PATH_PREFIX.length); - return paramKey.length > 0 ? { paramKey } : null; -} - -export function resolveGraphicParamsAtTime({ - params, - definitions, - animations, - localTime, -}: { - params: ParamValues; - definitions: ParamDefinition[]; - animations?: ElementAnimations; - localTime: number; -}): ParamValues { - const resolved: ParamValues = { ...params }; - - for (const param of definitions) { - const path = buildGraphicParamPath({ paramKey: param.key }); - if (!animations?.bindings[path]) { - continue; - } - - resolved[param.key] = resolveAnimationPathValueAtTime({ - animations, - propertyPath: path, - localTime: Math.max(0, localTime), - fallbackValue: params[param.key] ?? param.default, - }); - } - - return resolved; -} diff --git a/apps/web/src/animation/index.ts b/apps/web/src/animation/index.ts deleted file mode 100644 index 33e637c3..00000000 --- a/apps/web/src/animation/index.ts +++ /dev/null @@ -1,87 +0,0 @@ -export { - getChannelValueAtTime, - getDiscreteChannelValueAtTime, - getScalarChannelValueAtTime, - getScalarSegmentInterpolation, - normalizeChannel, -} from "./interpolation"; - -export { - clampAnimationsToDuration, - cloneAnimations, - getChannel, - removeElementKeyframe, - retimeElementKeyframe, - setBindingComponentChannel, - setChannel, - splitAnimationsAtTime, - updateScalarKeyframeCurve, - upsertElementKeyframe, - upsertPathKeyframe, -} from "./keyframes"; - -export { - getElementLocalTime, - resolveAnimationPathValueAtTime, -} from "./resolve"; - -export { - getElementKeyframes, - getKeyframeById, - getKeyframeAtTime, - hasKeyframesForPath, -} from "./keyframe-query"; - -export { - type EditableScalarChannels, - getEditableScalarChannel, - getEditableScalarChannels, - getScalarKeyframeContext, -} from "./graph-channels"; - -export { - getCurveHandlesForNormalizedCubicBezier, - getNormalizedCubicBezierForScalarSegment, -} from "./curve-bridge"; - -export { - buildGraphicParamPath, - isGraphicParamPath, - parseGraphicParamPath, - resolveGraphicParamsAtTime, -} from "./graphic-param-channel"; - -export { - buildEffectParamPath, - isEffectParamPath, - parseEffectParamPath, - removeEffectParamKeyframe, - resolveEffectParamsAtTime, -} from "./effect-param-channel"; - -export { - getGroupKeyframesAtTime, - hasGroupKeyframeAtTime, - type GroupKeyframeRef, -} from "./property-groups"; - -export { - type EasingMode, - getEasingModeForKind, -} from "./binding-values"; - -export { - isAnimationPath, - isAnimationPropertyPath, -} from "./path"; - -export { - coerceAnimationValueForProperty, - getAnimationPropertyDefinition, - getDefaultInterpolationForProperty, - getElementBaseValueForProperty, - supportsAnimationProperty, - type AnimationPropertyDefinition, - type NumericSpec, - withElementBaseValueForProperty, -} from "./property-registry"; diff --git a/apps/web/src/animation/interpolation.ts b/apps/web/src/animation/interpolation.ts deleted file mode 100644 index 5d5212a6..00000000 --- a/apps/web/src/animation/interpolation.ts +++ /dev/null @@ -1,384 +0,0 @@ -import type { - AnimationChannel, - AnimationInterpolation, - AnimationValue, - DiscreteAnimationChannel, - DiscreteValue, - ScalarAnimationChannel, - ScalarAnimationKey, - ScalarSegmentType, -} from "@/animation/types"; -import { mediaTime } from "@/wasm"; -import { - getBezierPoint, - getDefaultLeftHandle, - getDefaultRightHandle, - solveBezierProgressForTime, -} from "./bezier"; -import { clamp } from "@/utils/math"; - -function byTimeAscending({ - leftTime, - rightTime, -}: { - leftTime: number; - rightTime: number; -}): number { - return leftTime - rightTime; -} - -function isWithinTimePair({ - time, - leftTime, - rightTime, -}: { - time: number; - leftTime: number; - rightTime: number; -}): boolean { - return time >= leftTime && time <= rightTime; -} - -function lerpNumber({ - leftValue, - rightValue, - progress, -}: { - leftValue: number; - rightValue: number; - progress: number; -}): number { - return leftValue + (rightValue - leftValue) * progress; -} - -function normalizeRightHandle({ - handle, - leftKey, - rightKey, -}: { - handle: ScalarAnimationKey["rightHandle"]; - leftKey: ScalarAnimationKey; - rightKey: ScalarAnimationKey; -}) { - if (!handle) { - return undefined; - } - - const span = mediaTime({ - ticks: Math.max(1, rightKey.time - leftKey.time), - }); - return { - dt: mediaTime({ - ticks: Math.min(span, Math.max(0, handle.dt)), - }), - dv: handle.dv, - }; -} - -function normalizeLeftHandle({ - handle, - leftKey, - rightKey, -}: { - handle: ScalarAnimationKey["leftHandle"]; - leftKey: ScalarAnimationKey; - rightKey: ScalarAnimationKey; -}) { - if (!handle) { - return undefined; - } - - const span = mediaTime({ - ticks: Math.max(1, rightKey.time - leftKey.time), - }); - return { - dt: mediaTime({ - ticks: Math.max(-span, Math.min(0, handle.dt)), - }), - dv: handle.dv, - }; -} - -function normalizeScalarKey({ - key, -}: { - key: ScalarAnimationKey; -}): ScalarAnimationKey { - return { - ...key, - tangentMode: key.tangentMode ?? "flat", - segmentToNext: key.segmentToNext ?? "linear", - }; -} - -function normalizeScalarChannel({ - channel, -}: { - channel: ScalarAnimationChannel; -}): ScalarAnimationChannel { - const sortedKeys = [...channel.keys] - .map((key) => normalizeScalarKey({ key })) - .sort((leftKey, rightKey) => - byTimeAscending({ - leftTime: leftKey.time, - rightTime: rightKey.time, - }), - ); - const nextKeys = sortedKeys.map((key, index) => { - const previousKey = sortedKeys[index - 1]; - const nextKey = sortedKeys[index + 1]; - return { - ...key, - leftHandle: - previousKey != null - ? normalizeLeftHandle({ - handle: key.leftHandle, - leftKey: previousKey, - rightKey: key, - }) - : undefined, - rightHandle: - nextKey != null - ? normalizeRightHandle({ - handle: key.rightHandle, - leftKey: key, - rightKey: nextKey, - }) - : undefined, - }; - }); - - return { - ...channel, - keys: nextKeys, - }; -} - -export function normalizeChannel({ - channel, -}: { - channel: TChannel; -}): TChannel { - if (channel.kind === "scalar") { - return normalizeScalarChannel({ - channel, - }) as TChannel; - } - - return { - ...channel, - keys: [...channel.keys].sort((leftKeyframe, rightKeyframe) => - byTimeAscending({ - leftTime: leftKeyframe.time, - rightTime: rightKeyframe.time, - }), - ), - } as TChannel; -} - -function extrapolateScalarEdge({ - mode, - edgeKey, - neighborKey, - time, -}: { - mode: "hold" | "linear"; - edgeKey: ScalarAnimationKey; - neighborKey: ScalarAnimationKey | undefined; - time: number; -}) { - if (mode === "hold" || !neighborKey) { - return edgeKey.value; - } - - const span = neighborKey.time - edgeKey.time; - if (span === 0) { - return edgeKey.value; - } - - return edgeKey.value + ((time - edgeKey.time) / span) * (neighborKey.value - edgeKey.value); -} - -export function getScalarSegmentInterpolation({ - segment, -}: { - segment: ScalarSegmentType; -}): AnimationInterpolation { - if (segment === "step") { - return "hold"; - } - - return segment === "bezier" ? "bezier" : "linear"; -} - -export function getScalarChannelValueAtTime({ - channel, - time, - fallbackValue, -}: { - channel: ScalarAnimationChannel | undefined; - time: number; - fallbackValue: number; -}): number { - if (!channel || channel.keys.length === 0) { - return fallbackValue; - } - - const normalizedChannel = normalizeChannel({ - channel, - }); - const firstKey = normalizedChannel.keys[0]; - const lastKey = normalizedChannel.keys[normalizedChannel.keys.length - 1]; - if (!firstKey || !lastKey) { - return fallbackValue; - } - - if (time <= firstKey.time) { - if (time < firstKey.time) { - return extrapolateScalarEdge({ - mode: normalizedChannel.extrapolation?.before ?? "hold", - edgeKey: firstKey, - neighborKey: normalizedChannel.keys[1], - time, - }); - } - - return firstKey.value; - } - - if (time >= lastKey.time) { - if (time > lastKey.time) { - return extrapolateScalarEdge({ - mode: normalizedChannel.extrapolation?.after ?? "hold", - edgeKey: lastKey, - neighborKey: normalizedChannel.keys[normalizedChannel.keys.length - 2], - time, - }); - } - - return lastKey.value; - } - - for ( - let keyIndex = 0; - keyIndex < normalizedChannel.keys.length - 1; - keyIndex++ - ) { - const leftKey = normalizedChannel.keys[keyIndex]; - const rightKey = normalizedChannel.keys[keyIndex + 1]; - if (time === rightKey.time) { - return rightKey.value; - } - - if ( - !isWithinTimePair({ - time, - leftTime: leftKey.time, - rightTime: rightKey.time, - }) - ) { - continue; - } - - if (leftKey.segmentToNext === "step") { - return leftKey.value; - } - - const span = rightKey.time - leftKey.time; - if (span === 0) { - return rightKey.value; - } - - const progress = clamp({ - value: (time - leftKey.time) / span, - min: 0, - max: 1, - }); - if (leftKey.segmentToNext === "linear") { - return lerpNumber({ - leftValue: leftKey.value, - rightValue: rightKey.value, - progress, - }); - } - - const curveProgress = solveBezierProgressForTime({ - time, - leftKey, - rightKey, - }); - const rightHandle = - leftKey.rightHandle ?? getDefaultRightHandle({ leftKey, rightKey }); - const leftHandle = - rightKey.leftHandle ?? getDefaultLeftHandle({ leftKey, rightKey }); - return getBezierPoint({ - progress: curveProgress, - p0: leftKey.value, - p1: leftKey.value + rightHandle.dv, - p2: rightKey.value + leftHandle.dv, - p3: rightKey.value, - }); - } - - return lastKey.value; -} - -export function getDiscreteChannelValueAtTime({ - channel, - time, - fallbackValue, -}: { - channel: DiscreteAnimationChannel | undefined; - time: number; - fallbackValue: DiscreteValue; -}): DiscreteValue { - if (!channel || channel.keys.length === 0) { - return fallbackValue; - } - - const normalizedChannel = normalizeChannel({ - channel, - }); - let currentValue = fallbackValue; - for (const key of normalizedChannel.keys) { - if (time < key.time) { - break; - } - currentValue = key.value; - } - return currentValue; -} - -export function getChannelValueAtTime({ - channel, - time, - fallbackValue, -}: { - channel: AnimationChannel | undefined; - time: number; - fallbackValue: AnimationValue; -}): AnimationValue { - if (!channel || channel.keys.length === 0) { - return fallbackValue; - } - - if (channel.kind === "scalar") { - return typeof fallbackValue === "number" - ? getScalarChannelValueAtTime({ - channel, - time, - fallbackValue, - }) - : fallbackValue; - } - - if (typeof fallbackValue !== "string" && typeof fallbackValue !== "boolean") { - return fallbackValue; - } - - return getDiscreteChannelValueAtTime({ - channel, - time, - fallbackValue, - }); -} diff --git a/apps/web/src/animation/keyframe-query.ts b/apps/web/src/animation/keyframe-query.ts deleted file mode 100644 index e65db881..00000000 --- a/apps/web/src/animation/keyframe-query.ts +++ /dev/null @@ -1,294 +0,0 @@ -import type { - AnimationBindingInstance, - AnimationChannel, - AnimationPath, - ElementAnimations, - ElementKeyframe, -} from "@/animation/types"; -import { - type AnimationComponentValue, - composeAnimationValue, -} from "./binding-values"; -import { - getChannelValueAtTime, - getScalarSegmentInterpolation, -} from "./interpolation"; -import { isAnimationPath } from "./path"; - -function getBindingFallbackValue({ - channel, -}: { - channel: ElementAnimations["channels"][string]; -}) { - if (!channel || channel.keys.length === 0) { - return channel?.kind === "discrete" ? false : 0; - } - - return channel.keys[0].value; -} - -interface BindingKeyframeMatch { - componentIndex: number; - channel: AnimationChannel; - keyframe: AnimationChannel["keys"][number]; -} - -function getBindingKeyframeMatches({ - animations, - binding, -}: { - animations: ElementAnimations; - binding: AnimationBindingInstance; -}): BindingKeyframeMatch[] { - return binding.components.flatMap((component, componentIndex) => { - const channel = animations.channels[component.channelId]; - if (!channel || channel.keys.length === 0) { - return []; - } - - return channel.keys.map((keyframe) => ({ - componentIndex, - channel, - keyframe, - })); - }); -} - -function getUniqueBindingKeyframeMatches({ - animations, - binding, -}: { - animations: ElementAnimations; - binding: AnimationBindingInstance; -}): BindingKeyframeMatch[] { - const sortedMatches = getBindingKeyframeMatches({ - animations, - binding, - }).sort( - (leftMatch, rightMatch) => - leftMatch.keyframe.time - rightMatch.keyframe.time || - leftMatch.componentIndex - rightMatch.componentIndex, - ); - const uniqueMatches: BindingKeyframeMatch[] = []; - - for (const match of sortedMatches) { - const previousMatch = uniqueMatches[uniqueMatches.length - 1]; - if ( - !previousMatch || - previousMatch.keyframe.time !== match.keyframe.time - ) { - uniqueMatches.push(match); - continue; - } - - if ( - previousMatch.componentIndex !== 0 && - match.componentIndex === 0 - ) { - uniqueMatches[uniqueMatches.length - 1] = match; - } - } - - return uniqueMatches; -} - -function getPreferredBindingKeyframeMatch({ - matches, -}: { - matches: BindingKeyframeMatch[]; -}): BindingKeyframeMatch | null { - return ( - matches.find((match) => match.componentIndex === 0) ?? - matches[0] ?? - null - ); -} - -function getComposedBindingValueAtTime({ - animations, - binding, - time, -}: { - animations: ElementAnimations; - binding: AnimationBindingInstance; - time: number; -}) { - const componentValues = Object.fromEntries( - binding.components.map((component) => { - const channel = animations.channels[component.channelId]; - return [ - component.key, - getChannelValueAtTime({ - channel, - time, - fallbackValue: getBindingFallbackValue({ channel }), - }), - ]; - }), - ) as Record; - - return composeAnimationValue({ - binding, - componentValues, - }); -} - -function getKeyframeInterpolation({ - channel, - keyframe, -}: { - channel: AnimationChannel; - keyframe: AnimationChannel["keys"][number]; -}) { - return channel.kind === "scalar" && "segmentToNext" in keyframe - ? getScalarSegmentInterpolation({ segment: keyframe.segmentToNext }) - : "hold"; -} - -function toElementKeyframe({ - animations, - binding, - propertyPath, - keyframeMatch, -}: { - animations: ElementAnimations; - binding: AnimationBindingInstance; - propertyPath: AnimationPath; - keyframeMatch: BindingKeyframeMatch; -}): ElementKeyframe | null { - const value = getComposedBindingValueAtTime({ - animations, - binding, - time: keyframeMatch.keyframe.time, - }); - if (value === null) { - return null; - } - - return { - propertyPath, - id: keyframeMatch.keyframe.id, - time: keyframeMatch.keyframe.time, - value, - interpolation: getKeyframeInterpolation({ - channel: keyframeMatch.channel, - keyframe: keyframeMatch.keyframe, - }), - }; -} - -export function getElementKeyframes({ - animations, -}: { - animations: ElementAnimations | undefined; -}): ElementKeyframe[] { - if (!animations) { - return []; - } - - return Object.entries(animations.bindings).flatMap( - ([propertyPath, binding]) => { - if (!binding || !isAnimationPath(propertyPath)) { - return []; - } - - return getUniqueBindingKeyframeMatches({ - animations, - binding, - }).flatMap((keyframeMatch) => { - const keyframe = toElementKeyframe({ - animations, - binding, - propertyPath, - keyframeMatch, - }); - if (!keyframe) { - return []; - } - - return [keyframe]; - }); - }, - ); -} - -export function hasKeyframesForPath({ - animations, - propertyPath, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; -}): boolean { - const binding = animations?.bindings[propertyPath]; - if (!binding) { - return false; - } - - return binding.components.some((component) => - Boolean(animations?.channels[component.channelId]?.keys.length), - ); -} - -export function getKeyframeAtTime({ - animations, - propertyPath, - time, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - time: number; -}): ElementKeyframe | null { - const binding = animations?.bindings[propertyPath]; - if (!binding) { - return null; - } - - const keyframeMatch = getPreferredBindingKeyframeMatch({ - matches: getBindingKeyframeMatches({ - animations, - binding, - }).filter(({ keyframe }) => keyframe.time === time), - }); - if (!keyframeMatch) { - return null; - } - - return toElementKeyframe({ - animations, - binding, - propertyPath, - keyframeMatch, - }); -} - -export function getKeyframeById({ - animations, - propertyPath, - keyframeId, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - keyframeId: string; -}): ElementKeyframe | null { - const binding = animations?.bindings[propertyPath]; - if (!binding) { - return null; - } - - const keyframeMatch = getPreferredBindingKeyframeMatch({ - matches: getBindingKeyframeMatches({ - animations, - binding, - }).filter(({ keyframe }) => keyframe.id === keyframeId), - }); - if (!keyframeMatch) { - return null; - } - - return toElementKeyframe({ - animations, - binding, - propertyPath, - keyframeMatch, - }); -} diff --git a/apps/web/src/animation/keyframes.ts b/apps/web/src/animation/keyframes.ts deleted file mode 100644 index 70f9b5db..00000000 --- a/apps/web/src/animation/keyframes.ts +++ /dev/null @@ -1,1350 +0,0 @@ -import type { - AnimationBindingInstance, - AnimationBindingKind, - AnimationChannel, - AnimationInterpolation, - AnimationPath, - AnimationPropertyPath, - AnimationValue, - DiscreteAnimationChannel, - DiscreteAnimationKey, - ElementAnimations, - ScalarAnimationChannel, - ScalarAnimationKey, - ScalarCurveKeyframePatch, - ScalarSegmentType, -} from "@/animation/types"; -import { - cloneAnimationBinding, - createAnimationBinding, - decomposeAnimationValue, -} from "./binding-values"; -import { - getBezierPoint, - getDefaultLeftHandle, - getDefaultRightHandle, - solveBezierProgressForTime, -} from "./bezier"; -import { - getChannelValueAtTime, - getScalarSegmentInterpolation, - normalizeChannel, -} from "./interpolation"; -import { - coerceAnimationValueForProperty, - getAnimationPropertyDefinition, -} from "./property-registry"; -import { - type MediaTime, - roundMediaTime, - subMediaTime, - ZERO_MEDIA_TIME, -} from "@/wasm"; -import { generateUUID } from "@/utils/id"; - -function isNearlySameTime({ - leftTime, - rightTime, -}: { - leftTime: number; - rightTime: number; -}): boolean { - return leftTime === rightTime; -} - -function hasChannelKeys({ - channel, -}: { - channel: AnimationChannel | undefined; -}): boolean { - return Boolean(channel && channel.keys.length > 0); -} - -function toAnimation({ - animations, -}: { - animations: ElementAnimations; -}): ElementAnimations | undefined { - const nextBindings = Object.fromEntries( - Object.entries(animations.bindings).filter(([, binding]) => binding), - ); - const nextChannels = Object.fromEntries( - Object.entries(animations.channels).filter(([, channel]) => - hasChannelKeys({ channel }), - ), - ); - if (Object.keys(nextBindings).length === 0 || Object.keys(nextChannels).length === 0) { - return undefined; - } - - return { - bindings: nextBindings, - channels: nextChannels, - }; -} - -function cloneAnimationsState({ - animations, -}: { - animations: ElementAnimations | undefined; -}): ElementAnimations { - return { - bindings: { ...(animations?.bindings ?? {}) }, - channels: { ...(animations?.channels ?? {}) }, - }; -} - -function getBindingChannelKind({ - kind, -}: { - kind: AnimationBindingKind; -}): AnimationChannel["kind"] { - return kind === "discrete" ? "discrete" : "scalar"; -} - -function getPrimaryComponent({ - binding, -}: { - binding: AnimationBindingInstance; -}) { - return binding.components[0] ?? null; -} - -function getPrimaryChannelId({ - binding, -}: { - binding: AnimationBindingInstance; -}) { - return getPrimaryComponent({ binding })?.channelId ?? null; -} - -function getScalarSegmentType({ - interpolation, -}: { - interpolation: AnimationInterpolation; -}): ScalarSegmentType { - if (interpolation === "hold") { - return "step"; - } - return interpolation === "bezier" ? "bezier" : "linear"; -} - -function getInterpolationForBinding({ - kind, - interpolation, -}: { - kind: AnimationBindingKind; - interpolation: AnimationInterpolation | undefined; -}): AnimationInterpolation { - if (kind === "discrete") { - return "hold"; - } - - if ( - interpolation === "linear" || - interpolation === "hold" || - interpolation === "bezier" - ) { - return interpolation; - } - - return "linear"; -} - -function createEmptyChannelForBindingKind({ - kind, -}: { - kind: AnimationBindingKind; -}): AnimationChannel { - if (kind === "discrete") { - return { - kind: "discrete", - keys: [], - } satisfies DiscreteAnimationChannel; - } - - return { - kind: "scalar", - keys: [], - } satisfies ScalarAnimationChannel; -} - -function createScalarKey({ - id, - time, - value, - interpolation, - previousKey, -}: { - id: string; - time: MediaTime; - value: number; - interpolation?: AnimationInterpolation; - previousKey?: ScalarAnimationKey; -}): ScalarAnimationKey { - return { - id, - time, - value, - leftHandle: previousKey?.leftHandle, - rightHandle: previousKey?.rightHandle, - segmentToNext: - previousKey?.segmentToNext ?? - getScalarSegmentType({ interpolation: interpolation ?? "linear" }), - tangentMode: previousKey?.tangentMode ?? "flat", - }; -} - -function createDiscreteKey({ - id, - time, - value, -}: { - id: string; - time: MediaTime; - value: string | boolean; -}): DiscreteAnimationKey { - return { - id, - time, - value, - }; -} - -function getBinding({ - animations, - propertyPath, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; -}): AnimationBindingInstance | undefined { - return animations?.bindings[propertyPath]; -} - -function getChannelById({ - animations, - channelId, -}: { - animations: ElementAnimations | undefined; - channelId: string; -}): AnimationChannel | undefined { - return animations?.channels[channelId]; -} - -function getBindingComponent({ - binding, - componentKey, -}: { - binding: AnimationBindingInstance; - componentKey: string; -}) { - return binding.components.find((component) => component.key === componentKey) ?? null; -} - -function getTargetKeyMetadata({ - channel, - time, - keyframeId, -}: { - channel: AnimationChannel | undefined; - time: MediaTime; - keyframeId?: string; -}) { - const normalizedChannel = - channel != null ? normalizeChannel({ channel }) : undefined; - const keys = normalizedChannel?.keys ?? []; - if (keyframeId) { - const keyById = keys.find((key) => key.id === keyframeId); - if (keyById) { - return { - id: keyById.id, - time, - }; - } - } - - const keyAtTime = keys.find((key) => - isNearlySameTime({ leftTime: key.time, rightTime: time }), - ); - if (keyAtTime) { - return { - id: keyAtTime.id, - time: keyAtTime.time, - }; - } - - return { - id: keyframeId ?? generateUUID(), - time, - }; -} - -function upsertDiscreteChannelKey({ - channel, - time, - value, - keyframeId, -}: { - channel: DiscreteAnimationChannel | undefined; - time: MediaTime; - value: string | boolean; - keyframeId?: string; -}): DiscreteAnimationChannel { - const normalizedChannel = normalizeChannel({ - channel: channel ?? { kind: "discrete", keys: [] }, - }); - const keys = [...normalizedChannel.keys]; - if (keyframeId) { - const existingIndex = keys.findIndex((key) => key.id === keyframeId); - if (existingIndex >= 0) { - keys[existingIndex] = createDiscreteKey({ - id: keys[existingIndex].id, - time, - value, - }); - return normalizeChannel({ - channel: { kind: "discrete", keys }, - }); - } - } - - const existingAtTimeIndex = keys.findIndex((key) => - isNearlySameTime({ leftTime: key.time, rightTime: time }), - ); - if (existingAtTimeIndex >= 0) { - keys[existingAtTimeIndex] = createDiscreteKey({ - id: keys[existingAtTimeIndex].id, - time: keys[existingAtTimeIndex].time, - value, - }); - return normalizeChannel({ - channel: { kind: "discrete", keys }, - }); - } - - keys.push( - createDiscreteKey({ - id: keyframeId ?? generateUUID(), - time, - value, - }), - ); - return normalizeChannel({ - channel: { kind: "discrete", keys }, - }); -} - -function upsertScalarChannelKey({ - channel, - time, - value, - interpolation, - defaultInterpolation, - keyframeId, -}: { - channel: ScalarAnimationChannel | undefined; - time: MediaTime; - value: number; - interpolation?: AnimationInterpolation; - defaultInterpolation?: AnimationInterpolation; - keyframeId?: string; -}): ScalarAnimationChannel { - const normalizedChannel = normalizeChannel({ - channel: channel ?? { kind: "scalar", keys: [] }, - }); - const keys = [...normalizedChannel.keys]; - if (keyframeId) { - const existingIndex = keys.findIndex((key) => key.id === keyframeId); - if (existingIndex >= 0) { - keys[existingIndex] = createScalarKey({ - id: keys[existingIndex].id, - time, - value, - interpolation, - previousKey: - interpolation != null - ? { - ...keys[existingIndex], - segmentToNext: getScalarSegmentType({ interpolation }), - } - : keys[existingIndex], - }); - return normalizeChannel({ - channel: { - kind: "scalar", - keys, - extrapolation: normalizedChannel.extrapolation, - }, - }); - } - } - - const existingAtTimeIndex = keys.findIndex((key) => - isNearlySameTime({ leftTime: key.time, rightTime: time }), - ); - if (existingAtTimeIndex >= 0) { - keys[existingAtTimeIndex] = createScalarKey({ - id: keys[existingAtTimeIndex].id, - time: keys[existingAtTimeIndex].time, - value, - interpolation, - previousKey: - interpolation != null - ? { - ...keys[existingAtTimeIndex], - segmentToNext: getScalarSegmentType({ interpolation }), - } - : keys[existingAtTimeIndex], - }); - return normalizeChannel({ - channel: { - kind: "scalar", - keys, - extrapolation: normalizedChannel.extrapolation, - }, - }); - } - - keys.push( - createScalarKey({ - id: keyframeId ?? generateUUID(), - time, - value, - interpolation: interpolation ?? defaultInterpolation, - }), - ); - return normalizeChannel({ - channel: { - kind: "scalar", - keys, - extrapolation: normalizedChannel.extrapolation, - }, - }); -} - -export function getChannel({ - animations, - propertyPath, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; -}): AnimationChannel | undefined { - const binding = getBinding({ animations, propertyPath }); - const primaryChannelId = - binding != null ? getPrimaryChannelId({ binding }) : null; - return primaryChannelId ? animations?.channels[primaryChannelId] : undefined; -} - -export function upsertPathKeyframe({ - animations, - propertyPath, - time, - value, - interpolation, - keyframeId, - kind, - defaultInterpolation, - coerceValue, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - time: MediaTime; - value: AnimationValue; - interpolation?: AnimationInterpolation; - keyframeId?: string; - kind: AnimationBindingKind; - defaultInterpolation: AnimationInterpolation; - coerceValue: ({ value }: { value: AnimationValue }) => AnimationValue | null; -}): ElementAnimations | undefined { - const coercedValue = coerceValue({ value }); - if (coercedValue === null) { - return animations; - } - - const nextAnimations = cloneAnimationsState({ animations }); - const existingBinding = getBinding({ - animations, - propertyPath, - }); - const binding = - existingBinding && existingBinding.kind === kind - ? cloneAnimationBinding({ binding: existingBinding }) - : createAnimationBinding({ path: propertyPath, kind }); - const primaryChannel = getChannel({ - animations, - propertyPath, - }); - const targetKey = getTargetKeyMetadata({ - channel: primaryChannel, - time, - keyframeId, - }); - const componentValues = decomposeAnimationValue({ - kind, - value: coercedValue, - }); - if (!componentValues) { - return animations; - } - - const explicitInterpolation = - interpolation != null - ? getInterpolationForBinding({ kind, interpolation }) - : undefined; - const validatedDefaultInterpolation = getInterpolationForBinding({ - kind, - interpolation: defaultInterpolation, - }); - nextAnimations.bindings[propertyPath] = binding; - for (const component of binding.components) { - const nextValue = componentValues[component.key]; - if (nextValue == null) { - continue; - } - - const currentChannel = getChannelById({ - animations, - channelId: component.channelId, - }); - const targetChannel = - currentChannel?.kind === getBindingChannelKind({ kind }) - ? currentChannel - : createEmptyChannelForBindingKind({ kind }); - nextAnimations.channels[component.channelId] = - targetChannel.kind === "discrete" - ? upsertDiscreteChannelKey({ - channel: targetChannel, - time: targetKey.time, - value: nextValue as string | boolean, - keyframeId: targetKey.id, - }) - : upsertScalarChannelKey({ - channel: targetChannel, - time: targetKey.time, - value: nextValue as number, - interpolation: explicitInterpolation, - defaultInterpolation: validatedDefaultInterpolation, - keyframeId: targetKey.id, - }); - } - - return toAnimation({ - animations: nextAnimations, - }); -} - -export function upsertElementKeyframe({ - animations, - propertyPath, - time, - value, - interpolation, - keyframeId, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPropertyPath; - time: MediaTime; - value: AnimationValue; - interpolation?: AnimationInterpolation; - keyframeId?: string; -}): ElementAnimations | undefined { - const coercedValue = coerceAnimationValueForProperty({ - propertyPath, - value, - }); - if (coercedValue === null) { - return animations; - } - - const propertyDefinition = getAnimationPropertyDefinition({ propertyPath }); - return upsertPathKeyframe({ - animations, - propertyPath, - time, - value: coercedValue, - interpolation, - keyframeId, - kind: propertyDefinition.kind, - defaultInterpolation: propertyDefinition.defaultInterpolation, - coerceValue: ({ value: nextValue }) => - coerceAnimationValueForProperty({ - propertyPath, - value: nextValue, - }), - }); -} - -export function upsertKeyframe({ - channel, - time, - value, - interpolation, - keyframeId, -}: { - channel: AnimationChannel | undefined; - time: MediaTime; - value: AnimationValue; - interpolation?: AnimationInterpolation; - keyframeId?: string; -}): AnimationChannel | undefined { - if (!channel) { - return undefined; - } - - if (channel.kind === "discrete") { - if (typeof value !== "string" && typeof value !== "boolean") { - return channel; - } - - return upsertDiscreteChannelKey({ - channel, - time, - value, - keyframeId, - }); - } - - if (typeof value !== "number") { - return channel; - } - - return upsertScalarChannelKey({ - channel, - time, - value, - interpolation, - keyframeId, - }); -} - -export function removeKeyframe({ - channel, - keyframeId, -}: { - channel: AnimationChannel | undefined; - keyframeId: string; -}): AnimationChannel | undefined { - if (!channel) { - return undefined; - } - - const nextKeys = channel.keys.filter((keyframe) => keyframe.id !== keyframeId); - if (nextKeys.length === 0) { - return undefined; - } - - return normalizeChannel({ - channel: { - ...channel, - keys: nextKeys, - } as AnimationChannel, - }); -} - -export function retimeKeyframe({ - channel, - keyframeId, - time, -}: { - channel: AnimationChannel | undefined; - keyframeId: string; - time: MediaTime; -}): AnimationChannel | undefined { - if (!channel) { - return undefined; - } - - const keyframeByIdIndex = channel.keys.findIndex( - (keyframe) => keyframe.id === keyframeId, - ); - if (keyframeByIdIndex < 0) { - return channel; - } - - const nextKeys = [...channel.keys]; - nextKeys[keyframeByIdIndex] = { - ...nextKeys[keyframeByIdIndex], - time, - }; - - return normalizeChannel({ - channel: { - ...channel, - keys: nextKeys, - } as AnimationChannel, - }); -} - -export function setChannel({ - animations, - propertyPath, - channel, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - channel: AnimationChannel | undefined; -}): ElementAnimations | undefined { - const binding = getBinding({ animations, propertyPath }); - if (!binding) { - return animations; - } - - if (binding.components.length !== 1) { - throw new Error( - `setChannel only supports single-component bindings. Received "${propertyPath}" with ${binding.components.length} components.`, - ); - } - - const primaryComponent = getPrimaryComponent({ binding }); - if (!primaryComponent) { - return animations; - } - - return setBindingComponentChannel({ - animations, - propertyPath, - componentKey: primaryComponent.key, - channel, - }); -} - -export function setBindingComponentChannel({ - animations, - propertyPath, - componentKey, - channel, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - componentKey: string; - channel: AnimationChannel | undefined; -}): ElementAnimations | undefined { - const binding = getBinding({ animations, propertyPath }); - if (!binding) { - return animations; - } - - const component = getBindingComponent({ - binding, - componentKey, - }); - if (!component) { - return animations; - } - - const nextAnimations = cloneAnimationsState({ animations }); - if (!channel || !hasChannelKeys({ channel })) { - delete nextAnimations.channels[component.channelId]; - const hasRemainingKeys = binding.components.some((candidate) => - hasChannelKeys({ - channel: nextAnimations.channels[candidate.channelId], - }), - ); - if (!hasRemainingKeys) { - delete nextAnimations.bindings[propertyPath]; - } - return toAnimation({ - animations: nextAnimations, - }); - } - - nextAnimations.channels[component.channelId] = normalizeChannel({ - channel, - }); - return toAnimation({ - animations: nextAnimations, - }); -} - -export function updateScalarKeyframeCurve({ - animations, - propertyPath, - componentKey, - keyframeId, - patch, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - componentKey: string; - keyframeId: string; - patch: ScalarCurveKeyframePatch; -}): ElementAnimations | undefined { - const binding = getBinding({ animations, propertyPath }); - if (!binding) { - return animations; - } - - const component = getBindingComponent({ - binding, - componentKey, - }); - if (!component) { - return animations; - } - - const channel = getChannelById({ - animations, - channelId: component.channelId, - }); - if (channel?.kind !== "scalar") { - return animations; - } - - const keyframeIndex = channel.keys.findIndex((keyframe) => keyframe.id === keyframeId); - if (keyframeIndex < 0) { - return animations; - } - - const nextKeys = [...channel.keys]; - const currentKey = nextKeys[keyframeIndex]; - nextKeys[keyframeIndex] = { - ...currentKey, - leftHandle: - patch.leftHandle === undefined - ? currentKey.leftHandle - : patch.leftHandle ?? undefined, - rightHandle: - patch.rightHandle === undefined - ? currentKey.rightHandle - : patch.rightHandle ?? undefined, - segmentToNext: patch.segmentToNext ?? currentKey.segmentToNext, - tangentMode: patch.tangentMode ?? currentKey.tangentMode, - }; - - return setBindingComponentChannel({ - animations, - propertyPath, - componentKey, - channel: { - kind: "scalar", - keys: nextKeys, - extrapolation: channel.extrapolation, - }, - }); -} - -export function cloneAnimations({ - animations, - shouldRegenerateKeyframeIds = false, -}: { - animations: ElementAnimations | undefined; - shouldRegenerateKeyframeIds?: boolean; -}): ElementAnimations | undefined { - if (!animations) { - return undefined; - } - - const nextAnimations = cloneAnimationsState({ animations }); - nextAnimations.bindings = Object.fromEntries( - Object.entries(animations.bindings).map(([path, binding]) => [ - path, - binding ? cloneAnimationBinding({ binding }) : binding, - ]), - ); - nextAnimations.channels = {}; - - for (const binding of Object.values(nextAnimations.bindings)) { - if (!binding) { - continue; - } - - const primaryChannel = getChannelById({ - animations, - channelId: getPrimaryChannelId({ binding }) ?? "", - }); - const keyIdMap = new Map(); - if (primaryChannel) { - for (const key of primaryChannel.keys) { - keyIdMap.set( - key.id, - shouldRegenerateKeyframeIds ? generateUUID() : key.id, - ); - } - } - - for (const component of binding.components) { - const currentChannel = getChannelById({ - animations, - channelId: component.channelId, - }); - if (!currentChannel) { - continue; - } - - nextAnimations.channels[component.channelId] = normalizeChannel({ - channel: { - ...currentChannel, - keys: currentChannel.keys.map((key) => ({ - ...key, - id: keyIdMap.get(key.id) ?? key.id, - })), - } as AnimationChannel, - }); - } - } - - return toAnimation({ - animations: nextAnimations, - }); -} - -export function clampAnimationsToDuration({ - animations, - duration, -}: { - animations: ElementAnimations | undefined; - duration: MediaTime; -}): ElementAnimations | undefined { - if (!animations || duration <= 0) { - return undefined; - } - - return splitAnimationsAtTime({ - animations, - splitTime: duration, - shouldIncludeSplitBoundary: true, - }).leftAnimations; -} - -function lerpPoint({ - left, - right, - progress, -}: { - left: { x: number; y: number }; - right: { x: number; y: number }; - progress: number; -}) { - return { - x: left.x + (right.x - left.x) * progress, - y: left.y + (right.y - left.y) * progress, - }; -} - -function splitDiscreteChannelAtTime({ - channel, - splitTime, - leftBoundaryId, - rightBoundaryId, - shouldIncludeSplitBoundary, -}: { - channel: DiscreteAnimationChannel | undefined; - splitTime: MediaTime; - leftBoundaryId: string; - rightBoundaryId: string; - shouldIncludeSplitBoundary: boolean; -}) { - if (!channel || channel.keys.length === 0) { - return { - leftChannel: undefined, - rightChannel: undefined, - }; - } - - const normalizedChannel = normalizeChannel({ channel }); - let leftKeys = normalizedChannel.keys.filter((key) => key.time <= splitTime); - let rightKeys = normalizedChannel.keys - .filter((key) => key.time >= splitTime) - .map((key) => ({ - ...key, - time: subMediaTime({ a: key.time, b: splitTime }), - })); - - if (shouldIncludeSplitBoundary) { - const hasBoundaryOnLeft = leftKeys.some((key) => - isNearlySameTime({ leftTime: key.time, rightTime: splitTime }), - ); - const hasBoundaryOnRight = rightKeys.some((key) => - isNearlySameTime({ leftTime: key.time, rightTime: 0 }), - ); - const boundaryValue = getChannelValueAtTime({ - channel: normalizedChannel, - time: splitTime, - fallbackValue: normalizedChannel.keys[0].value, - }); - if (!hasBoundaryOnLeft) { - leftKeys = [ - ...leftKeys, - createDiscreteKey({ - id: leftBoundaryId, - time: splitTime, - value: boundaryValue as string | boolean, - }), - ]; - } - if (!hasBoundaryOnRight) { - rightKeys = [ - createDiscreteKey({ - id: rightBoundaryId, - time: ZERO_MEDIA_TIME, - value: boundaryValue as string | boolean, - }), - ...rightKeys, - ]; - } - } - - return { - leftChannel: leftKeys.length - ? normalizeChannel({ channel: { kind: "discrete", keys: leftKeys } }) - : undefined, - rightChannel: rightKeys.length - ? normalizeChannel({ channel: { kind: "discrete", keys: rightKeys } }) - : undefined, - }; -} - -function splitScalarChannelAtTime({ - channel, - splitTime, - leftBoundaryId, - rightBoundaryId, - shouldIncludeSplitBoundary, -}: { - channel: ScalarAnimationChannel | undefined; - splitTime: MediaTime; - leftBoundaryId: string; - rightBoundaryId: string; - shouldIncludeSplitBoundary: boolean; -}) { - if (!channel || channel.keys.length === 0) { - return { - leftChannel: undefined, - rightChannel: undefined, - }; - } - - const normalizedChannel = normalizeChannel({ channel }); - let leftKeys = normalizedChannel.keys.filter((key) => key.time <= splitTime); - let rightKeys = normalizedChannel.keys - .filter((key) => key.time >= splitTime) - .map((key) => ({ - ...key, - time: subMediaTime({ a: key.time, b: splitTime }), - })); - - const hasBoundaryOnLeft = leftKeys.some((key) => - isNearlySameTime({ leftTime: key.time, rightTime: splitTime }), - ); - const hasBoundaryOnRight = rightKeys.some((key) => - isNearlySameTime({ leftTime: key.time, rightTime: 0 }), - ); - if (!shouldIncludeSplitBoundary || (hasBoundaryOnLeft && hasBoundaryOnRight)) { - return { - leftChannel: leftKeys.length - ? normalizeChannel({ - channel: { - kind: "scalar", - keys: leftKeys, - extrapolation: normalizedChannel.extrapolation, - }, - }) - : undefined, - rightChannel: rightKeys.length - ? normalizeChannel({ - channel: { - kind: "scalar", - keys: rightKeys, - extrapolation: normalizedChannel.extrapolation, - }, - }) - : undefined, - }; - } - - for (let keyIndex = 0; keyIndex < normalizedChannel.keys.length - 1; keyIndex++) { - const leftKey = normalizedChannel.keys[keyIndex]; - const rightKey = normalizedChannel.keys[keyIndex + 1]; - if ( - !( - splitTime > leftKey.time && - splitTime < rightKey.time - ) - ) { - continue; - } - - const boundaryValue = getChannelValueAtTime({ - channel: normalizedChannel, - time: splitTime, - fallbackValue: leftKey.value, - }) as number; - - if (leftKey.segmentToNext === "bezier") { - const rightHandle = - leftKey.rightHandle ?? getDefaultRightHandle({ leftKey, rightKey }); - const leftHandle = - rightKey.leftHandle ?? getDefaultLeftHandle({ leftKey, rightKey }); - const progress = solveBezierProgressForTime({ - time: splitTime, - leftKey, - rightKey, - }); - const p0 = { x: leftKey.time, y: leftKey.value }; - const p1 = { - x: leftKey.time + rightHandle.dt, - y: leftKey.value + rightHandle.dv, - }; - const p2 = { - x: rightKey.time + leftHandle.dt, - y: rightKey.value + leftHandle.dv, - }; - const p3 = { x: rightKey.time, y: rightKey.value }; - const q0 = lerpPoint({ left: p0, right: p1, progress }); - const q1 = lerpPoint({ left: p1, right: p2, progress }); - const q2 = lerpPoint({ left: p2, right: p3, progress }); - const r0 = lerpPoint({ left: q0, right: q1, progress }); - const r1 = lerpPoint({ left: q1, right: q2, progress }); - const splitPoint = lerpPoint({ left: r0, right: r1, progress }); - leftKeys = [ - ...normalizedChannel.keys.filter((key) => key.time < splitTime), - { - ...leftKey, - rightHandle: { - dt: roundMediaTime({ time: q0.x - p0.x }), - dv: q0.y - p0.y, - }, - }, - { - id: leftBoundaryId, - time: splitTime, - value: boundaryValue, - leftHandle: { - dt: roundMediaTime({ time: r0.x - splitPoint.x }), - dv: r0.y - splitPoint.y, - }, - segmentToNext: leftKey.segmentToNext, - tangentMode: leftKey.tangentMode, - }, - ]; - rightKeys = [ - { - id: rightBoundaryId, - time: ZERO_MEDIA_TIME, - value: boundaryValue, - rightHandle: { - dt: roundMediaTime({ time: r1.x - splitPoint.x }), - dv: r1.y - splitPoint.y, - }, - segmentToNext: "bezier", - tangentMode: leftKey.tangentMode, - }, - { - ...rightKey, - time: subMediaTime({ a: rightKey.time, b: splitTime }), - leftHandle: { - dt: roundMediaTime({ time: q2.x - p3.x }), - dv: q2.y - p3.y, - }, - }, - ...normalizedChannel.keys - .filter((key) => key.time > rightKey.time) - .map((key) => ({ - ...key, - time: subMediaTime({ a: key.time, b: splitTime }), - })), - ]; - } else { - leftKeys = [ - ...leftKeys, - createScalarKey({ - id: leftBoundaryId, - time: splitTime, - value: boundaryValue, - interpolation: "linear", - }), - ]; - rightKeys = [ - createScalarKey({ - id: rightBoundaryId, - time: ZERO_MEDIA_TIME, - value: boundaryValue, - interpolation: getScalarSegmentInterpolation({ - segment: leftKey.segmentToNext, - }), - }), - ...rightKeys, - ]; - } - - return { - leftChannel: normalizeChannel({ - channel: { - kind: "scalar", - keys: leftKeys, - extrapolation: normalizedChannel.extrapolation, - }, - }), - rightChannel: normalizeChannel({ - channel: { - kind: "scalar", - keys: rightKeys, - extrapolation: normalizedChannel.extrapolation, - }, - }), - }; - } - - return { - leftChannel: leftKeys.length - ? normalizeChannel({ - channel: { - kind: "scalar", - keys: leftKeys, - extrapolation: normalizedChannel.extrapolation, - }, - }) - : undefined, - rightChannel: rightKeys.length - ? normalizeChannel({ - channel: { - kind: "scalar", - keys: rightKeys, - extrapolation: normalizedChannel.extrapolation, - }, - }) - : undefined, - }; -} - -export function splitAnimationsAtTime({ - animations, - splitTime, - shouldIncludeSplitBoundary = true, -}: { - animations: ElementAnimations | undefined; - splitTime: MediaTime; - shouldIncludeSplitBoundary?: boolean; -}): { - leftAnimations: ElementAnimations | undefined; - rightAnimations: ElementAnimations | undefined; -} { - if (!animations) { - return { leftAnimations: undefined, rightAnimations: undefined }; - } - - const leftAnimations = cloneAnimationsState({ animations: undefined }); - const rightAnimations = cloneAnimationsState({ animations: undefined }); - - for (const [propertyPath, binding] of Object.entries(animations.bindings)) { - if (!binding) { - continue; - } - - const leftBinding = cloneAnimationBinding({ binding }); - const rightBinding = cloneAnimationBinding({ binding }); - const leftBoundaryId = generateUUID(); - const rightBoundaryId = generateUUID(); - let hasLeftKeys = false; - let hasRightKeys = false; - - for (const component of binding.components) { - const channel = getChannelById({ - animations, - channelId: component.channelId, - }); - const splitResult = - channel?.kind === "discrete" - ? splitDiscreteChannelAtTime({ - channel, - splitTime, - leftBoundaryId, - rightBoundaryId, - shouldIncludeSplitBoundary, - }) - : splitScalarChannelAtTime({ - channel: channel as ScalarAnimationChannel | undefined, - splitTime, - leftBoundaryId, - rightBoundaryId, - shouldIncludeSplitBoundary, - }); - if (splitResult.leftChannel) { - leftAnimations.channels[component.channelId] = splitResult.leftChannel; - hasLeftKeys = true; - } - if (splitResult.rightChannel) { - rightAnimations.channels[component.channelId] = splitResult.rightChannel; - hasRightKeys = true; - } - } - - if (hasLeftKeys) { - leftAnimations.bindings[propertyPath] = leftBinding; - } - if (hasRightKeys) { - rightAnimations.bindings[propertyPath] = rightBinding; - } - } - - return { - leftAnimations: toAnimation({ animations: leftAnimations }), - rightAnimations: toAnimation({ animations: rightAnimations }), - }; -} - -export function removeElementKeyframe({ - animations, - propertyPath, - keyframeId, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - keyframeId: string; -}): ElementAnimations | undefined { - const binding = getBinding({ animations, propertyPath }); - if (!binding) { - return animations; - } - - const nextAnimations = cloneAnimationsState({ animations }); - for (const component of binding.components) { - nextAnimations.channels[component.channelId] = removeKeyframe({ - channel: nextAnimations.channels[component.channelId], - keyframeId, - }); - } - const hasRemainingKeys = binding.components.some((component) => - hasChannelKeys({ - channel: nextAnimations.channels[component.channelId], - }), - ); - if (!hasRemainingKeys) { - delete nextAnimations.bindings[propertyPath]; - for (const component of binding.components) { - delete nextAnimations.channels[component.channelId]; - } - } - return toAnimation({ - animations: nextAnimations, - }); -} - -export function retimeElementKeyframe({ - animations, - propertyPath, - keyframeId, - time, -}: { - animations: ElementAnimations | undefined; - propertyPath: AnimationPath; - keyframeId: string; - time: MediaTime; -}): ElementAnimations | undefined { - const binding = getBinding({ animations, propertyPath }); - if (!binding) { - return animations; - } - - const nextAnimations = cloneAnimationsState({ animations }); - for (const component of binding.components) { - nextAnimations.channels[component.channelId] = retimeKeyframe({ - channel: nextAnimations.channels[component.channelId], - keyframeId, - time, - }); - } - return toAnimation({ - animations: nextAnimations, - }); -} diff --git a/apps/web/src/animation/path.ts b/apps/web/src/animation/path.ts deleted file mode 100644 index 69e5e228..00000000 --- a/apps/web/src/animation/path.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { AnimationPath, AnimationPropertyPath } from "@/animation/types"; -import { ANIMATION_PROPERTY_PATHS } from "./types"; -import { isEffectParamPath } from "./effect-param-channel"; -import { isGraphicParamPath } from "./graphic-param-channel"; - -const ANIMATION_PROPERTY_PATH_SET = new Set(ANIMATION_PROPERTY_PATHS); - -export function isAnimationPropertyPath( - propertyPath: string, -): propertyPath is AnimationPropertyPath { - return ANIMATION_PROPERTY_PATH_SET.has(propertyPath); -} - -export function isAnimationPath( - propertyPath: string, -): propertyPath is AnimationPath { - return ( - isAnimationPropertyPath(propertyPath) || - isGraphicParamPath(propertyPath) || - isEffectParamPath(propertyPath) - ); -} diff --git a/apps/web/src/animation/property-groups.ts b/apps/web/src/animation/property-groups.ts deleted file mode 100644 index 7b71af15..00000000 --- a/apps/web/src/animation/property-groups.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { - AnimationPropertyGroup, - AnimationPropertyPath, - ElementAnimations, -} from "@/animation/types"; -import { ANIMATION_PROPERTY_GROUPS } from "@/animation/types"; -import { getKeyframeAtTime } from "./keyframe-query"; - -export interface GroupKeyframeRef { - propertyPath: AnimationPropertyPath; - keyframeId: string; -} - -export function getGroupKeyframesAtTime({ - animations, - group, - time, -}: { - animations: ElementAnimations | undefined; - group: AnimationPropertyGroup; - time: number; -}): GroupKeyframeRef[] { - return ANIMATION_PROPERTY_GROUPS[group].flatMap((propertyPath) => { - const keyframe = getKeyframeAtTime({ animations, propertyPath, time }); - return keyframe ? [{ propertyPath, keyframeId: keyframe.id }] : []; - }); -} - -export function hasGroupKeyframeAtTime({ - animations, - group, - time, -}: { - animations: ElementAnimations | undefined; - group: AnimationPropertyGroup; - time: number; -}): boolean { - return getGroupKeyframesAtTime({ animations, group, time }).length > 0; -} diff --git a/apps/web/src/animation/property-registry.ts b/apps/web/src/animation/property-registry.ts deleted file mode 100644 index aacb9972..00000000 --- a/apps/web/src/animation/property-registry.ts +++ /dev/null @@ -1,390 +0,0 @@ -import type { - AnimationBindingKind, - AnimationInterpolation, - AnimationPropertyPath, - AnimationValue, -} from "@/animation/types"; -import { parseColorToLinearRgba } from "./binding-values"; -import type { TimelineElement } from "@/timeline"; -import { MIN_TRANSFORM_SCALE } from "@/animation/transform"; -import { - CORNER_RADIUS_MAX, - CORNER_RADIUS_MIN, -} from "@/text/background"; -import { - canElementHaveAudio, - isVisualElement, -} from "@/timeline/element-utils"; -import { VOLUME_DB_MAX, VOLUME_DB_MIN } from "@/timeline/audio-constants"; -import { DEFAULTS } from "@/timeline/defaults"; -import { snapToStep } from "@/utils/math"; - -export interface NumericSpec { - min?: number; - max?: number; - step?: number; -} - -export interface AnimationPropertyDefinition { - kind: AnimationBindingKind; - defaultInterpolation: AnimationInterpolation; - numericRanges?: Partial>; - supportsElement: ({ element }: { element: TimelineElement }) => boolean; - getValue: ({ element }: { element: TimelineElement }) => AnimationValue | null; - coerceValue: ({ value }: { value: AnimationValue }) => AnimationValue | null; - setValue: ({ - element, - value, - }: { - element: TimelineElement; - value: AnimationValue; - }) => TimelineElement; -} - -function applyNumericSpec({ - value, - numericRange, -}: { - value: number; - numericRange: NumericSpec | undefined; -}): number { - if (!numericRange) { - return value; - } - - const steppedValue = - numericRange.step != null - ? snapToStep({ value, step: numericRange.step }) - : value; - const minValue = numericRange.min ?? Number.NEGATIVE_INFINITY; - const maxValue = numericRange.max ?? Number.POSITIVE_INFINITY; - return Math.min(maxValue, Math.max(minValue, steppedValue)); -} - -function coerceNumberValue({ - value, - numericRange, -}: { - value: AnimationValue; - numericRange?: NumericSpec; -}): number | null { - if (typeof value !== "number" || Number.isNaN(value)) { - return null; - } - - return applyNumericSpec({ value, numericRange }); -} - -function coerceColorValue({ - value, -}: { - value: AnimationValue; -}): string | null { - return typeof value === "string" && parseColorToLinearRgba({ color: value }) - ? value - : null; -} - -function createNumberPropertyDefinition({ - numericRange, - supportsElement, - getValue, - setValue, -}: { - numericRange?: NumericSpec; - supportsElement: AnimationPropertyDefinition["supportsElement"]; - getValue: AnimationPropertyDefinition["getValue"]; - setValue: AnimationPropertyDefinition["setValue"]; -}): AnimationPropertyDefinition { - return { - kind: "number", - defaultInterpolation: "linear", - numericRanges: numericRange ? { value: numericRange } : undefined, - supportsElement, - getValue, - coerceValue: ({ value }) => - coerceNumberValue({ - value, - numericRange, - }), - setValue, - }; -} - -const ANIMATION_PROPERTY_REGISTRY: Record< - AnimationPropertyPath, - AnimationPropertyDefinition -> = { - "transform.positionX": createNumberPropertyDefinition({ - numericRange: { step: 1 }, - supportsElement: ({ element }) => isVisualElement(element), - getValue: ({ element }) => - isVisualElement(element) ? element.transform.position.x : null, - setValue: ({ element, value }) => - isVisualElement(element) - ? { - ...element, - transform: { - ...element.transform, - position: { ...element.transform.position, x: value as number }, - }, - } - : element, - }), - "transform.positionY": createNumberPropertyDefinition({ - numericRange: { step: 1 }, - supportsElement: ({ element }) => isVisualElement(element), - getValue: ({ element }) => - isVisualElement(element) ? element.transform.position.y : null, - setValue: ({ element, value }) => - isVisualElement(element) - ? { - ...element, - transform: { - ...element.transform, - position: { ...element.transform.position, y: value as number }, - }, - } - : element, - }), - "transform.scaleX": createNumberPropertyDefinition({ - numericRange: { min: MIN_TRANSFORM_SCALE, step: 0.01 }, - supportsElement: ({ element }) => isVisualElement(element), - getValue: ({ element }) => - isVisualElement(element) ? element.transform.scaleX : null, - setValue: ({ element, value }) => - isVisualElement(element) - ? { - ...element, - transform: { ...element.transform, scaleX: value as number }, - } - : element, - }), - "transform.scaleY": createNumberPropertyDefinition({ - numericRange: { min: MIN_TRANSFORM_SCALE, step: 0.01 }, - supportsElement: ({ element }) => isVisualElement(element), - getValue: ({ element }) => - isVisualElement(element) ? element.transform.scaleY : null, - setValue: ({ element, value }) => - isVisualElement(element) - ? { - ...element, - transform: { ...element.transform, scaleY: value as number }, - } - : element, - }), - "transform.rotate": createNumberPropertyDefinition({ - numericRange: { min: -360, max: 360, step: 1 }, - supportsElement: ({ element }) => isVisualElement(element), - getValue: ({ element }) => - isVisualElement(element) ? element.transform.rotate : null, - setValue: ({ element, value }) => - isVisualElement(element) - ? { - ...element, - transform: { ...element.transform, rotate: value as number }, - } - : element, - }), - opacity: createNumberPropertyDefinition({ - numericRange: { min: 0, max: 1, step: 0.01 }, - supportsElement: ({ element }) => isVisualElement(element), - getValue: ({ element }) => - isVisualElement(element) ? element.opacity : null, - setValue: ({ element, value }) => - isVisualElement(element) - ? { ...element, opacity: value as number } - : element, - }), - volume: createNumberPropertyDefinition({ - numericRange: { min: VOLUME_DB_MIN, max: VOLUME_DB_MAX, step: 0.01 }, - supportsElement: ({ element }) => canElementHaveAudio(element), - getValue: ({ element }) => - canElementHaveAudio(element) ? element.volume ?? 0 : null, - setValue: ({ element, value }) => - canElementHaveAudio(element) - ? { ...element, volume: value as number } - : element, - }), - color: { - kind: "color", - defaultInterpolation: "linear", - supportsElement: ({ element }) => element.type === "text", - getValue: ({ element }) => (element.type === "text" ? element.color : null), - coerceValue: ({ value }) => coerceColorValue({ value }), - setValue: ({ element, value }) => - element.type === "text" - ? { ...element, color: value as string } - : element, - }, - "background.color": { - kind: "color", - defaultInterpolation: "linear", - supportsElement: ({ element }) => element.type === "text", - getValue: ({ element }) => - element.type === "text" ? element.background.color : null, - coerceValue: ({ value }) => coerceColorValue({ value }), - setValue: ({ element, value }) => - element.type === "text" - ? { - ...element, - background: { ...element.background, color: value as string }, - } - : element, - }, - "background.paddingX": createNumberPropertyDefinition({ - numericRange: { min: 0, step: 1 }, - supportsElement: ({ element }) => element.type === "text", - getValue: ({ element }) => - element.type === "text" - ? (element.background.paddingX ?? DEFAULTS.text.background.paddingX) - : null, - setValue: ({ element, value }) => - element.type === "text" - ? { - ...element, - background: { ...element.background, paddingX: value as number }, - } - : element, - }), - "background.paddingY": createNumberPropertyDefinition({ - numericRange: { min: 0, step: 1 }, - supportsElement: ({ element }) => element.type === "text", - getValue: ({ element }) => - element.type === "text" - ? (element.background.paddingY ?? DEFAULTS.text.background.paddingY) - : null, - setValue: ({ element, value }) => - element.type === "text" - ? { - ...element, - background: { ...element.background, paddingY: value as number }, - } - : element, - }), - "background.offsetX": createNumberPropertyDefinition({ - numericRange: { step: 1 }, - supportsElement: ({ element }) => element.type === "text", - getValue: ({ element }) => - element.type === "text" - ? (element.background.offsetX ?? DEFAULTS.text.background.offsetX) - : null, - setValue: ({ element, value }) => - element.type === "text" - ? { - ...element, - background: { ...element.background, offsetX: value as number }, - } - : element, - }), - "background.offsetY": createNumberPropertyDefinition({ - numericRange: { step: 1 }, - supportsElement: ({ element }) => element.type === "text", - getValue: ({ element }) => - element.type === "text" - ? (element.background.offsetY ?? DEFAULTS.text.background.offsetY) - : null, - setValue: ({ element, value }) => - element.type === "text" - ? { - ...element, - background: { ...element.background, offsetY: value as number }, - } - : element, - }), - "background.cornerRadius": createNumberPropertyDefinition({ - numericRange: { - min: CORNER_RADIUS_MIN, - max: CORNER_RADIUS_MAX, - step: 1, - }, - supportsElement: ({ element }) => element.type === "text", - getValue: ({ element }) => - element.type === "text" - ? (element.background.cornerRadius ?? CORNER_RADIUS_MIN) - : null, - setValue: ({ element, value }) => - element.type === "text" - ? { - ...element, - background: { ...element.background, cornerRadius: value as number }, - } - : element, - }), -}; - -export function isAnimationPropertyPath( - propertyPath: string, -): propertyPath is AnimationPropertyPath { - return Object.hasOwn(ANIMATION_PROPERTY_REGISTRY, propertyPath); -} - -export function getAnimationPropertyDefinition({ - propertyPath, -}: { - propertyPath: AnimationPropertyPath; -}): AnimationPropertyDefinition { - return ANIMATION_PROPERTY_REGISTRY[propertyPath]; -} - -export function supportsAnimationProperty({ - element, - propertyPath, -}: { - element: TimelineElement; - propertyPath: AnimationPropertyPath; -}): boolean { - const propertyDefinition = getAnimationPropertyDefinition({ propertyPath }); - return propertyDefinition.supportsElement({ element }); -} - -export function getElementBaseValueForProperty({ - element, - propertyPath, -}: { - element: TimelineElement; - propertyPath: AnimationPropertyPath; -}): AnimationValue | null { - const definition = getAnimationPropertyDefinition({ propertyPath }); - if (!definition.supportsElement({ element })) { - return null; - } - return definition.getValue({ element }); -} - -export function withElementBaseValueForProperty({ - element, - propertyPath, - value, -}: { - element: TimelineElement; - propertyPath: AnimationPropertyPath; - value: AnimationValue; -}): TimelineElement { - const definition = getAnimationPropertyDefinition({ propertyPath }); - const coercedValue = definition.coerceValue({ value }); - if (coercedValue === null || !definition.supportsElement({ element })) { - return element; - } - return definition.setValue({ element, value: coercedValue }); -} - -export function getDefaultInterpolationForProperty({ - propertyPath, -}: { - propertyPath: AnimationPropertyPath; -}): AnimationInterpolation { - const propertyDefinition = getAnimationPropertyDefinition({ propertyPath }); - return propertyDefinition.defaultInterpolation; -} - -export function coerceAnimationValueForProperty({ - propertyPath, - value, -}: { - propertyPath: AnimationPropertyPath; - value: AnimationValue; -}): AnimationValue | null { - const propertyDefinition = getAnimationPropertyDefinition({ propertyPath }); - return propertyDefinition.coerceValue({ value }); -} diff --git a/apps/web/src/animation/resolve.ts b/apps/web/src/animation/resolve.ts deleted file mode 100644 index 19685cea..00000000 --- a/apps/web/src/animation/resolve.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { - AnimationPath, - AnimationValueForPath, - ElementAnimations, -} from "@/animation/types"; -import { - type AnimationComponentValue, - composeAnimationValue, - decomposeAnimationValue, -} from "./binding-values"; -import { - getChannelValueAtTime, -} from "./interpolation"; - -export function getElementLocalTime({ - timelineTime, - elementStartTime, - elementDuration, -}: { - timelineTime: number; - elementStartTime: number; - elementDuration: number; -}): number { - const localTime = timelineTime - elementStartTime; - if (localTime <= 0) { - return 0; - } - - if (localTime >= elementDuration) { - return elementDuration; - } - - return localTime; -} - -export function resolveAnimationPathValueAtTime({ - animations, - propertyPath, - localTime, - fallbackValue, -}: { - animations: ElementAnimations | undefined; - propertyPath: TPath; - localTime: number; - fallbackValue: AnimationValueForPath; -}): AnimationValueForPath { - const binding = animations?.bindings[propertyPath]; - if (!binding) { - return fallbackValue; - } - - const fallbackComponents = decomposeAnimationValue({ - kind: binding.kind, - value: fallbackValue, - }); - if (!fallbackComponents) { - return fallbackValue; - } - - const componentValues = Object.fromEntries( - binding.components.map((component) => { - const channel = animations?.channels[component.channelId]; - return [ - component.key, - getChannelValueAtTime({ - channel, - time: localTime, - fallbackValue: - fallbackComponents[component.key] ?? - (channel?.kind === "discrete" ? false : 0), - }), - ]; - }), - ) as Record; - return (composeAnimationValue({ - binding, - componentValues, - }) ?? fallbackValue) as AnimationValueForPath; -} diff --git a/apps/web/src/animation/transform.ts b/apps/web/src/animation/transform.ts deleted file mode 100644 index ab932ea2..00000000 --- a/apps/web/src/animation/transform.ts +++ /dev/null @@ -1 +0,0 @@ -export const MIN_TRANSFORM_SCALE = 0.01; diff --git a/apps/web/src/animation/types.ts b/apps/web/src/animation/types.ts deleted file mode 100644 index cfecfada..00000000 --- a/apps/web/src/animation/types.ts +++ /dev/null @@ -1,229 +0,0 @@ -import type { ParamValues } from "@/params"; -import type { MediaTime } from "@/wasm"; - -export const ANIMATION_PROPERTY_PATHS = [ - "transform.positionX", - "transform.positionY", - "transform.scaleX", - "transform.scaleY", - "transform.rotate", - "opacity", - "volume", - "color", - "background.color", - "background.paddingX", - "background.paddingY", - "background.offsetX", - "background.offsetY", - "background.cornerRadius", -] as const; - -export type AnimationPropertyPath = (typeof ANIMATION_PROPERTY_PATHS)[number]; -export type GraphicParamPath = `params.${string}`; -export type EffectParamPath = `effects.${string}.params.${string}`; -export type AnimationPath = - | AnimationPropertyPath - | GraphicParamPath - | EffectParamPath; - -export const ANIMATION_PROPERTY_GROUPS = { - "transform.scale": ["transform.scaleX", "transform.scaleY"], -} as const satisfies Record>; - -export type AnimationPropertyGroup = keyof typeof ANIMATION_PROPERTY_GROUPS; - -export type VectorValue = { x: number; y: number }; -export type DiscreteValue = boolean | string; -export type AnimationValue = number | string | boolean | VectorValue; -export interface AnimationPropertyValueMap { - "transform.positionX": number; - "transform.positionY": number; - "transform.scaleX": number; - "transform.scaleY": number; - "transform.rotate": number; - opacity: number; - volume: number; - color: string; - "background.color": string; - "background.paddingX": number; - "background.paddingY": number; - "background.offsetX": number; - "background.offsetY": number; - "background.cornerRadius": number; -} -export type DynamicAnimationPathValue = number | string | boolean; - -export interface NumericSpec { - min?: number; - max?: number; - step?: number; -} -export type AnimationValueForPath = - TPath extends AnimationPropertyPath - ? AnimationPropertyValueMap[TPath] - : TPath extends GraphicParamPath | EffectParamPath - ? DynamicAnimationPathValue - : never; -export type AnimationNumericPropertyPath = { - [K in AnimationPropertyPath]: AnimationValueForPath extends number ? K : never; -}[AnimationPropertyPath]; -export type AnimationColorPropertyPath = { - [K in AnimationPropertyPath]: AnimationValueForPath extends string ? K : never; -}[AnimationPropertyPath]; - -export type ContinuousKeyframeInterpolation = "linear" | "hold" | "bezier"; -export type DiscreteKeyframeInterpolation = "hold"; -export type AnimationInterpolation = - | ContinuousKeyframeInterpolation - | DiscreteKeyframeInterpolation; - -export type PrimitiveAnimationChannelKind = "scalar" | "discrete"; -export type AnimationBindingKind = "number" | "vector2" | "color" | "discrete"; -export type ScalarSegmentType = "step" | "linear" | "bezier"; -export type TangentMode = "auto" | "aligned" | "broken" | "flat"; -export type ChannelExtrapolationMode = "hold" | "linear"; - -export interface CurveHandle { - dt: MediaTime; - dv: number; -} - -interface BaseAnimationKeyframe { - id: string; - time: MediaTime; // relative to element start time - value: TValue; -} - -export interface ScalarAnimationKey extends BaseAnimationKeyframe { - leftHandle?: CurveHandle; - rightHandle?: CurveHandle; - segmentToNext: ScalarSegmentType; - tangentMode: TangentMode; -} - -export interface DiscreteAnimationKey - extends BaseAnimationKeyframe {} - -export type AnimationKeyframe = ScalarAnimationKey | DiscreteAnimationKey; - -export interface ScalarAnimationChannel { - kind: "scalar"; - keys: ScalarAnimationKey[]; - extrapolation?: { - before: ChannelExtrapolationMode; - after: ChannelExtrapolationMode; - }; -} - -export interface DiscreteAnimationChannel { - kind: "discrete"; - keys: DiscreteAnimationKey[]; -} - -export type AnimationChannel = - | ScalarAnimationChannel - | DiscreteAnimationChannel; - -export type ElementAnimationChannelMap = Record< - string, - AnimationChannel | undefined ->; - -export interface AnimationBindingComponent { - key: TKey; - channelId: string; -} - -interface BaseAnimationBinding< - TKind extends AnimationBindingKind, - TComponentKey extends string, -> { - path: AnimationPath; - kind: TKind; - components: AnimationBindingComponent[]; -} - -export interface NumberAnimationBinding - extends BaseAnimationBinding<"number", "value"> {} - -export interface Vector2AnimationBinding - extends BaseAnimationBinding<"vector2", "x" | "y"> {} - -export interface ColorAnimationBinding - extends BaseAnimationBinding<"color", "r" | "g" | "b" | "a"> { - colorSpace: "srgb-linear"; -} - -export interface DiscreteAnimationBinding - extends BaseAnimationBinding<"discrete", "value"> {} - -export type AnimationBindingInstance = - | NumberAnimationBinding - | Vector2AnimationBinding - | ColorAnimationBinding - | DiscreteAnimationBinding; - -export interface AnimationBindingByKind { - number: NumberAnimationBinding; - vector2: Vector2AnimationBinding; - color: ColorAnimationBinding; - discrete: DiscreteAnimationBinding; -} - -export type AnimationBindingOfKind = - AnimationBindingByKind[TKind]; - -export type ElementAnimationBindingMap = Record< - string, - AnimationBindingInstance | undefined ->; - -export interface ElementAnimations { - bindings: ElementAnimationBindingMap; - channels: ElementAnimationChannelMap; -} - -export type NormalizedCubicBezier = [number, number, number, number]; - -export interface ScalarGraphChannelTarget { - propertyPath: AnimationPath; - componentKey: string; - channelId: string; -} - -export interface ScalarGraphChannel extends ScalarGraphChannelTarget { - channel: ScalarAnimationChannel; -} - -export interface ScalarGraphKeyframeRef extends ScalarGraphChannelTarget { - keyframeId: string; -} - -export interface ScalarGraphKeyframeContext extends ScalarGraphChannel { - keyframe: ScalarAnimationKey; - keyframeIndex: number; - previousKey: ScalarAnimationKey | null; - nextKey: ScalarAnimationKey | null; -} - -export interface ScalarCurveKeyframePatch { - leftHandle?: CurveHandle | null; - rightHandle?: CurveHandle | null; - segmentToNext?: ScalarSegmentType; - tangentMode?: TangentMode; -} - -export interface ElementKeyframe { - propertyPath: AnimationPath; - id: string; - time: MediaTime; - value: AnimationValue; - interpolation: AnimationInterpolation; -} - -export interface SelectedKeyframeRef { - trackId: string; - elementId: string; - propertyPath: AnimationPath; - keyframeId: string; -} diff --git a/apps/web/src/animation/values.ts b/apps/web/src/animation/values.ts deleted file mode 100644 index 7733ec4c..00000000 --- a/apps/web/src/animation/values.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { - AnimationColorPropertyPath, - AnimationNumericPropertyPath, - ElementAnimations, -} from "./types"; -import { resolveAnimationPathValueAtTime } from "./resolve"; - -export function resolveOpacityAtTime({ - baseOpacity, - animations, - localTime, -}: { - baseOpacity: number; - animations: ElementAnimations | undefined; - localTime: number; -}): number { - return resolveAnimationPathValueAtTime({ - animations, - propertyPath: "opacity", - localTime: Math.max(0, localTime), - fallbackValue: baseOpacity, - }); -} - -export function resolveNumberAtTime({ - baseValue, - animations, - propertyPath, - localTime, -}: { - baseValue: number; - animations: ElementAnimations | undefined; - propertyPath: AnimationNumericPropertyPath; - localTime: number; -}): number { - return resolveAnimationPathValueAtTime({ - animations, - propertyPath, - localTime: Math.max(0, localTime), - fallbackValue: baseValue, - }); -} - -export function resolveColorAtTime({ - baseColor, - animations, - propertyPath, - localTime, -}: { - baseColor: string; - animations: ElementAnimations | undefined; - propertyPath: AnimationColorPropertyPath; - localTime: number; -}): string { - return resolveAnimationPathValueAtTime({ - animations, - propertyPath, - localTime: Math.max(0, localTime), - fallbackValue: baseColor, - }); -} diff --git a/apps/web/src/app/api/auth/[...all]/route.ts b/apps/web/src/app/api/auth/[...all]/route.ts deleted file mode 100644 index edf0d0c2..00000000 --- a/apps/web/src/app/api/auth/[...all]/route.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { auth } from "@/auth/server"; -import { toNextJsHandler } from "better-auth/next-js"; - -export const { POST, GET } = toNextJsHandler(auth); diff --git a/apps/web/src/app/api/feedback/route.ts b/apps/web/src/app/api/feedback/route.ts deleted file mode 100644 index cd853eea..00000000 --- a/apps/web/src/app/api/feedback/route.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { type NextRequest, NextResponse } from "next/server"; -import { z } from "zod"; -import { checkRateLimit } from "@/auth/rate-limit"; -import { submitFeedback, MAX_MESSAGE_LENGTH } from "@/feedback"; - -const submitSchema = z.object({ - message: z - .string() - .min(1, "Message is required") - .max(MAX_MESSAGE_LENGTH, "Message too long"), -}); - -export async function POST(request: NextRequest) { - const { limited } = await checkRateLimit({ request }); - if (limited) { - return NextResponse.json({ error: "Too many requests" }, { status: 429 }); - } - - const body = await request.json(); - const result = submitSchema.safeParse(body); - - if (!result.success) { - return NextResponse.json( - { error: "Invalid input", details: result.error.flatten().fieldErrors }, - { status: 400 }, - ); - } - - const entry = await submitFeedback(result.data); - return NextResponse.json({ entry }, { status: 201 }); -} diff --git a/apps/web/src/app/api/health/route.ts b/apps/web/src/app/api/health/route.ts deleted file mode 100644 index dbe6fdb1..00000000 --- a/apps/web/src/app/api/health/route.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function GET() { - return new Response("OK", { status: 200 }); -} diff --git a/apps/web/src/app/api/sounds/search/route.ts b/apps/web/src/app/api/sounds/search/route.ts deleted file mode 100644 index aa7a1b60..00000000 --- a/apps/web/src/app/api/sounds/search/route.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { webEnv } from "@/env/web"; -import { type NextRequest, NextResponse } from "next/server"; -import { z } from "zod"; -import { checkRateLimit } from "@/auth/rate-limit"; - -const searchParamsSchema = z.object({ - q: z.string().max(500, "Query too long").optional(), - type: z.enum(["songs", "effects"]).optional(), - page: z.coerce.number().int().min(1).max(1000).default(1), - page_size: z.coerce.number().int().min(1).max(150).default(20), - sort: z - .enum(["downloads", "rating", "created", "score"]) - .default("downloads"), - min_rating: z.coerce.number().min(0).max(5).default(3), - commercial_only: z.coerce.boolean().default(true), -}); - -const freesoundResultSchema = z.object({ - id: z.number(), - name: z.string(), - description: z.string(), - url: z.string().url(), - previews: z - .object({ - "preview-hq-mp3": z.string().url(), - "preview-lq-mp3": z.string().url(), - "preview-hq-ogg": z.string().url(), - "preview-lq-ogg": z.string().url(), - }) - .optional(), - download: z.string().url().optional(), - duration: z.number(), - filesize: z.number(), - type: z.string(), - channels: z.number(), - bitrate: z.number(), - bitdepth: z.number(), - samplerate: z.number(), - username: z.string(), - tags: z.array(z.string()), - license: z.string(), - created: z.string(), - num_downloads: z.number().optional(), - avg_rating: z.number().optional(), - num_ratings: z.number().optional(), -}); - -const freesoundResponseSchema = z.object({ - count: z.number(), - next: z.string().url().nullable(), - previous: z.string().url().nullable(), - results: z.array(freesoundResultSchema), -}); - -const transformedResultSchema = z.object({ - id: z.number(), - name: z.string(), - description: z.string(), - url: z.string(), - previewUrl: z.string().optional(), - downloadUrl: z.string().optional(), - duration: z.number(), - filesize: z.number(), - type: z.string(), - channels: z.number(), - bitrate: z.number(), - bitdepth: z.number(), - samplerate: z.number(), - username: z.string(), - tags: z.array(z.string()), - license: z.string(), - created: z.string(), - downloads: z.number().optional(), - rating: z.number().optional(), - ratingCount: z.number().optional(), -}); - -const apiResponseSchema = z.object({ - count: z.number(), - next: z.string().nullable(), - previous: z.string().nullable(), - results: z.array(transformedResultSchema), - query: z.string().optional(), - type: z.string(), - page: z.number(), - pageSize: z.number(), - sort: z.string(), - minRating: z.number().optional(), -}); - -function buildSortParameter({ query, sort }: { query?: string; sort: string }) { - if (!query) return `${sort}_desc`; - return sort === "score" ? "score" : `${sort}_desc`; -} - -function applyEffectsFilters({ - params, - min_rating, - commercial_only, -}: { - params: URLSearchParams; - min_rating: number; - commercial_only: boolean; -}) { - params.append("filter", "duration:[* TO 30.0]"); - params.append("filter", `avg_rating:[${min_rating} TO *]`); - - if (commercial_only) { - params.append( - "filter", - 'license:("Attribution" OR "Creative Commons 0" OR "Attribution Noncommercial" OR "Attribution Commercial")', - ); - } - - params.append( - "filter", - "tag:sound-effect OR tag:sfx OR tag:foley OR tag:ambient OR tag:nature OR tag:mechanical OR tag:electronic OR tag:impact OR tag:whoosh OR tag:explosion", - ); -} - -function transformFreesoundResult( - result: z.infer, -) { - return { - id: result.id, - name: result.name, - description: result.description, - url: result.url, - previewUrl: - result.previews?.["preview-hq-mp3"] || - result.previews?.["preview-lq-mp3"], - downloadUrl: result.download, - duration: result.duration, - filesize: result.filesize, - type: result.type, - channels: result.channels, - bitrate: result.bitrate, - bitdepth: result.bitdepth, - samplerate: result.samplerate, - username: result.username, - tags: result.tags, - license: result.license, - created: result.created, - downloads: result.num_downloads || 0, - rating: result.avg_rating || 0, - ratingCount: result.num_ratings || 0, - }; -} - -export async function GET(request: NextRequest) { - try { - const { limited } = await checkRateLimit({ request }); - if (limited) { - return NextResponse.json({ error: "Too many requests" }, { status: 429 }); - } - - const { searchParams } = new URL(request.url); - - const validationResult = searchParamsSchema.safeParse({ - q: searchParams.get("q") || undefined, - type: searchParams.get("type") || undefined, - page: searchParams.get("page") || undefined, - page_size: searchParams.get("page_size") || undefined, - sort: searchParams.get("sort") || undefined, - min_rating: searchParams.get("min_rating") || undefined, - }); - - if (!validationResult.success) { - return NextResponse.json( - { - error: "Invalid parameters", - details: validationResult.error.flatten().fieldErrors, - }, - { status: 400 }, - ); - } - - const { - q: query, - type, - page, - page_size: pageSize, - sort, - min_rating, - commercial_only, - } = validationResult.data; - - if (type === "songs") { - return NextResponse.json( - { - error: "Songs are not available yet", - message: - "Song search functionality is coming soon. Try searching for sound effects instead.", - }, - { status: 501 }, - ); - } - - const baseUrl = "https://freesound.org/apiv2/search/text/"; - - const sortParam = buildSortParameter({ query, sort }); - - const params = new URLSearchParams({ - query: query || "", - token: webEnv.FREESOUND_API_KEY, - page: page.toString(), - page_size: pageSize.toString(), - sort: sortParam, - fields: - "id,name,description,url,previews,download,duration,filesize,type,channels,bitrate,bitdepth,samplerate,username,tags,license,created,num_downloads,avg_rating,num_ratings", - }); - - const isEffectsSearch = type === "effects" || !type; - if (isEffectsSearch) { - applyEffectsFilters({ params, min_rating, commercial_only }); - } - - const response = await fetch(`${baseUrl}?${params.toString()}`); - - if (!response.ok) { - const errorText = await response.text(); - console.error("Freesound API error:", response.status, errorText); - return NextResponse.json( - { error: "Failed to search sounds" }, - { status: response.status }, - ); - } - - const rawData = await response.json(); - - const freesoundValidation = freesoundResponseSchema.safeParse(rawData); - if (!freesoundValidation.success) { - console.error( - "Invalid Freesound API response:", - freesoundValidation.error, - ); - return NextResponse.json( - { error: "Invalid response from Freesound API" }, - { status: 502 }, - ); - } - - const data = freesoundValidation.data; - - const transformedResults = data.results.map(transformFreesoundResult); - - const responseData = { - count: data.count, - next: data.next, - previous: data.previous, - results: transformedResults, - query: query || "", - type: type || "effects", - page, - pageSize, - sort, - minRating: min_rating, - }; - - const responseValidation = apiResponseSchema.safeParse(responseData); - if (!responseValidation.success) { - console.error( - "Invalid API response structure:", - responseValidation.error, - ); - return NextResponse.json( - { error: "Internal response formatting error" }, - { status: 500 }, - ); - } - - return NextResponse.json(responseValidation.data); - } catch (error) { - console.error("Error searching sounds:", error); - return NextResponse.json( - { error: "Internal server error" }, - { status: 500 }, - ); - } -} diff --git a/apps/web/src/app/base-page.tsx b/apps/web/src/app/base-page.tsx deleted file mode 100644 index 78768581..00000000 --- a/apps/web/src/app/base-page.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { Header } from "@/components/header"; -import { Footer } from "@/components/footer"; -import { cn } from "@/utils/ui"; - -interface BasePageProps { - children: React.ReactNode; - className?: string; - mainClassName?: string; - maxWidth?: "3xl" | "6xl" | "full"; - title?: string; - description?: React.ReactNode; - action?: React.ReactNode; -} - -export function BasePage({ - children, - className = "", - mainClassName = "", - maxWidth = "3xl", - title, - description, - action, -}: BasePageProps) { - const maxWidthClass = { - "3xl": "max-w-3xl", - "6xl": "max-w-6xl", - full: "max-w-full", - }[maxWidth]; - - return ( -
-
-
- {title && description && ( -
-

- {title} -

-

- {description} -

- {action} -
- )} - {children} -
-
-
- ); -} diff --git a/apps/web/src/app/blog/[slug]/page.tsx b/apps/web/src/app/blog/[slug]/page.tsx deleted file mode 100644 index dba9b504..00000000 --- a/apps/web/src/app/blog/[slug]/page.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import type { Metadata } from "next"; -import Image from "next/image"; -import { notFound } from "next/navigation"; -import { BasePage } from "@/app/base-page"; -import Prose from "@/components/ui/prose"; -import { Separator } from "@/components/ui/separator"; -import { getPosts, getSinglePost, processHtmlContent } from "@/blog/query"; -import type { Author, Post } from "@/blog/types"; - -type PageProps = { - params: Promise<{ slug: string }>; - searchParams: Promise<{ [key: string]: string | string[] | undefined }>; -}; - -export async function generateMetadata({ - params, -}: PageProps): Promise { - const slug = (await params).slug; - - const data = await getSinglePost({ slug }); - - if (!data || !data.post) return {}; - - return { - title: data.post.title, - description: data.post.description, - twitter: { - title: `${data.post.title}`, - description: `${data.post.description}`, - card: "summary_large_image", - images: [ - { - url: data.post.coverImage, - width: "1200", - height: "630", - alt: data.post.title, - }, - ], - }, - openGraph: { - type: "article", - images: [ - { - url: data.post.coverImage, - width: "1200", - height: "630", - alt: data.post.title, - }, - ], - title: data.post.title, - description: data.post.description, - publishedTime: new Date(data.post.publishedAt).toISOString(), - authors: data.post.authors.map((author: Author) => author.name), - }, - }; -} - -export async function generateStaticParams() { - const data = await getPosts(); - if (!data || !data.posts.length) return []; - - return data.posts.map((post) => ({ - slug: post.slug, - })); -} - -export default async function BlogPostPage({ params }: PageProps) { - const slug = (await params).slug; - const data = await getSinglePost({ slug }); - if (!data || !data.post) return notFound(); - - const html = await processHtmlContent({ html: data.post.content }); - - return ( - - - - - - ); -} - -function PostHeader({ post }: { post: Post }) { - const formattedDate = new Date(post.publishedAt).toLocaleDateString("en-US", { - day: "numeric", - month: "long", - year: "numeric", - }); - - return ( -
- - - {post.coverImage && } -
- ); -} - -function PostCoverImage({ post }: { post: Post }) { - return ( -
- {post.title} -
- ); -} - -function PostMeta({ date, publishedAt }: { date: string; publishedAt: Date }) { - return ( -
- -
- ); -} - -function PostTitle({ title }: { title: string }) { - return ( -

- {title} -

- ); -} - -function PostContent({ html }: { html: string }) { - return ( -
- -
- ); -} diff --git a/apps/web/src/app/blog/page.tsx b/apps/web/src/app/blog/page.tsx deleted file mode 100644 index b40bc2fc..00000000 --- a/apps/web/src/app/blog/page.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { BasePage } from "@/app/base-page"; -import { Separator } from "@/components/ui/separator"; -import { getPosts } from "@/blog/query"; -import type { Post } from "@/blog/types"; - -export const metadata: Metadata = { - title: "Blog - OpenCut", - description: - "Read the latest news and updates about OpenCut, the free and open-source video editor.", - openGraph: { - title: "Blog - OpenCut", - description: - "Read the latest news and updates about OpenCut, the free and open-source video editor.", - type: "website", - }, -}; - -export default async function BlogPage() { - const data = await getPosts().catch(() => null); - if (!data || !data.posts) return
No posts yet
; - - return ( - -
- {data.posts.map((post) => ( -
- - -
- ))} -
-
- ); -} - -function BlogPostItem({ post }: { post: Post }) { - return ( - -
-
-

{post.title}

-

{post.description}

-
-
- - ); -} diff --git a/apps/web/src/app/brand/page.tsx b/apps/web/src/app/brand/page.tsx deleted file mode 100644 index 94e3f3e1..00000000 --- a/apps/web/src/app/brand/page.tsx +++ /dev/null @@ -1,268 +0,0 @@ -"use client"; - -import type { CSSProperties } from "react"; -import Image from "next/image"; -import Link from "next/link"; -import { Check, Copy, Download } from "lucide-react"; -import { useState } from "react"; -import { BasePage } from "@/app/base-page"; -import { Button } from "@/components/ui/button"; -import { Card } from "@/components/ui/card"; -import { Separator } from "@/components/ui/separator"; -import { cn } from "@/utils/ui"; - -function downloadAsset(src: string) { - const filename = src.split("/").pop() ?? "asset.svg"; - const a = document.createElement("a"); - a.href = src; - a.download = filename; - a.click(); -} - -async function copyAsset(src: string) { - const res = await fetch(src); - const text = await res.text(); - await navigator.clipboard.writeText(text); -} - -const ALL_ASSETS = () => ASSET_SECTIONS.flatMap((s) => s.assets); - -type AssetTheme = "dark" | "light" | "icon"; - -interface AssetVariant { - src: string; - theme: AssetTheme; - label: string; - width: number; - height: number; -} - -interface AssetSection { - title: string; - description: string; - cols: "1" | "2"; - assets: AssetVariant[]; -} - -const ASSET_SECTIONS: AssetSection[] = [ - { - title: "Symbol", - description: - "Use the symbol on its own when the OpenCut name is already present nearby or space is limited.", - cols: "2", - assets: [ - { - src: "/logos/opencut/symbol.svg", - theme: "dark", - label: "Symbol", - width: 400, - height: 400, - }, - { - src: "/logos/opencut/symbol-light.svg", - theme: "light", - label: "Symbol", - width: 400, - height: 400, - }, - ], - }, - { - title: "Lockup", - description: - "The full lockup combines the symbol and wordmark. Prefer this in most contexts where you have enough horizontal space.", - cols: "2", - assets: [ - { - src: "/logos/opencut/logo.svg", - theme: "dark", - label: "Logo", - width: 1809, - height: 400, - }, - { - src: "/logos/opencut/logo-light.svg", - theme: "light", - label: "Logo", - width: 1809, - height: 400, - }, - { - src: "/logos/opencut/text.svg", - theme: "dark", - label: "Text", - width: 1760, - height: 400, - }, - { - src: "/logos/opencut/text-light.svg", - theme: "light", - label: "Text", - width: 1760, - height: 400, - }, - ], - }, -]; - -export default function BrandPage() { - return ( - - Download OpenCut brand assets for use in your projects.{" "} - - document - .getElementById("guidelines") - ?.scrollIntoView({ behavior: "smooth" }) - } - > - Read the brand guidelines. - - - } - action={ - - } - > -
- {ASSET_SECTIONS.map((section) => ( -
-
-

{section.title}

-

- {section.description} -

-
-
- {section.assets.map((variant) => ( - - ))} -
-
- ))} -
- - - -
-
-

Usage

-

- OpenCut is open source — the code is free to use under its license. - That license does not cover the name or logo. You can say you use - OpenCut, that your project integrates with OpenCut, or that it was - built on top of OpenCut. You cannot name your product OpenCut, imply - we made or endorse your product, or use the marks commercially - without asking first. For anything unclear, reach out at{" "} - - brand@opencut.app - - . -

-
- -
-

What's not allowed

-
    - {[ - "Using OpenCut in the name of your product, service, or domain.", - "Implying that OpenCut made, sponsors, or endorses your work.", - "Using the logo or name on merchandise or commercial marketing.", - "Modifying the marks.", - ].map((item) => ( -
  • - - - {item} -
  • - ))} -
-
-
-
- ); -} - -const CHECKER_STYLES: Record<"dark" | "light", CSSProperties> = { - light: { - backgroundImage: - "linear-gradient(45deg, #292929 25%, transparent 25%), linear-gradient(-45deg, #292929 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #292929 75%), linear-gradient(-45deg, transparent 75%, #292929 75%)", - backgroundSize: "18px 18px", - backgroundPosition: "0 0, 0 9px, 9px -9px, -9px 0px", - backgroundColor: "#000", - }, - dark: { - backgroundImage: - "linear-gradient(45deg, #e0e0e0 25%, transparent 25%), linear-gradient(-45deg, #e0e0e0 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #e0e0e0 75%), linear-gradient(-45deg, transparent 75%, #e0e0e0 75%)", - backgroundSize: "18px 18px", - backgroundPosition: "0 0, 0 9px, 9px -9px, -9px 0px", - backgroundColor: "#f5f5f5", - }, -}; - -function AssetCard({ variant }: { variant: AssetVariant }) { - const [copied, setCopied] = useState(false); - - async function handleCopy() { - await copyAsset(variant.src); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - } - - return ( - -
- {variant.label} -
- - -
- ); -} diff --git a/apps/web/src/app/changelog/[version]/page.tsx b/apps/web/src/app/changelog/[version]/page.tsx deleted file mode 100644 index 6c529ce1..00000000 --- a/apps/web/src/app/changelog/[version]/page.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { notFound } from "next/navigation"; -import { BasePage } from "@/app/base-page"; -import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react"; -import { getReleaseByVersion, getSortedReleases } from "@/changelog/utils"; -import { - ReleaseArticle, - ReleaseMeta, - ReleaseTitle, - ReleaseDescription, - ReleaseChanges, -} from "@/changelog/components/release"; -import { CopyMarkdownButton } from "@/changelog/components/copy-markdown-button"; - -type Props = { params: Promise<{ version: string }> }; - -export async function generateStaticParams() { - return getSortedReleases().map((release) => ({ version: release.version })); -} - -export async function generateMetadata({ params }: Props): Promise { - const { version } = await params; - const release = getReleaseByVersion({ version }); - if (!release) return {}; - return { - title: `${release.title} (${release.version}) - OpenCut Changelog`, - description: release.description, - }; -} - -export default async function ReleaseDetailPage({ params }: Props) { - const { version } = await params; - const releases = getSortedReleases(); - const index = releases.findIndex((entry) => entry.version === version); - if (index === -1) notFound(); - const release = releases[index]; - const newer = index > 0 ? releases[index - 1] : null; - const older = index < releases.length - 1 ? releases[index + 1] : null; - - return ( - -
- - - All releases - - - -
-
- - -
- {release.title} - {release.description && ( - {release.description} - )} -
- -
- - -
-
- ); -} diff --git a/apps/web/src/app/changelog/page.tsx b/apps/web/src/app/changelog/page.tsx deleted file mode 100644 index 25ae25db..00000000 --- a/apps/web/src/app/changelog/page.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import type { Metadata } from "next"; -import { BasePage } from "@/app/base-page"; -import { Separator } from "@/components/ui/separator"; -import { - type Release as ReleaseType, - getSortedReleases, -} from "@/changelog/utils"; -import { - ReleaseArticle, - ReleaseMeta, - ReleaseTitle, - ReleaseDescription, - ReleaseChanges, -} from "@/changelog/components/release"; - -export const metadata: Metadata = { - title: "Changelog - OpenCut", - description: "What's new in OpenCut", - openGraph: { - title: "Changelog - OpenCut", - description: "Every update, improvement, and fix to OpenCut — documented.", - type: "website", - images: [ - { - url: "/open-graph/changlog.jpg", - width: 1200, - height: 630, - alt: "OpenCut Changelog", - }, - ], - }, - twitter: { - card: "summary_large_image", - title: "Changelog - OpenCut", - description: "What's new in OpenCut", - images: ["/open-graph/changlog.jpg"], - }, -}; - -export default function ChangelogPage() { - const releases = getSortedReleases(); - - return ( - -
-
-
- -
- {releases.map((release, releaseIndex) => ( -
- - {releaseIndex < releases.length - 1 && ( - - )} -
- ))} -
-
-
- - ); -} - -function ReleaseEntry({ release }: { release: ReleaseType }) { - return ( - - -
- - {release.title} - - {release.description && ( - {release.description} - )} -
- -
- ); -} diff --git a/apps/web/src/app/contributors/page.tsx b/apps/web/src/app/contributors/page.tsx deleted file mode 100644 index f4d13732..00000000 --- a/apps/web/src/app/contributors/page.tsx +++ /dev/null @@ -1,242 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; -import { GitHubContributeSection } from "@/components/gitHub-contribute-section"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { Card, CardContent } from "@/components/ui/card"; -import { EXTERNAL_TOOLS } from "@/site/external-tools"; -import { BasePage } from "../base-page"; - -export const metadata: Metadata = { - title: "Contributors - OpenCut", - description: - "Meet the amazing people who contribute to OpenCut, the free and open-source video editor.", - openGraph: { - title: "Contributors - OpenCut", - description: - "Meet the amazing people who contribute to OpenCut, the free and open-source video editor.", - type: "website", - }, -}; - -interface Contributor { - id: number; - login: string; - avatar_url: string; - html_url: string; - contributions: number; - type: string; -} - -async function getContributors(): Promise { - try { - const response = await fetch( - "https://api.github.com/repos/OpenCut-app/OpenCut/contributors?per_page=100", - { - headers: { - Accept: "application/vnd.github.v3+json", - "User-Agent": "OpenCut-Web-App", - }, - next: { revalidate: 600 }, // 10 minutes - }, - ); - - if (!response.ok) { - console.error("Failed to fetch contributors"); - return []; - } - - const contributors = (await response.json()) as Contributor[]; - - const filteredContributors = contributors.filter( - (contributor) => contributor.type === "User", - ); - - return filteredContributors; - } catch (error) { - console.error("Error fetching contributors:", error); - return []; - } -} - -export default async function ContributorsPage() { - const contributors = await getContributors(); - const topContributors = contributors.slice(0, 2); - const otherContributors = contributors.slice(2); - const totalContributions = contributors.reduce( - (sum, c) => sum + c.contributions, - 0, - ); - - return ( - -
- - -
- -
- {topContributors.length > 0 && ( - - )} - {otherContributors.length > 0 && ( - - )} - - -
-
- ); -} - -function StatItem({ value, label }: { value: number; label: string }) { - return ( -
-
- {value} - {label} -
- ); -} - -function TopContributorsSection({ - contributors, -}: { - contributors: Contributor[]; -}) { - return ( -
-
-

Top contributors

-

- Leading the way in contributions -

-
- -
- {contributors.map((contributor) => ( - - ))} -
-
- ); -} - -function TopContributorCard({ contributor }: { contributor: Contributor }) { - return ( - - - - - - - {contributor.login.charAt(0).toUpperCase()} - - -
-

{contributor.login}

-
- {contributor.contributions} - contributions -
-
-
-
- - ); -} - -function AllContributorsSection({ - contributors, -}: { - contributors: Contributor[]; -}) { - return ( -
-
-

All contributors

-

- Everyone who makes OpenCut better -

-
- -
- {contributors.map((contributor) => ( - -
- - - - {contributor.login.charAt(0).toUpperCase()} - - -
-

{contributor.login}

-

- {contributor.contributions} -

-
-
- - ))} -
-
- ); -} - -function ExternalToolsSection() { - return ( -
-
-

External tools

-

Tools we use to build OpenCut

-
- -
- {EXTERNAL_TOOLS.map((tool, index) => ( - - - - -
-

{tool.name}

-

- {tool.description} -

-
-
-
- - ))} -
-
- ); -} diff --git a/apps/web/src/app/editor/[project_id]/page.tsx b/apps/web/src/app/editor/[project_id]/page.tsx deleted file mode 100644 index b3d40a37..00000000 --- a/apps/web/src/app/editor/[project_id]/page.tsx +++ /dev/null @@ -1,200 +0,0 @@ -"use client"; - -import { useParams } from "next/navigation"; -import { - ResizablePanelGroup, - ResizablePanel, - ResizableHandle, -} from "@/components/ui/resizable"; -import { AssetsPanel } from "@/components/editor/panels/assets"; -import { PropertiesPanel } from "@/components/editor/panels/properties"; -import { Timeline } from "@/timeline/components"; -import { PreviewPanel } from "@/preview/components"; -import { EditorHeader } from "@/components/editor/editor-header"; -import { EditorProvider } from "@/components/providers/editor-provider"; -import { Onboarding } from "@/components/editor/onboarding"; -import { MigrationDialog } from "@/project/components/migration-dialog"; -import { usePanelStore } from "@/editor/panel-store"; -import { usePasteMedia } from "@/media/use-paste-media"; -import { MobileGate } from "@/components/editor/mobile-gate"; -import { useMemo, useState } from "react"; -import { useEditor } from "@/editor/use-editor"; -import { Cancel01Icon } from "@hugeicons/core-free-icons"; -import { HugeiconsIcon } from "@hugeicons/react"; -import { Button } from "@/components/ui/button"; -import { ChangelogNotification } from "@/changelog/components/changelog-notification"; -import { - createPreviewOverlayControl, - isPreviewOverlayVisible, - mergePreviewOverlaySources, -} from "@/preview/overlays"; -import { usePreviewStore } from "@/preview/preview-store"; -import { getGuidePreviewOverlaySource } from "@/guides"; -import { - bookmarkNotesPreviewOverlay, - getBookmarkPreviewOverlaySource, -} from "@/timeline/bookmarks/index"; - -export default function Editor() { - const params = useParams(); - const projectId = params.project_id as string; - - return ( - - -
- - -
- -
- - - -
-
-
- ); -} - -function DegradedRendererBanner() { - const isDegraded = useEditor((e) => e.renderer.isDegraded); - const [dismissed, setDismissed] = useState(false); - if (!isDegraded || dismissed) return null; - - return ( -
- For the best experience, open OpenCut in Chrome. - -
- ); -} - -function EditorLayout() { - usePasteMedia(); - const { panels, setPanel } = usePanelStore(); - const activeScene = useEditor((editor) => - editor.scenes.getActiveSceneOrNull(), - ); - const currentTime = useEditor((editor) => editor.playback.getCurrentTime()); - const activeGuide = usePreviewStore((state) => state.activeGuide); - const overlays = usePreviewStore((state) => state.overlays); - const setOverlayVisibility = usePreviewStore( - (state) => state.setOverlayVisibility, - ); - const showBookmarkNotes = isPreviewOverlayVisible({ - overlay: bookmarkNotesPreviewOverlay, - overlays, - }); - - const overlaySource = useMemo( - () => - mergePreviewOverlaySources({ - sources: [ - getGuidePreviewOverlaySource({ - guideId: activeGuide, - }), - activeScene - ? getBookmarkPreviewOverlaySource({ - bookmarks: activeScene.bookmarks, - time: currentTime, - isVisible: showBookmarkNotes, - }) - : { - definitions: [bookmarkNotesPreviewOverlay], - instances: [], - }, - ], - }), - [activeGuide, activeScene, currentTime, showBookmarkNotes], - ); - - const overlayControls = useMemo( - () => - overlaySource.definitions.map((overlay) => - createPreviewOverlayControl({ overlay, overlays }), - ), - [overlaySource.definitions, overlays], - ); - - return ( - { - setPanel("mainContent", sizes[0] ?? panels.mainContent); - setPanel("timeline", sizes[1] ?? panels.timeline); - }} - > - - { - setPanel("tools", sizes[0] ?? panels.tools); - setPanel("preview", sizes[1] ?? panels.preview); - setPanel("properties", sizes[2] ?? panels.properties); - }} - > - - - - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css deleted file mode 100644 index 36417e15..00000000 --- a/apps/web/src/app/globals.css +++ /dev/null @@ -1,291 +0,0 @@ -@import "tailwindcss"; - -/* Custom variant for dark mode */ -@custom-variant dark (&:where(.dark, .dark *)); - -/* Plugins */ -@plugin "@tailwindcss/typography"; -@plugin "tailwindcss-animate"; - -:root { - --background: hsl(0, 0%, 100%); - --foreground: hsl(0 0% 11%); - --card: hsl(0, 0%, 100%); - --card-foreground: hsl(0 0% 11%); - --popover: hsl(0, 0%, 100%); - --popover-hover: hsl(0, 0%, 96%); - --popover-foreground: hsl(0 0% 2%); - --primary: hsl(200, 90%, 52%); - --primary-foreground: hsl(0, 0%, 100%); - --secondary: hsl(204, 100%, 97%); - --secondary-border: hsl(204, 100%, 94%); - --secondary-foreground: hsl(200, 98%, 39%); - --muted: hsl(0 0% 85.1%); - --muted-foreground: hsl(0 0% 50%); - --accent: hsl(0, 0%, 96%); - --accent-foreground: hsl(0 0% 2%); - --destructive: hsl(0, 83%, 50%); - --destructive-foreground: hsl(0, 0%, 100%); - --constructive: hsl(141, 71%, 48%); - --constructive-foreground: hsl(0, 0%, 100%); - --caution: hsl(38, 92%, 50%); - --caution-foreground: hsl(0, 0%, 10%); - --border: hsl(0 0% 91%); - --input: hsl(0, 0%, 100%); - --ring: hsl(0, 0%, 55%); - --chart-1: hsl(220 70% 50%); - --chart-2: hsl(160 60% 45%); - --chart-3: hsl(30 80% 55%); - --chart-4: hsl(280 65% 60%); - --chart-5: hsl(340 75% 55%); - --sidebar-background: hsl(0 0% 96.1%); - --sidebar-foreground: hsl(0 0% 2%); - --sidebar-primary: hsl(0 0% 2%); - --sidebar-primary-foreground: hsl(0 0% 91%); - --sidebar-accent: hsl(0 0% 85.1%); - --sidebar-accent-foreground: hsl(0 0% 2%); - --sidebar-border: hsl(0 0% 85.1%); - --sidebar-ring: hsl(0 0% 16.9%); - --sidebar: hsl(0 0% 98%); -} - -.panel { - --background: hsl(210, 20%, 98%); - --foreground: hsl(0 0% 13%); - --card: hsl(0, 0%, 98%); - --card-foreground: hsl(0 0% 13%); - --primary-foreground: hsl(0, 0%, 98%); - --secondary: hsl(204, 100%, 95%); - --secondary-border: hsl(204, 100%, 92%); - --secondary-foreground: hsl(200, 98%, 37%); - --muted: hsl(0 0% 83.1%); - --muted-foreground: hsl(0 0% 48%); - --accent: hsl(0, 0%, 93%); - --accent-foreground: hsl(0 0% 5%); - --destructive-foreground: hsl(0, 0%, 98%); - --constructive-foreground: hsl(0, 0%, 98%); - --border: hsl(0 0% 87%); - --input: hsl(0 0% 93%); - --ring: hsl(0, 0%, 53%); -} - -.dark { - --background: hsl(0, 0%, 5%); - --foreground: hsl(0 0% 87%); - --card: hsl(0, 0%, 5%); - --card-foreground: hsl(0 0% 87%); - --popover: hsl(0, 0%, 5%); - --popover-hover: hsl(0, 0%, 13%); - --popover-foreground: hsl(0 0% 95%); - --secondary: hsl(204, 100%, 12%); - --secondary-border: hsl(204, 100%, 15%); - --secondary-foreground: hsl(200, 98%, 61%); - --muted: hsl(0 0% 20%); - --accent: hsl(0, 0%, 14%); - --accent-foreground: hsl(0 0% 95%); - --border: hsl(0 0% 16%); - --input: hsl(0 0% 5%); - --ring: hsl(0, 0%, 50%); - --caution: hsl(38, 92%, 60%); - --caution-foreground: hsl(0, 0%, 10%); - --sidebar-background: hsl(0 0% 8%); - --sidebar-foreground: hsl(0 0% 95%); - --sidebar-primary: hsl(0 0% 95%); - --sidebar-primary-foreground: hsl(0 0% 15%); - --sidebar-accent: hsl(0 0% 20%); - --sidebar-accent-foreground: hsl(0 0% 95%); - --sidebar-border: hsl(0 0% 20%); - --sidebar-ring: hsl(0 0% 83.1%); - --sidebar: hsl(0 0% 6%); -} - -.dark .panel { - --background: hsl(0 0% 10%); - --foreground: hsl(0 0% 85%); - --card: hsl(0, 0%, 10%); - --card-foreground: hsl(0 0% 85%); - --secondary: hsl(204, 67%, 9%); - --secondary-border: hsl(204, 100%, 14%); - --secondary-foreground: hsl(200, 98%, 63%); - --muted: hsl(0 0% 22%); - --accent: hsl(0, 0%, 15%); - --accent-foreground: hsl(0 0% 93%); - --border: hsl(0 0% 18%); - --input: hsl(0 0% 22%); - --ring: hsl(0, 0%, 52%); -} - -@layer base { - /* - The default border color has changed to `currentcolor` in Tailwind CSS v4, - so we've added these compatibility styles to make sure everything still - looks the same as it did with Tailwind CSS v3. - - If we ever want to remove these styles, we need to add an explicit border - color utility to any element that depends on these defaults. - */ - *, - ::after, - ::before, - ::backdrop, - ::file-selector-button { - border-color: var(--color-gray-200, currentcolor); - } - /* Other default base styles */ - * { - @apply border-border; - } - body { - @apply bg-background text-foreground; - /* Prevent back/forward swipe */ - overscroll-behavior-x: contain; - } - ::selection { - @apply bg-primary/35 selection:text-primary-foreground; - } -} - -@theme inline { - /* Responsive breakpoints */ - --breakpoint-xs: 30rem; - - /* Typography */ - --font-sans: var(--font-inter), sans-serif; - - /* Font sizes */ - --text-xs: 0.72rem; - --text-sm: 0.79rem; - --text-base: 0.92rem; - --text-base--line-height: calc(1.5 / 0.95); - --text-xs--line-height: calc(1 / 0.8); - - /* Border radius */ - --radius-lg: 0.82rem; - --radius-md: 0.65rem; - --radius-sm: 0.35rem; - - /* Palette mapped to root design tokens */ - --color-background: var(--background); - --color-foreground: var(--foreground); - - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - - --color-popover: var(--popover); - --color-popover-hover: var(--popover-hover); - --color-popover-foreground: var(--popover-foreground); - - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-border: var(--secondary-border); - --color-secondary-foreground: var(--secondary-foreground); - - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); - - --color-constructive: var(--constructive); - --color-constructive-foreground: var(--constructive-foreground); - - --color-caution: var(--caution); - --color-caution-foreground: var(--caution-foreground); - - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - - /* Chart colors */ - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - - /* Sidebar */ - --color-sidebar: var(--sidebar-background); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); - - /* Animations */ - --animate-accordion-down: accordion-down 0.2s ease-out; - --animate-accordion-up: accordion-up 0.2s ease-out; - - @keyframes accordion-down { - from { - height: 0; - } - to { - height: var(--radix-accordion-content-height); - } - } - - @keyframes accordion-up { - from { - height: var(--radix-accordion-content-height); - } - to { - height: 0; - } - } -} - -@utility scrollbar-hidden { - -ms-overflow-style: none; - scrollbar-width: none; - &::-webkit-scrollbar { - display: none; - } -} - -@utility scrollbar-x-hidden { - -ms-overflow-style: none; - scrollbar-width: none; - &::-webkit-scrollbar:horizontal { - display: none; - } -} - -@utility scrollbar-y-hidden { - -ms-overflow-style: none; - scrollbar-width: none; - &::-webkit-scrollbar:vertical { - display: none; - } -} - -@utility scrollbar-thin { - &::-webkit-scrollbar { - width: 7px; - height: 7px; - } - &::-webkit-scrollbar-track { - background: transparent; - } - &::-webkit-scrollbar-thumb { - background: var(--border); - border-radius: 4px; - } - &::-webkit-scrollbar-thumb:hover { - background: var(--muted-foreground); - } -} - -@layer base { - * { - @apply border-border outline-ring/50; - } - body { - @apply bg-background text-foreground; - } -} diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx deleted file mode 100644 index 558ae538..00000000 --- a/apps/web/src/app/layout.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { ThemeProvider } from "next-themes"; -import Script from "next/script"; -import "./globals.css"; -import { Toaster } from "../components/ui/sonner"; -import { ChangelogNotification } from "@/changelog/components/changelog-notification"; -import { TooltipProvider } from "../components/ui/tooltip"; -import { baseMetaData } from "./metadata"; -import { BotIdClient } from "botid/client"; -import { webEnv } from "@/env/web"; -import { Inter } from "next/font/google"; - -const siteFont = Inter({ subsets: ["latin"] }); - -export const metadata = baseMetaData; - -const protectedRoutes = [ - { - path: "/none", - method: "GET", - }, -]; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - - {process.env.NODE_ENV === "development" && ( - <> -